ML&DATA/핸즈온 머신러닝

3 - 다중 레이블 분류, 다중 출력 분류

sun__ 2020. 8. 27. 12:20

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

some_digit, X[0]

 

<다중 레이블 분류기의 평가>

앞서 다뤘던 분류기의 평가 지표들을 사용하던지 방법은 아주 많다.

 

예를 들어 각 레이블의 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)