회귀 : 정답이 연속적인 수치값 --> 예측값을 그대로 사용
분류 : 정답이 정해져 있어서 --> 연속적인 수치값을 사용할 수 없음
선형분류 모델 :
선형함수를 결정경계로
'가중치들의 합 > 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 |
댓글