2021-10-31
Author: 98hyun
Published: 2021-11-01
computer vision
pytorch는 tensorflow와 함께 손에꼽는 유명한 deep learning framework이다. 그 중 deep learning에서 가장 발전이 많이 된 영역인 computer vision tip을 가져왔다. 이번 영역은 어느정도 python을 다룰줄 아는 사람한테 유익할 수도 있다. 너무 초보단계라면 한번 무엇인지만 보면 된다.
이 링크는 pytorch와 tensorflow를 통해 이미지 분류를 하는 코드를 정리했다. 아래 팁은 이미지 문제에 접근 할 때 혹은 딥러닝을 할 때 프레임워크들의 접근 방식이다.
접근 tip
## 공통 형태. ## 1. library 불러오기 ## 2. parameter 및 변수 정리 ## 3. train, target 나누기 ## 4. 검증 및 테스트 데이터 만들기 ( transform 하려면 하기. ) ## 5. 모델 및 optimizer, loss 등 정의하기 ## 6. 훈련 및 결과 보기 ## 1. tabular 형태의 픽셀 데이터 ## 차원만 신경써서 데이터셋을 만들어주면 된다. ## Dataset으로 만든 후, DataLoader로 변환. ## 2. 이미지 데이터 ## 이미지 폴더 경로에 신경쓴다. ## dataframe의 형태는 file path, category다.
이상치 제거
이상치 제거를 하는 방법은 여러가지가 있는데 그 중 Tukey Fences 방법을 소개한다. Tukey Fences는 쉽게 말해 IQR방법이다. IQR은 전체값의 기준으로 25% 값과 75% 값 사이의 값들만 사용하는것이다.
아래 코드는 데이터 프레임과 columns, n을 넣으면 이상치 행이 제거된 데이터프레임을 반환한다. 여기서 n은 행에 이상치가 n개 있을 때의 제거한다는 뜻의 n이다.
code
def detect_outliers(df,n,features): """ Takes a dataframe df of features and returns a list of the indices corresponding to the observations containing more than n outliers according to the Tukey method. """ outlier_indices = [] # iterate over features(columns) for col in features: # 1st quartile (25%) Q1 = np.percentile(df[col], 25) # 3rd quartile (75%) Q3 = np.percentile(df[col],75) # Interquartile range (IQR) IQR = Q3 - Q1 # outlier step outlier_step = 1.5 * IQR # Determine a list of indices of outliers for feature col outlier_list_col = df[(df[col] < Q1 - outlier_step) | (df[col] > Q3 + outlier_step )].index # append the found outlier indices for col to the list of outlier indices outlier_indices.extend(outlier_list_col) # select observations containing more than 2 outliers outlier_indices = Counter(outlier_indices) multiple_outliers = list( k for k, v in outlier_indices.items() if v > n ) return multiple_outliers
결측값 처리
결측치 처리 방법에는 여러 방법이 있다. 평균대체, 회귀대체 등 여기서는 중앙값대체 방법을 보여준다. 여기서 중앙값의 특징으로는 이상치의 영향을 덜 받는다는 효과가 있다.
이해하기 쉽게, 1 1 1 100이 있을 때 대표값으로 25(평균), 1(중앙값) 중 어떤게 위의 데이터를 잘 표현한다고 할 수 있을까? 1이다. 저건 극단적으로 했지만, 세상엔 더한 데이터들이 많다. 논리적 근거로 채우는게 맞고, 모르면 버려도 괜찮지만, 만약 그렇게 못해서 채워야한다면 중앙값이 평균보다 더 좋다고 알려져 있다.
code
## 결측값 처리 방법 ## 특정 열의 결측값들인 행들을 가져와서 print(data['Age'].isna().sum()) index_NaN_age = list(data["Age"][data["Age"].isnull()].index) ## loop를 돌며 결측값이라면 주변 열의 데이터와 비슷한 데이터들만 모아서 중앙값으로 채운다. ## 다만 그런 데이터 프레임이 없을 때 단순히 전체 데이터의 중앙값으로 채운다. for i in index_NaN_age : age_med = data["Age"].median() age_pred = data["Age"][((data['SibSp'] == data.iloc[i]["SibSp"]) & (data['Parch'] == data.iloc[i]["Parch"]) & (data['Pclass'] == data.iloc[i]["Pclass"]))].median() if not np.isnan(age_pred) : # 결측값을 확인할 때. data['Age'].iloc[i] = age_pred else : data['Age'].iloc[i] = age_med print(data['Age'].isna().sum())
Seaborn
Seaborn 은 파이썬 시각화 라이브러리다. 간단한 코드 몇줄로 깔끔한 차트를 보여줄 수 있다.
code
## sns.catplot 사용법 ## category를 나눠서 시각화하고 싶을 때 data,x,y,kind를 정해줄것. sns.catplot(data=data,x='Embarked',y='Survived',kind='bar') ## Survived가 0,1로 되어있어있다. ## bar에 세로줄은 S인 것들에 0,1의 추정치와 불확실성을 보여준다. g=sns.FacetGrid(data=data,col='Survived',row='Embarked') ## 똑같이 data,col,row 이런식으로 주고 현재 가로는 Survived,세로는 Embarked g.map(sns.scatterplot,'Age','Fare','Sex') g.add_legend() ## mapping 한다. sns.scatterplot을 ## scatterplot은 x='Age',y='Fare',hue='Sex' 이 순서는 인자를 주지않고 sns.scatterplot순서대로 ## 처음 간단하게만 볼때만 사용. ## 1. countplot ## 특정 조건에 만족하는 행들의 수를 보여주는 ## 데이터 균형 정도를 확인하는데 쓰면 좋을 것 같다. ## data와 x만 필요하다. ## 2. point,bar plot ## 위에서 보여준 차트로, estimate 추정할 때 사용. ## 보통 예측값이 카테고리 일 때 사용하면 좋을 것 같다. ## seaborn 특징. ## data : dataframe. ## x,y : 가로,세로에 변수 이름을 문자열로 넣는다. ## hue : hue가 있다면 hue는 data로 나눠주는 것이다. (안에서 나누기) ## col : col이 있다면 col은 figure로 나눠주는 것이다. (밖에서 나누기) ## 좀 꼬아져있는데 sns.boxplot은 ax가 가능하고, sns.catplot은 ax가 안된다. ## facetgrid 때문인것 같다. ## facetgrid ## matplotlib의 subplots 느낌. figure를 나눠주는 느낌. ## 그래서 catplot은 facetgrid를 return한다. ## 즉, g=sns.catplot(..) 후에 g.set_xlabels(..)로 덧붙인다.