관리 메뉴

DeseoDeSeo

[ Machine learning ] ex10 선형분류(Logistic Regression) 손글씨 숫자 데이터 분류 실습 본문

Python

[ Machine learning ] ex10 선형분류(Logistic Regression) 손글씨 숫자 데이터 분류 실습

deseodeseo 2023. 9. 13. 19:39
Logistic Regression

  : 선형 회귀 방식을 분류에 적용한 알고리즘 ➜ 분류에 사용됨. 하지만 선형 회귀 계열 !

   ○  주요 매개변수(Hyperparameter)

   ○  LogisticRegression( C,  max_iter )

       - 규제 강도의 역수 : C ( ➜ 값이 작을 수록 규제가 강해짐)

       - 최대  반복횟수 : max_iter ( ➜ 값이 크게 잡아 줘야 학습이 제대로 됨. )

       - 기본적으로 L2 규제 사용,  중요한 특성이 몇개 없다면  L1규제를 사용해도 무방 

           ( ➜ 주요 특성을 알고 싶을 때는 L1규제를 사용하기도 함)

 

선형 모델 방식을 분류에서 사용하는 이유?
        - 선형 모델은 간단한 함수식을 사용하므로 학습 및 예측 속도가 빠름
        - 매우 큰 데이터 세트와 희소(sparse)한 데이터 세트에서도 잘 동작
        - 특성이 많을 수록 더 잘 동작함.
        - 특성이 작은 데이터에서는 다른 모델이 더 좋은 경우가 많음.

 

Q : 손글씨 숫자(0~9)를 분류하는 모델을 만들어보자.

데이터 수집
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv("./data/digit_train.csv")
data.shape
data.head()

image0.values


# 리스트 자료형을 28*28의 2차원으로 변환
image0_reshape= image0.values.reshape(28,28)

 

# image0 이미지 하나를 그려보기.
plt.imshow(image0_reshape, cmap='gray' )

# 7777 행의 데이터 꺼내와서
1. 값 확인
2. 2차원 변환
3. 이미지 그려보기.
4. 어떤 숫자인지 확인.
img1= data.iloc[7777,1:]
img1_reshape= img1.values.reshape(28,28)
plt.imshow(img1_reshape)

Linear SVM (Support vector machines)
 : 주어진 데이터를 직선 혹은 초평면(결정경계)으로 분리하는 분류 알고리즘.
    최대한 두 클래스를 잘 구분하는 경계를 찾음.
    경계로부터 가장 가까운 데이터 포인트들을 서포트 벡터(Support vector)
     서포트 벡터들만을 이용하여 결정 경계를 찾음.
     분류의 목표 : 서포트벡터들 사이의 거리(margin)를 최대화 하는 것 !
     - 결정경계(초평면)이 데이터(N)가 가지고 있는 차원(N-1)으로 구성함.

 

학습을 위한 데이터 분리
  학습 7:  테스트3
X= data.iloc[:,1:] # 문제
y=data.iloc[:,0] # 답

X.shape, y.shape # 문제는 항상 2차원 데이터 프레임 형태(=> [[ ]] ), 정답은 1차원 시리즈 형태임. 

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size =0.3, random_state =7)

print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)

모델 선택
- KNN모델( 거리로 계산 , 모든 데이터에 대한 거리를 계산, 데이터가 많을수록 속도가 느려짐.)
- Logistic Regression
- SVM
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC

# 모델 생성
knn_model = KNeighborsClassifier()
logi_model =LogisticRegression()
svm_model= LinearSVC()
학습 및 평가
# 학습
knn_model.fit(X_train, y_train)
logi_model.fit(X_train, y_train)
svm_model.fit(X_train, y_train)

#평가
print('KNN : ', knn_model.score(X_test,y_test))
print('Logistic : ', logi_model.score(X_test,y_test))
print('SVM : ', svm_model.score(X_test,y_test))

 

