코딩 및 기타

이진 분류(SGDClassifer) , 다중 분류 ,성능 측정: 교차검증 k-fold && 오차행렬, 정밀도 및 재현율 , 다중 레이블 분류 classifier chain

정지홍 2024. 10. 13. 13:44
# mnist 데이터 셋 사용
# 데이터를 다운 및 로드 한다.
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784' , as_frame=False )

# ----------------------------------------------------------

# 데이터의 형태를 출력한다.
# 아래는 입력받은 값에 대해서 출력
import matplotlib.pyplot as plt

def num( src ):
    img = src.reshape(28,28)
    plt.imshow(img , cmap="binary")
    plt.axis("off")

print((f'{num(X[0])}\ny[0] is {y[0]}'))

# ----------------------------------------------------------

# 데이터 가져온다.
X , y = mnist.data , mnist.target
print(f'X의 shape is {X.shape}. x의 이미지는 28x28픽셀이니 28x28={28*28}\ny의 shape is {y.shape}')

# X의 shape is (70000, 784). x의 이미지는 28x28픽셀이니 28x28=784
# y의 shape is (70000,)

X_train , X_test , y_train , y_test = X[ : 60000 ] , X[ 60000 : ] ,y[ : 60000 ] , y[ 60000 : ] 


# ----------------------------------------------------------

 

 


이진 분류기


 

교차 검증 k-fold

직접 구현 방식
라이브러리 사용 방식

 


오차행렬


  • precision 정밀도 = TP / ( TP + FP )
    • 이는 양성 예측의 정확도
  • recall 재현율 = TP/ (TP+FN )
  • F1 - score
    • 정밀도와 재현율을 하나로 합쳐서 표현
    • F1 = TP / ( TP + (FN +FP)/2 ) = 2 * ( (정밀도*재현율) / (정밀도+재현율) )

  • OvR ( one versus the rest ) == OvA( one-versus-all )
    • 분류시 각 분류기의 결정 점수중에서 가장 높은 것을 선택하는 방식
  • OvO ( one - versus - one )
    • 0과1 구별 , 0과 2 구별 , 1과 3 구별 같이, 각 숫자의 조합마다 이진 분류기를 훈련 시키는것
    • 만약 N개의 클래스 존재한다면.....
      • 필요한 분류기 갯수 : N*(N-1)/2
      • 만약 0~9의 숫자를 분류한다면, 45개 필요

 

다중 분류


ovr사용
from sklearn.multiclass import OneVsRestClassifier

ovr = OneVsRestClassifier( SVC ( random_state=42 ) )
ovr.fit( X_train[ : 2000 ] , y_train[ : 2000] )
ovr.predict( [ X[0] ] )

SGD 분류기 사용

 

 


다중 레이블 분류란?

  • 하나의 분류기가 여러개의 클래스를 출력하는 것
    • let, 고양이,강아지,참새를 인식하도록 훈련된 분류기 존재....
      • 만약, 한 사진에 고양이,강아지,참새가 있다면.....  [1 ,1  ,1]을 출력
      • 만약, 한 사진에 고양이만 존재시.... [ 1 , 0 , 0 ]출력