원쥬
원주는 공부중
원쥬
전체 방문자
오늘
어제
  • 분류 전체보기 (29)
    • Django (0)
    • Vue3 (2)
    • Android (7)
    • Arduino (0)
    • JSPServlet (0)
    • CSS (0)
    • HTML (0)
    • Java (9)
      • Java (9)
      • JavaFestival (0)
    • JavaScript (0)
    • Machine Learning (5)
    • Python (2)
    • Project (1)
      • first_project (1)
      • second_project (0)
      • third_project (0)
    • Tistory (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • while문 예제
  • v-bind
  • Vue3
  • JSON
  • button
  • AndroidStudio
  • API
  • 폰트바꾸기
  • matplotlib
  • 사라지게하기
  • textarea 오른쪽 하단
  • 안드로이드
  • machinelearning
  • invisible
  • while문
  • 손글씨데이터
  • while
  • visible
  • pandas
  • 안드로이드 스튜디오
  • vscode
  • Android Stuido
  • Python
  • 영화데이터
  • volley
  • Ref
  • v-model
  • v-on
  • android
  • machine learning

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
원쥬

원주는 공부중

[Machine Learning] 손글씨데이터 활용 분류 실습
Machine Learning

[Machine Learning] 손글씨데이터 활용 분류 실습

2022. 7. 20. 01:26

목표

 - 손글씨(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
    원쥬
    원쥬
    Git : https://github.com/wonjuju/

    티스토리툴바