ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • sklearn, pandas, numpy를 활용한 데이터 전처리
    데이터분석 2019. 10. 14. 20:01

    sklearn, pandas, numpy를 활용하여 데이터 전처리를 진행합니다.

     

    01. 누락값 대체

    사이킷런의 SimpleImputer 클래스를 활용하면 누락값을 간편하게 처리할 수 있습니다. 한 번 학습된 Imputer는 새로운 데이터 셋에 대해서도 동일하게 처리를 해주어 편리합니다. train set 기준의 평균, 중간값 또는 최빈값으로 새로운 데이터의 null값을 채웁니다.

     

    import numpy as np
    from sklearn.impute import SimpleImputer
    
    # 각 열에서의 최빈값으로 null을 대체
    # 대체 전략은 mean, median, most_frequent 가 가능함
    ipt = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
    
    # dataframe의 values 속성은 numpy array를 반환
    ipt = ipt.fit(mydf.values)
    train_n = ipt.transform(mydf.values)

     

     

    02. 범주형 데이터 처리

    2.1 직접 맵핑

    범주형 데이터를 숫자로 직접 매핑하는 방법입니다.

    import numpy as np
    import pandas as pd
    
    # 직접 mapping dict를 생성
    mymap = {
    	'A':1,
        'B':2,
        'C':3
    }
    
    # dataframe에 적용
    mydf['mycol'] = mydf['mycol'].map(mymap)
    
    # mapping 전으로 되돌리는 방법
    mydf['mycol'] = mydf['mycol'].map({v: k for k, v in mymap.items()})
    
    # 0부터 차례대로 mapping하는 dict 생성
    mymap2 = { v: i for i, v in enumerate(np.unique(mydf['mycol']))}

     

    2.2 sklearn 활용

    다른 방법으로, sklearn의 LabelEncoder 클래스를 활용해 매핑할 수 있습니다.

    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder()
    le = le.fit(mydf['mycol'].values)
    mydf_n = le.transform(mydf['mycol'].values)
    
    # 원래대로 복원
    mydf_n2 = le.inverse_transform(mydf_n)

     

    2.3 one-hot encoding

    순서가 없는 범주형 데이터에 대해서는 서로간의 연관관계를 없애기 위해 one-hot encoding을 적용합니다.

    from sklearn.preprocessing import OneHotEncoder
    ohe = OneHotEncoder(categories='auto')
    mydf_n = ohe.fit_transform(mydf)
    
    # default return이 sparse matrix이므로, 내용을 보기위해서 toarray() 메서드 사용
    mydf_n.toarray()

    pandas의 get_dummies() 함수를 활용해서 변환할 수도 있습니다.

    import pandas as pd
    
    # drop_first 매개변수를 활용하여, 첫번째 열을 삭제할 수 있음
    pd.get_dummies(mydf['mycol'], drop_first=True)

     

    03. Scale 조정

    tree 계열을 제외한 대부분의 ml 알고리즘 학습시, scale 조정을 필수적입니다. 주로 gradient descent 방식으로 최적화를 진행하므로, 스케일이 큰 차원에서의 변화가 스케일이 작은 차원의 최적화를 방해합니다.

     

    3.1 min-max scaling

    최대값과 최소값을 활용하여 전체 변수를 [0, 1]로 변환합니다.

    from sklearn.preprocessing import MinMaxScaler
    mms = MinMaxScaler()
    mydf_n = mms.fit_transform(mydf)

     

    3.2 표준화 변환

    평균과 표준편차를 활용하여 표준화하는 방법도 있습니다.

    from sklearn.preprocessing import StandardScaler
    ss = StandardScaler()
    mydf_n = ss.fit_transform(mydf)

     

    04. 특성 선택 (Feature Selection)

    너무 많은 변수로 모형을 적합하면, 다중공선성 등의 문제들이 발생할 수 있습니다. 적당한 숫자의 input변수를 활용하기 위해 특성 선택이 필요합니다.

     

     

    4.1 L1 Regularization

    모든 가중치의 합을 뜻하는 L1 규제는 뾰족한 다이아몬드의 한계선을 만들어 냅니다. 그러한 한계선 내에서 Loss 최소화를 진행하면, 보통 특정 축의 뾰족한 지점에서 교집합이 생성되므로, 값이 0이 되는 차원이 생성됩니다. 이러한 원리로 특성(차원)을 축소합니다.

     

    # sklearn으로 쉽게 l1 정규화 가능
    from sklearn.linear_model import LogisticRegression
    lr = LogisticRegression(penalty='l1', C=10)

     

    4.2 SBS(Sequential Backward Selection)

    가용 전체 항목으로 모형적합 후, 가장 유용한 변수부터 차례대로 선택하는 알고리즘입니다. 변수 한 개가 제외됐을 때, 가장 Loss가 크게 증가하는 변수를 차례대로 선택하는 과정을 반복합니다. 

     

    4.3 Feature Importance

    Tree 계열의 알고리즘은 Entrophy 기반의 특성 중요도를 계산합니다. 가장 상위 노드에 어떤 항목을 배치할 것인지 선정하기 위해서입니다. 그러므로 우선적으로 특성을 선정할 때, Feature Importance를 사용할 수 있습니다.

    from sklearn.ensemble import RandomForestClassifier
    rfc = RandomForestClassifier()
    rfc.fit(train, target)
    frc.feature_importances_

     

    4.4 Sklearn SelectFromModel

    sklearn의 SelectFromModel 클래스를 사용하면 손쉽게 특성을 선택할 수 있습니다.

    from sklearn.feature_selection import SelectFromModel
    sfm = SelectFromModel('feature_importances_')
    features_selected = sfm.transform(df_train)

     

     

    [위 내용은 머신러닝 교과서 with 파이썬, 사이킷런, 텐서플로(길벗) 내용을 읽고, 따로 정리한 것입니다.]

    '데이터분석' 카테고리의 다른 글

    배열 3차원 이상 곱셈  (380) 2019.10.16
    sklearn, numpy를 활용한 데이터 차원축소  (374) 2019.10.15
    sklearn basic 01  (0) 2019.10.10
    pandas groupby 활용하기  (1) 2019.10.10
    pandas 테이블 양식 수정하기  (0) 2019.10.10

    댓글

Designed by Tistory.