본문 바로가기
ML&DATA/핸즈온 머신러닝

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

by sun__ 2020. 8. 27.

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)

 

 

'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