7.2.2 다수결 투표 방식을 사용하여 예측 만들기
이제 이전 절에서 구현한 MajorityVoteClassifier 클래스를 사용하여 볼 차례입니다. 먼저 테스트를 위한 데이터셋을 준비하겠습니다. 앞서 CSV 파일에서 데이터셋을 읽는 것은 연습해 보았습니다. 여기서는 좀 더 간편한 방법인 사이킷런의 datasets 모듈을 사용하여 붓꽃 데이터셋을 읽어 보죠. 꽃받침 너비와 꽃잎 길이 두 개의 특성만 사용하여 예제를 구성해 보겠습니다. MajorityVoteClassifier 클래스를 다중 분류 문제에 적용할 수 있지만 나중에 ROC AUC를 계산하기 위해 Iris-versicolor와 Iris-virginica 클래스에 해당하는 샘플만 분류하겠습니다. 코드는 다음과 같습니다.11
>>> from sklearn import datasets
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.preprocessing import StandardScaler
>>> from sklearn.preprocessing import LabelEncoder
>>> iris = datasets.load_iris()
>>> X, y = iris.data[50:, [1, 2]], iris.target[50:]
>>> le = LabelEncoder()
>>> y = le.fit_transform(y)
Note ≡
사이킷런은 ROC AUC를 계산하기 위해 (가능하면) predict_proba 메서드를 사용합니다. 3장에서 로지스틱 회귀 모델의 클래스 확률이 어떻게 계산되는지 보았습니다. 결정 트리에서는 훈련할 때 각 노드에서 생성되는 빈도 벡터(frequency vector)로부터 확률을 계산합니다. 이 벡터는 노드의 클래스 레이블 빈도 값으로 채워집니다. 그다음 빈도 값의 합이 1이 되도록 정규화됩니다. 비슷하게 k-최근접 이웃 알고리즘에서도 클래스 레이블을 모아 정규화된 클래스 레이블의 빈도를 반환합니다.12 결정 트리와 k-최근접 이웃 분류기에서 반환되는 정규화된 확률이 로지스틱 회귀 모델에서 얻은 확률과 비슷하게 보입니다. 하지만 이들은 실제로 확률 질량 함수로부터 얻어진 것이 아님을 기억하세요.
11 역주 예제 붓꽃 데이터셋에는 setosa, versicolor, virginica 샘플이 순서대로 저장되어 있기 때문에 50번째 이후의 샘플만 추출했습니다. versicolor, virginica의 레이블은 각각 1, 2이기 때문에 LabelEncoder 클래스를 사용하여 0, 1로 변경합니다.
12 역주 결정 트리는 리프 노드의 클래스별 샘플 비율이 클래스 확률이 됩니다. 예를 들어 어떤 리프 노드의 클래스별 샘플 개수가 [10, 20, 70]이라면 이 리프 노드에 도달한 샘플의 클래스 확률은 [0.1, 0.2, 0.7]이 됩니다. k-최근접 이웃 분류기는 주어진 샘플의 최근접 이웃 클래스별 샘플 비율이 클래스 확률이 됩니다. 예를 들어 k = 5인 최근접 이웃 분류기에서 이웃한 샘플의 클래스별 빈도가 [1, 1, 3]이라면 이 샘플의 클래스 확률은 [0.2, 0.2, 0.6]이 됩니다.