데이터 스케일링 적용
 - 이미지 픽셀정보: 0부터 225로 최소/ 최대가 고정되어있는 데이터
-  MinMaxScaler를 사용하려면 0과 1사이의 값으로 모든 픽셀을 조정
- 스케일링의 효과 확인하기 
    ➜ 학습(연산) 속도 개선
    ➜ 거리기반으로 예측하는 KNN모델의 변화 유무
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler() # 0 ~ 1 사이로 변환.
scaler.fit( X_train) # 현재 데이터 분포의 최소/최대 값 확인
                     # 변환하는 기준 값을 X_train으로 추출.
X_train

# 문제 데이터에 스케일링 적용
X_train_scale = scaler.transform(X_train)
X_test_scale = scaler.transform(X_test)

# 스케일링이 적용된 데이터로 다시 학습
knn_model.fit(X_train_scale, y_train)
logi_model.fit(X_train_scale, y_train)
svm_model.fit(X_train_scale, y_train)

# 스케일링이 적용된 데이터로 변화값 확인
print('KNN : ', knn_model.score(X_test_scale,y_test))
print('Logistic : ', logi_model.score(X_test_scale,y_test))
print('SVM : ', svm_model.score(X_test_scale,y_test))

회귀 ( 데이터의 자료형이 연속형) : 정담이 연속적인 수치 값,  y햇이 예측한 값을 그대로 사용
분류( 데이터의 자료형이 범주형) : 정답이 딱 떨어지는 정해져있는 값
선형분류 :  y햇이라는 선형함수(결정경계)를 기준으로 결정 경계의 위쪽에 있는냐, 아랫쪽에 있느냐로 영역을 예측
가중치들의 합  > 0  ➜ 1
가중치들의 합  < 0  ➜ 0

 

Logistic Regression
: 선형 회귀 방식을 분류에 적용한 알고리즘 

○ 결정경계가 S자형 곡선( Sigmoid)

○ Sigmoid는 입력값을 0 ~ 1 범위로 변환, 확률값으로 사용 

      ex) 개와 고양이를 분류하는 모델 : 개(70%), 고양이(80%)  ➜ 예측하는 확률값을 명시

○ sigmoid(곡선)을 잘 그렸는지 확인하는 기준 : 교차엔트로피 오차함수

             교차엔트로피 ( cross Entropy) : 동일 사거네 대한 확률분포 p와 q에 대해 p와 q의 차이를 나타내는 척도

              - 오차들을 더해서 오차가 크면 ➜ 안 좋은 함수

              - 오차들을 더해서 오차가 작으면 ➜  좋은 함수

분류 평가 지표 - 이진분류

➤ 정확도(Accuracy)

   : 정확히 예측한 수를 전체 샘플 수로 나눈 것.

➤ 재현율(Recall)

   : 전체 양성 샘플 중에서 얼마나 많은 샘플이 양성 클래스로 분류 되는지.

➤ 정밀도(Precision)

   : 양성으로 예측된 것 중 얼마나 많은 샘플이 진짜 양성인지 측정하는 것.

➤ F1-score

   : 정밀도와 재현율의 조화 평균.

 

주요 매개변수(Hyperparameter)

     classification_report(실제값, 예측값)

      : 여러 임계값(0~1)에서 분류기의 특성을 분석하는데 널리 사용되는 도구

평가지표
  • 회귀 : 오차를 기반으로 하는 평가지표 사용(MSE, R2score)
  • 분류 : 맞춘 개수를 기반으로 평가지표를 사용.
    1. 정확도(Accuracy) : 전체 데이터 중에서 정확히 맞춘 비율
    2. 재현율(Recall) : 실제 양성중에서 정확히 맞춘 비율
    3. 정밀도(Precision) : 예측한 양성 중에서 정확히 맞춘 비율
    4. F1 score : 정밀도와 재현율의 조화 평균
  • SVM : 초평면(결정경계)을 기준으로 소프트벡터의 마진(거리)이 클수록 좋은 결정경계
