import warnings
warnings.filterwarnings(action = 'ignore')
# 일반화 성능 검사 (교차검증)
# 검증을 5번 실행했을때 모델이 가지는 일반적인 정확도 성능 정도 확인
knn_result = cross_val_score(knn_model,X_train,y_train, cv=5)
tree_result = cross_val_score(tree_model,X_train,y_train, cv=5)
logi_result = cross_val_score(logi_model,X_train,y_train, cv=5)
svm_result = cross_val_score(svm_model,X_train,y_train, cv=5)
# 도구 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
1 목표
손글씨(0~9)를 분류하는 모델을 만들어보자
여러모델을 사용해보자
이미지 데이터 다루는 방법을 알아보자
2 데이터 불러오기
digit_data = pd.read_csv('./digit_train.csv')
digit_data
# train -> 학습시킬때
# test -> 예측할때
### 크기 확인 .shape
### 결측치 확인
### 데이터 타입
digit_data.info()
# 행 4200, 열 785
# Label to pixel783
# dtypes : int64(785)
digit_data.shape
3 EDA
데이터를 이미지화해서 출력해보기
# 2번째 인덱스 값의 이미지 확인해보기
# 인덱싱하기
img2 = digit_data.iloc[2,1:] # 이미지 문제 데이터
img2_lb = digit_data.iloc[2,0] # 이미지 실제답
# print(img2 최대, 최소 픽셀값 확인)
print(img2.min())
print(img2.max())
# 픽셀의 범위값 : 0 ~ 255
# 0 : 검은색 ~ 255 : 흰색
# ex) 200 밝은계열
# ex) 50 어두운 계열
# 히스토그램으로 픽셀 범위값 시각화
plt.hist(img2, bins = 255)
# y축 범위 좁혀서 보기
plt.ylim(0,200)
plt.show()
# 이미지 출력
plt.imshow(img2.values.reshape(28,28), cmap = 'gray')
# matplotlib에서 이미지를 출력할때 사용하는 함수
plt.show() #1
img2_lb
# 이미지 한장 선택해서 출력해보기
img = digit_data.iloc[40000,1:] # 이미지 문제 데이터
img_lb = digit_data.iloc[40000,0] # 이미지 실제답
plt.imshow(img.values.reshape(28,28), cmap = 'gray')
plt.show()
print('실제답:', img_lb)
# 여러장의 이미지 확인
for i in range(100,131):
img = digit_data.iloc[i,1:] # 이미지 문제 데이터
img_lb = digit_data.iloc[i,0] # 이미지 실제답
plt.imshow(img.values.reshape(28,28), cmap = 'gray')
plt.show()
print('실제답:', img_lb)
4 5000장 추출 활용
X = digit_data.iloc[0:5000,1:]
#대문자 X == 문제, 특성, 피처, feature, 독립변수, label 컬럼 제외 모든 컬럼
y = digit_data.iloc[0:5000,0]
# 소문자 y == 답, label, 타겟, target, 종속변수, label컬럼만
print(X.shape)
print(y.shape)
train, test를 일정한 비율로 나누기
7:3
sklearn 제공 train_test_split()
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, # 30% test용으로 분리, 정수로 넣으면 그 수만큼만 분리됨
random_state = 7)
X_train.head()
# 크기확인
print('훈련용 문제:', X_train.shape)
print('훈련용 답:', y_train.shape)
print('테스트용 문제:', X_test.shape)
print('테스트용 답:', y_test.shape)
5 모델링(분류 모델 사용하기)
knn : K개의 최근접 이웃의 답을 확인하고 test를 예측하는 모델
tree : yes 또는 no라고 대답하면 예측해나가는 모델
logistic regression : 선형 분류 모델
svm : 서포트 벡터 머신
from sklearn.neighbors import KNeighborsClassifier # knn 분류 모델
from sklearn.tree import DecisionTreeClassifier # tree 분류 모델
from sklearn.linear_model import LogisticRegression # Logi 분류 모델
from sklearn.svm import LinearSVC # svm 분류 모델
# 모델의 일반적인 성능 확인 => 교차검증 확인
from sklearn.model_selection import cross_val_score
# 1. 모델 생성
knn_model = KNeighborsClassifier(n_neighbors=5) # K == n_neighbors 5개 확인
# 거리를 계산해서 가장 가까운 값들의 답을 확인하고 투표하여 예측
tree_model = DecisionTreeClassifier()
logi_model = LogisticRegression()
svm_model = LinearSVC()
# 하이퍼 파라미터 -> 모델 내부에 있으면서 과대적합을 제어하는 파라미터(사용자 지정)
import warnings
warnings.filterwarnings(action = 'ignore')
# 일반화 성능 검사 (교차검증)
# 검증을 5번 실행했을때 모델이 가지는 일반적인 정확도 성능 정도 확인
knn_result = cross_val_score(knn_model,X_train,y_train, cv=5)
tree_result = cross_val_score(tree_model,X_train,y_train, cv=5)
logi_result = cross_val_score(logi_model,X_train,y_train, cv=5)
svm_result = cross_val_score(svm_model,X_train,y_train, cv=5)
# 교차 검증 결과 확인
print('knn:', knn_result.mean())
print('tree:', tree_result.mean())
print('logi:', logi_result.mean())
print('svm:', svm_result.mean())
6 스케일링
데이터의 범위를 조정하는 작업
from sklearn.preprocessing import MinMaxScaler
# 0~255 값들의 데이터
# 단위를 줄여주기
min_max_sc = MinMaxScaler() # 스케일링 도구 생성
# 데이터의 단위를 확인 - fit()
min_max_sc.fit(X_train)
# 데이터의 단위를 변경 - transform()
# train, test 단위 변경
X_train_sc = min_max_sc.transform(X_train)
X_test_sc = min_max_sc.transform(X_test)
# 스케일링된 데이터로 교차검증 진행해보기
# svm 모델에 적용해보기
svm_result2 = cross_val_score(svm_model, X_train_sc, y_train, cv = 5)
print('svm2:', svm_result2.mean()) #0.82 -> 0.86
# 모델의 성능 향상 1. 모델측면 -> 하이퍼파마라미터조정 2. 데이터측면 -> 데이터수정,추가
# 2. 모델 학습
# fit()
knn_model.fit(X_train,y_train)
tree_model.fit(X_train,y_train)
logi_model.fit(X_train,y_train)
svm_model.fit(X_train_sc,y_train)
# 3. 모델 예측
knn_pre = knn_model.predict(X_test)
knn_pre
tree_pre = tree_model.predict(X_test)
tree_pre
# logi predict
logi_pre = logi_model.predict(X_test)
logi_pre
# svm predict
svm_pre = svm_model.predict(X_test_sc)
svm_pre
# 모델 성능 평가
# accuracy_score(실제답, 예측값)
from sklearn.metrics import accuracy_score # 정확도 성능 지표
print('knn정확도:', accuracy_score(y_test, knn_pre))
print('tree정확도:', accuracy_score(y_test, tree_pre))
print('logi정확도:', accuracy_score(y_test, logi_pre))
print('svm정확도:', accuracy_score(y_test, svm_pre))
7 예측의 불확실성
# 실수 표현방법 변경
pd.options.display.float_format = '{:.15f}'.format
# pd.reset_option('display.float_format') 되돌리는 방법
# 10개의 X_test 확인하기
# e 지수
# float 값이 너무 크거나 너무 작을 경우 과학적으로 표기하는 방법 => 지수표기법
pd.DataFrame(logi_model.predict_proba(X_test.iloc[:10]))
plt.imshow(X_test.iloc[8].values.reshape(28,28), cmap = 'gray')
plt.show()
'머신러닝' 카테고리의 다른 글
[Machine Learning] 손글씨데이터 활용 분류 실습 (0) | 2022.07.20 |
---|---|
ex01_타이타닉데이터활용_생존,사망분류실습 (0) | 2022.07.13 |
머신러닝을 위한 pandas와 matplotlib 예제 (0) | 2022.07.12 |
머신러닝 기본 개념 (0) | 2022.07.06 |