Data Traveler
Tantum videmus quantum scimus

2021-10-31

Author: 98hyun

Published: 2021-11-01

Tags: 데이터분석 시각화 딥러닝

Share :


  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(..)로 덧붙인다.


Contact Form