# 평가지표 라이브러리 불러오기
from sklearn.metrics import confusion_matrix
# 스케일링이 적용된 테스트 데이터로 예측 값 만들기.
# 로지스틱 분류 사용
pre = logi_model.predict(X_test_scale)

test_conf = confusion_matrix(y_test, pre)
test_conf

from sklearn.metrics import classification_report
# classification_report(실제값, 예측값)
print(classification_report(y_test, pre))

  • support : 데이터의 개수
  • accuracy : 로지스틱 회귀의 예측성능 92% 이지만, 각 숫자(클래스)가 나올 확률의 수치 값은 다름.
  • f1-score : 정밀도와 재현율의 조화 평균 ➜ 정밀도와 재현율을 고려한 수치값. ➜ 수치가 높은게 두 분류지표(정밀도, 재현율)도 높음을 알 수 있음.
  • macro avg : 정밀도, 재현율, f-1 score를 구해서 각각 평균을 낸 것. ➜ 분류하는 모델이 각 클래스에 대해 얼마나 평균적으로 잘 동작하는지 알고 싶을 떄 사용.
  • weighted avg(가중 평균): 각 클래스의 중요도, 영향도(빈도)등에 따라 가중치를 곱해서 구해지는 평균 값.
예측

 

predict_proba : 각 클래스에 대한 확률

 

분류평가 지표

  • 낮은 재현율 , 높은 정밀도를 선호하는 경우
    • 어린아이에게 안전한 동영상(양성)을 걸러내는 분류기를 훈련시킬 경우 좋은 동영상이 많이 제외되더라도(낮은 재현율) 안전한 것들만 노출시키는(높은 정밀도) 분류기가 더 좋음 ( 의학실험, 모델이 예측의 리스크, 비용이 큰 경우에 적합)
  • 높은 재현율, 낮은 정밀도를 선호하는 경우
    • 감시카메라로 좀도둑(양성)을 잡아내는 분류기를 훈련시킬 경우 경비원이 잘못된 호출을 종종 받지만(낮은 정밀도) 거의 모든 좀도둑을 잡는(높은 재현율) 분류기가 더 좋음. 암환자 판정, 스팸 문자 및 메일 분류 ( 실제 사건(상황)에 대한 리스크가 큰 경우에 적합)
  • 같은 정확도 일 때, 애매한 것들을 사용하지 않겠다. ==> 높은 정밀도 선호
  • 같은 정확도 일 때. 애매한 것들을 사용하겠다. ==> 높은 재현율 선호
  • 상황에 맞게 평가지표를 적용
  • 가장 best : 높은 재현율, 높은 정밀도
Roc곡선
( Receiver Operating Characteristic  곡선) 
: 이진 분류 시스템에 대한 성능 평가 기법.
  •     : 임계값을  0 ~ 1까지 변화시켜가면서 
    
  •        x축: 가짜양성비율(FPR) , y축 : 진짜양성비율(TPR)을 표시한 곡선
    
  •      임계값 변화에 따라서 양성/음성 분류가 달라짐. ROC곡선도 달라짐.
    
  •      ROC곡선 아래 면적 : AUC(Area Under Curve)
    
  •      AUC의 값이 1에 가까울수록 분류모델의 성능이 좋다고 평가.
    
  •      : 0.5를 기준으로 위쪽으로 갈수록 좋음.

분류 평가 지표 시각화 - ROC(Receiver Operating Characteristic) curve

 

-  여러 임계값(0~1)에서 분류기의 특성을 분석하는데 널리 사용되는 도구

-  클래스의 분포가 다르고 겹치는 부분이 존재 -> 정확도의 단점을 보완하기 위한 것

-  진짜 양성비율(TPR)에 대한 거짓 양성 비율(FPR)을 나타냄.

 

           - 가짜 양성비율(FPR : 전체 음성 샘플 중에서 거짓 양성으로 잘못 분류한 비율)

          - 진짜 양성비율(TPR : 재현율)