로운's 기술노트

[기초학습반] Python Challenge_5회차 본문

내배캠_데이터분석가_'24.04~08/파이썬

[기초학습반] Python Challenge_5회차

로운's 2024. 6. 5. 14:02

■ 분류 (Classification)

□ MNIST 

- 고등학생과 미국 인구조사국 직원들이 손으로 쓴 숫자 이미지 데이터(머신러닝 분야의 hello world)
- 사이킷런 데이터들은 대부분 딕셔너리 형태
- DESCR : 데이터셋 설명
- data : 행열로 이루어진 데이터
- target : 정답값(문자로 출력되기 때문에 정수값으로 변환 필요)

ㅇData 구성
- 70,000개의 이미지 (앞 60,000개는 train data, 잔여 10,000개는 test data)
- 각 이미지에는 784개의 특성이 있음(28*28픽셀)
- 각각의 특성이 0~255의 값을 가질 수 있음


ㅇ 'X'와 'y'로 기재하는 이유?
# X = mnist["data"]
# y = mnist["target"]
X는 매트릭스(행렬)고, y는 벡터(단일행)라서!


ㅇ이진 분류기
- 이미지가 5인지 아닌지로 분류!
- SGDClassifier를 이용하여 학습진행
  * SGDClassifier : SVM이라는 머신러닝을 확률적 경사하강법으로 학습하는 모델 (배치경사하강법은 시간이 오래걸리기 때문에 실무에서 거의 사용하지 않음)
  * SVM(Support Vector Machine)이란? 분류할 때 정말 많이 쓰이는 모델. 다목적 모델(분류, 비선형분류, 리그레이션 가능)
- 대용량 데이터 학습시 유리함

ㅇ 성능측정
- 성능평가는 회귀보다 분류가 훨씬 어려움!
- 정확도 성능이 95~96%로 나왔지만 100% 신뢰할 수 있을까? 정답은 No!
  * 정확도란, 전체 데이터 개수 중 맞춘 데이터 개수 비율
  > 고르게 분포되지 않은(불균형한) 데이터를 이진분류할 경우 이러한 맹점이 발생.(e.g. 5가 아니라는 알고리즘만 있어도 90%에 육박) 
  >>accuracy 믿지말자! 쓰지마 (정확도가 분류기의 성능측정 지표로 선호되지 않는 이유)

ㅇ 오차행렬 (혼동행렬, confusion matrix)

.Predicted : 예측 값
.Actual : 실제 값
.nagaticve : 5가 아닌 경우
.positive : 5인 경우

ㅇ 정밀도와 재현율
- 오차행렬을 요약한 지표가 정밀도(precision) 재현율(recall/ '민감도(sensitivity)'로 부르기도 함)

# precision
# sklearn 계산
from sklearn.metrics import precision_score, recall_score

precision_score(y_train_5, y_train_pred)


# confusion matrix로 precision 직접 계산
cm = confusion_matrix(y_train_5, y_train_pred)
cm[1, 1] / (cm[0, 1] + cm[1, 1])


- 위 2가지(정밀도와 재현율)의 조화평균으로 계산한 것이 f1_score (한쪽으로 치우치지 않고 전체적인 성능 확인 가능)

# recall
# 1. sklearn계산
recall_score(y_train_5, y_train_pred)

# 2. confusion matrix로 recall 직접계산
cm[1, 1] / (cm[1, 0] + cm[1, 1])


ㅇ 오차행렬(confusion_matrix)로 머신러닝의 어떤 정확도도 파악 가능!

    (표를 외울 필요는 없지만 이런게 있다는 건 꼭 기억하자!)

ㅇ 서비스(or상황이나 경우)에 따라 precision, recall 사용
의료데이터는 recall을 더 중요하게 여김 (e.g. 암이 아니라고 예측했는데, 암으로 판정 > Critical함)
> 하나만 알려주려면 F1스코어(리콜과 프리시전)를 쓰자. (한번에 3가지 다 병행하는 것도 방법!)


ㅇ 다중분류
- SVM이나 로시스틱 회귀는 이진분류 밖에 안된다. but, 다중 분류를 수행하려면?

 > 여러 번 수행하면 된다! 어떻게? OvR 또는 OvO!

- OvR (One versus Rest)
첫 번째 분류기: 클래스 A와 클래스 B, C를 구분 (A vs Rest)
두 번째 분류기: 클래스 B와 클래스 A, C를 구분 (B vs Rest)
세 번째 분류기: 클래스 C와 클래스 A, B를 구분 (C vs Rest)
- OvO (One versus One)
첫 번째 분류기: 클래스 A와 클래스 B를 구분 (A vs B)
두 번째 분류기: 클래스 A와 클래스 C를 구분 (A vs C)
세 번째 분류기: 클래스 B와 클래스 C를 구분 (B vs C)

-대부분의 이진분류에서는 OvR을 사용하여 훈련함
- SVM은 OvO를 선호
- sklearn svm은 기본적으로 OvR내장하고 있으며, decision_function_shape을 이용해 OVO 사용가능

Comments