3.6 다중 레이블 분류
이진 레이블이 여러 개일 때의 분류를 다중 레이블 분류라고 한다.
mnist에서 숫자가 7이상인지와 홀수인지를 학습하는 분류기를 만들어보자.
다중 분류기를 지원하는 KNeighborsClassifier를 사용.
from sklearn.neighbors import KNeighborsClassifier
y_train_large = (y_train>=7)
y_train_odd = (y_train%2==1)
y_multilabel = np.c_[y_train_large, y_train_odd]
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_multilabel)
손글씨 5를 7미만이고 홀수라는 것을 예측했다.
knn_clf.predict([some_digit])
#array([[False, True]])
<다중 레이블 분류기의 평가>
앞서 다뤘던 분류기의 평가 지표들을 사용하던지 방법은 아주 많다.
예를 들어 각 레이블의 f1 점수를 구하고 그 평균을 사용해도 좋다. f1_score함수의 average옵션을 macro로 주면 f1들의 단순 산술평균값을 계산해준다.
y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=3)
f1_score(y_multilabel, y_train_knn_pred, average='macro')
레이블 마다 샘플 수(true인 것의 수)가 다른 경우가 많을 것이다. 위의 경우도 홀수 레이블이 큰수 레이블보다 샘플 수가 많을 것. 이 때 샘플 수가 많은 것에 가중치를 주고 싶다면 average='weighted'옵션을 주면 된다.
(레이블 마다의 샘플 수를 지지도support라고 한다)
3.7 다중 출력 분류
다중 출력 다중 클래스 분류라고도 한다. 한 레이블이 다중 클래스가 될 수 있도록 일반화한 것.
mnist셋에서 이미지의 잡음을 제거하는 시스템을 만들어보자. 입력이 들어올 때 출력(라벨)이 입력과 같은 형태(각 요소가 0-255인 크기 784인 배열)일 것이다. 역시 KNeighborsClassifier사용.
기존 입력 데이터셋에 노이즈를 추가해서 새로운 입력 데이터를 만들고, 기존 입력 데이터로 라벨을 만든다.
noise = np.random.randint(0,100,(len(X_Train)), 784)
X_train_mod = X_train + noise
noise = np.random.randint(0,100,(len(X_test)), 784)
X_test_mod = X_test + noise
y_train_mod = X_train
y_test_mod = X_test
KNeighborsClassifier로 훈련시켜서 test셋의 맨 처음 요소의 예측값을 확인해보자. 타깃 레이블과 매우 유사하다.
knn_clf.fit(X_train_mod, y_train_mod)
clean_digit = knn_clf.predict([X_test_mod[some_index]])
plot_digit(clean_digit)
'ML&DATA > 핸즈온 머신러닝' 카테고리의 다른 글
4 - 선형회귀 (경사하강법) (0) | 2020.09.04 |
---|---|
4 - 선형 회귀 (정규방정식) (0) | 2020.09.04 |
3 - 에러분석 (0) | 2020.08.27 |
3 - 다중분류 (0) | 2020.08.27 |
3 - 분류기의 성능 측정 (0) | 2020.08.25 |