마지막으로 stratify=y를 통해 계층화(stratification) 기능을 사용합니다. 여기서 계층화는 train_test_split 함수가 훈련 데이터셋과 테스트 데이터셋의 클래스 레이블 비율을 입력 데이터셋과 동일하게 만든다는 의미입니다. 넘파이 bincount 함수를 사용하여 배열에 있는 고유한 값의 등장 횟수를 헤아릴 수 있습니다. 계층화가 잘 되었는지 확인해 보죠.
>>> print('y의 레이블 카운트:', np.bincount(y))
y의 레이블 카운트: [50 50 50]
>>> print('y_train의 레이블 카운트:', np.bincount(y_train))
y_train의 레이블 카운트: [35 35 35]
>>> print('y_test의 레이블 카운트:', np.bincount(y_test))
y_test의 레이블 카운트: [15 15 15]
2장 경사 하강법 예제에서 보았던 것처럼 많은 머신 러닝 알고리즘과 최적화 알고리즘은 최상의 성능을 위해 특성 스케일 조정이 필요합니다. 여기서는 사이킷런의 preprocessing 모듈의 StandardScaler 클래스를 사용하여 특성을 표준화하겠습니다.
>>> from sklearn.preprocessing import StandardScaler
>>> sc = StandardScaler()
>>> sc.fit(X_train)
>>> X_train_std = sc.transform(X_train)
>>> X_test_std = sc.transform(X_test)
앞 코드는 preprocessing 모듈에서 StandardScaler 클래스를 로드하고 새로운 StandardScaler 객체를 sc 변수에 할당합니다. StandardScaler의 fit 메서드는 훈련 데이터셋의 각 특성 차원마다 μ(샘플 평균)와 σ(표준 편차)를 계산합니다. transform 메서드를 호출하면 계산된 μ와 σ를 사용하여 훈련 데이터셋을 표준화합니다. 그다음 훈련 데이터셋과 테스트 데이터셋의 샘플이 서로 같은 비율로 이동되도록 동일한 μ와 σ를 사용하여 테스트 데이터셋을 표준화합니다.