Eggs Sunny Side Up
본문 바로가기
Computer Engineering/머신러닝

Logistic_SVM_손글씨 숫자 데이터 분류 실습

by guswn100059 2023. 6. 19.

회귀 : 정답이 연속적인 수치값 --> 예측값을 그대로 사용

분류 : 정답이 정해져 있어서 --> 연속적인 수치값을 사용할 수 없음

 

선형분류 모델 :

선형함수를 결정경계로

'가중치들의 합 > 0' ==> 1

'가중치들의 합 < 0' ==> 0

 

Logistic Regression

- Sigmoid(S자형 곡선)라는 선형 함수를 사용

- 결정경계가 곡선으로 그려짐

- sigmoid는 입력값이 0 ~ 1 까지의 범위로 변환 --> 확률값으로 사용함

- 개와 고양이를 분류 => 개(80%), 고양이(60%)

 

sigmoid 함수를 잘 그렸는지 확인 - 교차 엔트로피 오차 함수

선형회귀 : MSE, R2 score

 

SVM

- 결정경계와 가장 인접한 데이터를 서포트 벡터라 부름

- 결정경계와 서포트 벡터 간의 거리를 마진이라 부름

- 마진이 가장 큰 결정경계가 가장 좋은 결정경계

- 결정경계 데이터(N)가 가지고 있는 차원(N-1)으로 구성함


### 문제정의
- 손글씨 숫자(0~9)를 분류하는 모델을 만들어보자.
- 이미지 데이터의 형태를 이해해보자

### 데이터 수집

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('./data/digit_train.csv')
data.head()
# 답 : label
# 28 * 28 이미지 데이터

data.shape

# 데이터 시각화
# 이미지 데이터로 첫번째 행의 label을 제외한 모든 컬럼 가져오기
img0 = data.iloc[0, 1:]
img0.shape

img0.values

# 리스트 자료형을 28 * 28 2차원 변환
img0_reshape = img0.values.reshape(28, 28)

# 이미지 그려보기
plt.imshow(img0_reshape, cmap='gray')
plt.show()

img41000 = data.iloc[41000, 1:]
plt.imshow(img41000.values.reshape(28, 28), cmap='gray')

### 학습을 위한 데이터 분리
- 학습(7) : 테스트(3)
- random_state : 1

X = data.iloc[:, 1:]
y = data.iloc[:, 0]

X.shape, y.shape

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=1)

print(X_train.shape, X_test.shape, y_train.shape, 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('Logi : ', logi_model.score(X_test, y_test))
print('SVM : ', svm_model.score(X_test, y_test))

#### 데이터 스케일링
- 이미지 픽셀정보는 0 ~ 255로 최소/최대가 고정되어 있음
- MinMaxScaler를 사용하여 0 ~ 1 사이의 값으로 모든 픽셀을 조정
- 스케일링의 효과 확인하기 ==> 학습(연산) 속도 개선, 거리기반으로 예측하는 KNN모델은 변화가 없었음
- 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('Logi : ', logi_model.score(X_test_scale, y_test))
print('SVM : ', svm_model.score(X_test_scale, y_test))

### 예측

img24 = X_test_scale[24] # index 24번째 데이터

logi_model.predict([img24])

svm_model.predict([img24])

# 실제 정답 확인
y_test.iloc[24]

logi_model.predict_proba(X_test_scale[24:25])
# 24번째 값(0~9) 숫자가 7일 확률

img24 = X_test.iloc[24]
plt.imshow(img24.values.reshape(28, 28), cmap='gray')

### 평가지표
- 회귀 : 오차를 기반으로 하는 평가지표 사용(MSE, R2score)
- 분류 : 맞춘 개수를 기반으로 평가지표 사용
    1. 정확도 : 전체 데이터 중에 정확히 맞춘 비율
    2. 재현율 : 실제 양성 중에서 정확히 맞춘 비율
    3. 정밀도 : 예측 양성 중에서 정확히 맞춘 비율
    4. F1-score : 정밀도와 재현율의 조화평균
- SVM : 초평면을 기준으로 소프트 백터의 마진이 클수록 좋은 결정경계

from sklearn.metrics import confusion_matrix

pre = logi_model.predict(X_test_scale)

# confusion_matrix(실제값, 예측값)
test_conf = confusion_matrix(y_test, pre)
test_conf

from sklearn.metrics import classification_report

# classification_report(실제값, 예측값)
print(classification_report(y_test, pre))

# precision 정밀도, recall 재현율, f1-score 조화평균, accuracy 정확도
# support : 데이터의 갯수
# logi의 예측성능은 92%이지만, 각 숫자가 나온 확률은 다름
# f1-score : 정밀도와 재현율을 고려한 수치, 
#            수치가 높은게 두 분류지표(정밀도, 재현율)도 높음을 알 수 있음

분류 평가 지표

 

오차행렬도 : y축 - 실제 정답 / x축 - 모델이 예측한 값

 

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

 

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

 

정밀도 : 양성으로 예측된 것 중에서 얼마나 많은 샘플이 진짜 양성인지 측정하는 것, 정확도에 비해 양성을 걸러내는 능력은 떨어짐.

 

=> 낮은 재현율, 높은 정밀도 : 모델이 한 번 예측할 때 비용이 많이드는 경우 적합(의약실험, 모델 예측의 리스크/예측비용이 큰 경우)

-> 아이에게 유익한 영상만을 보여주고자 할 때

 

=> 높은 재현율, 낮은 정밀도 : 실제 사건(상황)에 대한 리스크가 클 경우 적합

-> 좀도둑을 걸러내는 감시카메라, 암환자 판정

 

'Computer Engineering > 머신러닝' 카테고리의 다른 글

네이버 영화리뷰 분석  (0) 2023.06.20
영화리뷰 분석  (0) 2023.06.20
선형회귀_LinearRegression_보스턴 주택가격 실습  (0) 2023.06.19
선형회귀  (0) 2023.06.16
Ensemble 유방암 데이터 분류 실습  (0) 2023.06.15

댓글