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])