목표
- 손글씨(0-9)를 분류하는 모델을 만들어보자
- 여러모델을 사용해보자
- 이미지 데이터 다루는 방법을 알아보자
도구불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
데이터 불러오기
# train - 학습시킬 때
# test -> 예측할 때
digit_data = pd.read_csv('./digit_train.csv')
digit_data
.info()
- 크기확인 .shape
- 결측치 확인
- datatype 확인
digit_data.info()
# 42000 행, 785 컬럼
# label to pixel783
# dtypes : int64(785)
# 컬러가 흑과 백만 있는 데이터
EDA
데이터를 이미지화해서 출력해보기
2번째 인덱스 값의 이미지 확인해보기
# label : 답 == target == 종속변수
img2 = digit_data.iloc[2,1:] # 이미지 문제 데이터
img2_lb = digit_data.iloc[2,0] # 이미지 실제 답
img의 최대, 최소 픽셀값 확인
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()
이미지 한장 선택해서 출력해보기
# 28 * 28 -> 784
# matplotlib에서 이미지를 출력할 때 사용하는 함수 : plt.show()
plt.imshow(img2.values.reshape(28,28), cmap='gray')
plt.show()
답인 img2_lb를 확인해보자
img2_lb
for문으로 여러장의 이미지 확인하기
(너무 길어서 결과값은 3장만 올리겠음)
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)
5000장 추출 활용
x : 대문자 X == 문제, 특성, 피처, feature, 독립변수
y : 소문자 y == 답, label, 타겟, target, 종속변수
X = digit_data.iloc[0:5000,1:]
y = digit_data.iloc[0:5000,0]
print(X.shape)
print(y.shape)
train, test를 일정한 비율로 나누기
- 7 : 3 의 비율
- sklearn제공 train_test_split()
from sklearn.model_selection import train_test_split
= train_test_split(분리할 데이터 문제, 답, 분리할비율, 랜덤고정값)
비율입력시 실수형태로 입력해야함, 정수형태로 입력 시 그 숫자만큼만 할당됨
-> 하단 코드에서는 0.3이므로 30% test용으로 분리
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3 , random_state = 7)
X_train.head()
크기확인
print('훈련용 문제 : ',X_train.shape)
print('훈련용 답 : ' ,y_train.shape)
print('테스트용 문제 : ',X_test.shape)
print('테스트용 답 : ' ,y_test.shape)
모델링 (분류 모델 사용하기)
- 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()
일반화 성능검사 (교차검증)
- 검증을 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 warnings
warnings.filterwarnings(action = 'ignore')
교차검증결과 확인
print('knn',knn_result.mean())
print('tree',tree_result.mean())
print('logi',logi_result.mean())
print('svm',svm_result.mean())
스케일링
- 데이터의 범위(단위)를 조정하는 직업
from sklearn.preprocessing import MinMaxScaler
00~255 값들의 데이터
단위를 줄여주기
min_max_sc = MinMaxScaler() # 스케일링 도구 생성
# 데이터의 단위를 확인 - fit()
min_max_sc.fit(X_train)
#데이터의 단위를 변경 - tranceform()
# train, test 단위 변경
X_train_sc = min_max_sc.transform(X_train)
X_test_sc = min_max_sc.transform(X_test)
히스토그램을 이용해 데이터 시각화
plt.hist(X_train_sc[0])
스케일링 된 데이터로 교차검증 진행해보기
- SVM 모델에 적용해보기
- 약 0.04 증가한 것으로 보임
svm_result2 = cross_val_score(svm_model,X_train_sc, y_train, cv = 5)
print('svm2 : ', svm_result2.mean()) # 0.82 -> 0.86
2. 모델 학습
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_pre = logi_model.predict(X_test)
logi_pre
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))
예측의 불확실성
# 실수 표현방법 변경
pd.options.display.float_format = '{:.15f}'.format
# pd.reset_option('display.float_format') 되돌리는 방법
# 10개의 X_test 확인하기
# e 지수값 (float 형태)
# float 값이 너무 크거나 너무 작을 경우 과학적으로 표기하는 방법 -> 지수표기법
pd.DataFrame(logi_model.predict_proba(X_test.iloc[:10]))
# 가로 -> label 답 데이터 값
# 세로 -> 이미지
1번 그림을 확인 해 보자
plt.imshow(X_test.iloc[1].values.reshape(28,28), cmap='gray')
plt.show()
'Machine Learning' 카테고리의 다른 글
[Machine Learning] Colab사용 OpenCV 실습 (0) | 2022.07.20 |
---|---|
[Machine Learning] 타이타닉 데이터 활용하여 생존/사망 분류 실습02 (0) | 2022.07.19 |
[Machine Learning] 타이타닉 데이터 활용하여 생존/사망 분류 실습01 (0) | 2022.07.19 |
[Machine Learning] Pandas와 Matplotlib을 사용해서 카카오톡 대화 전처리 실습 (0) | 2022.07.12 |