njs03332 / ml_study

3 stars 0 forks source link

2022/04/07~2022/04/14 #25

Open njs03332 opened 2 years ago

njs03332 commented 2 years ago
danbi5228 commented 2 years ago

3.5 에러분석

오차 행렬

y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3) # 예측 만들기
conf_mx = confusion_matrix(y_train, y_train_pred) # 오차 행렬 생성

# 오차행렬을 이미지로 표현
plt.matshow(conf_mx, cmap=plt.cm.gray) # 숫자가 높을수록(분류를 잘할 수록) 흰색에 가까움
plt.show()

np.fill_diagonal(norm_conf_mx, 0) # 주 대각선 0으로 채우기 (처음 보는 함수! 싱기) plt.matshow(norm_conf_mx, cmap=plt.cm.gray) # 행: 실제, 열: 예측 plt.show()


- p.150 (ebook 기준) 중단 이미지 기준 오차행렬 분석
  - 클래스 8열이 다른 열에 비해 밝다 : 많은 이미지가 8로 잘못 분류됨
  - 클래스 8행은 많이 밝지 않음 : 실제 8은 적절히 8로 분류됨
  - (3,5) 와 (5,3) 이 밝음: 3과 5가 서로 많이 혼동되고 있음
  - 오차 행렬은 반드시 대칭은 아님
- 분류기 성능 향상 방안 - 8로 잘못 분류되는 것을 줄이도록 개선
  - 방안 1. 8처럼 보이는, 하지만 실제 8은 아닌 숫자의 훈련 데이터를 더 많이 모아서 실제 8과 구분하도록 분류기를 학습
  - 방안 2. 분류기에 도움 될 만한 특성을 더 찾아볼 것 (ex. 동심원의 수를 세는 알고리즘)
  - 방안 3. 동심원 같은 어떤 패턴이 드러나도록 scikit-image, pillow, openCV 등을 사용해서 이미지를 전처리
- 개개의 에러를 분석해보면 분류기가 무슨 일을 하고, 왜 잘못되었는지에 대해 통찰을 얻을 수 있지만 더 어렵고 시간이 오래 걸림
- 3과 5의 샘플을 확인해본 결과 일부는 정말 잘못쓰여있지만, 대부분은 분류기 에러로 보임
  - 원인은 선형 모델인 SGDClassifier를 사용했기 때문
  - 선형 분류기는 클래스마다 픽셀에 가중치를 할당하고 새로운 이미지에 대해 단순히 픽셀 강도의 가중치 합을 클래스의 점수로 계산
  -> 3과 5는 몇 개의 픽셀만 다르기 때문에 모델이 쉽게 혼동
- 분류기가 이미지 위치나 회전 방향에 매우 민감하므로
이미지를 중앙에 위치시키기고 회전되어있지 않도록 전처리하면 에러가 감소할 것으로 예상됨
givitallugot commented 2 years ago

3.6 다중 레이블 분류

다중 레이블 분류

from sklearn.neighbors import KNeighborsClassifier

y_train_large = (y_train >= 7) # [7,8,9] 레이블로 로 예측 ex [1, 0, 1]
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)



다중 레이블 분류기 평가

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")
njs03332 commented 2 years ago

3.7 다중 출력 분류

knn_clf.fit(X_train_mod, y_train_mod) clean_digit = knn_clf.predict([X_test_mod[some_index]]) plot_digit(clean_digit)