[Machine Learning with Python Cookbook] ch4. Numeric Data

4월 06, 2021





Summary

 정량적 데이터를 머신러닝에 알맞은 특성으로 변환하는 다양한 전략을 소개합니다.

    * 특성 스케일 바꾸기 (4.1)
        - 특성 배열의 scale 조정: sklearn의 MinMaxScaler 메서드 사용. 일반적으로 0 ~ 1이나 -1 ~ +1 사이로 조정.
         minmax_scale = sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1))
         minmax_scale.fit_transform(feature)
        - fit 메서드: 특성의 min, max 계산
        - transform 메서드: 특성의 scale 조정
        - training set와 test set의 scale을 따로 조정하면 안됨. 조정하고자 구한 min, max를 똑같이 사용해야함.
        - Neural network에는 min-max scaling을 권장함

    특성 표준화하기 (4.2)
        - 특성을 mean 0, std 1이 되도록 변환: sklearn의 StandardScaler 메서드 사용.
         scaler = sklearn.preprocessing.StandardScaler()
         standardized = scaler.fit_transform(feature)
        - 변환된 특성은 원본 값이 특성 평균에서 몇 표준편차만큼 떨어져 있는지 표현 (z-score)
        - PCA 분석은 표준화가 잘 맞음
        - 데이터에 이상치가 많다면 특성의 mean과 std에 영향을 미치므로 표준화에 부정적인 영향을 미침
        - 이런 경우 median과 IQR을 사용하여 scale 변환: sklearn의 RobustScaler 메서드 사용. 데이터에서 median 빼고 IQR로 나눔
         robust_scaler = sklearn.preprocessing.RobustScaler()
         robust_standardized = robust_scaler.fit_transform(feature)

    정규화하기 (4.3)
        - 샘플 특성값을 전체 길이가 1인 단위 norm이 되도록 변환: norm 매개변수와 함께 Normalizer 클래스 사용.
         normalizer = sklearn.preprocessing.Normalizer(norm='l2')
         normalizer.transform(feature)
        - 이런 종류의 scaling은 각 단어나 n개의 단어 그룹이 특성인 텍스트 분류와 같이, 유사한 특성이 많을 때 종종 사용
        - Normalizer는 세 가지 노름 옵션 제공
            1. L2 (유클리드 노름): default. 두 지점 사이를 잇는 직선 거리
            2. L1 (맨하튼 노름): 택시 노름. 두 지점 사이를 사람이 도보를 따라 걷는 것과 같음
            3. max: 각 행의 max로 행의 값을 나눔

    다항 특성과 교차항 특성 생성하기 (4.4)
        - 다항 특성 (polynominal): feature와 target 사이에 비선형 관계가 있다는 가정을 추가할 때 사용. feature x에 변동 효과를 주입함. 예) 주요 질병에 걸릴 확률에 나이가 미치는 영향
        - 교차항 (interaction): 한 feature의 효과가 다른 feature에 의존하는 경우 사용. 예) 설탕을 넣었는지 여부, 커피를 저었는지 여부 → 커피의 달달함
        - sklearn의 PolynomialFeatures 클래스 사용

    특성 변환하기 (4.5)
        - FunctionTransformer: 하나 이상의 특성에 사용자 정의 변환을 적용함.
         new_transformer = FunctionTransformer(new_function)
         new_transformer.transform(features)
        - pandas의 apply도 동일한 변환을 수행함
         df.apply(new_function)

    이상치
        - 이상치 감지하기: 1사분위보다 1.5IQR 이상 작은 값. 3사분위보다 1.5IQR 이상 큰 값. (4.6)
        - 이상치 다루기
            1. 이상치 삭제
             houses[houses['kitchen'] < 3]
            2. 이상치로 표시하고 특성의 하나로 포함시키기
             houses['outlier'] = np.where(houses['kitchen'] < 3, 0, 1)
            3. 이상치의 영향이 줄어들도록 특성을 변환하기
             houses['log_of_square_feet'] = [ np.log(x) for x in houses['square_feet'] ]

    특성 이산화하기 (4.8)
        - Binarizer: 임곗값에 따라 특성을 둘로 나누기
         binarizer = Binarizer(18)
         binarizer.fit_transform(age)
        - digitize: 수치 특성을 여러 임곗값에 따라 나누니
         np.digitize(age, bins=[20, 30, 64])


Code