데이터

핸즈온 머신러닝 3장 복습

So_Bee_93 2020. 7. 13. 19:18

(지극히 개인적인 포스팅)

 

오늘은 머신러닝 분류기 모델을 만들어 보겠습니다 ! 

 

 

 

먼저 예제로 갖고올 데이터 셋인 mnist  데이터를 불러오겠습니다 

mnist 데이터는 이미지 데이터로 

머신러닝을 이용해서 mnist의 이미지(숫자)를 분류해볼게요! 

 

mnist 데이터는 딕셔너리 형태처럼 구성되어 있습니다. 

저희는 여기서 data 키와 target 키를 이용할게요 ! 

 

 

x에는 mnist의 데이터를 

y에는 mnist의 타겟을 저장할게요 

x를 살펴보니  70000,784로 되어 있네요 

 

이는 총 7만건의 데이터가 있고 각각의 데이터는 784개의 특성으로 구성되어 있음을 얘기합니다 

 

 

 

x안에 있는 데이터 중 한개를 살펴보니 위 그림과 같이 되어 있네요! 

위 숫자가 총 784개가 있고 각각의 숫자는 픽셀을 의미합니다 ! 

 

 

 

 

 

숫자로 되어있는 데이터를  reshape을 통해 행렬로 바꾸고 이를 

이미지화 했습니다 ! 숫자 5라고 보이네요 ! 

 

 

 

그럼 이제 분류기를 만들어 볼게요 ! 

첫번째 분류기는 이진 분류기입니다.

 

 

이진 분류기에서 SGDCClassifier을 불러 왔습니다. 

1000번을 반복하고 해당 모델에 X_train과 y_train_5을 학습 시켰어요 

tol : tol에 지정한 만큼 손실함수의 값이 감소되지 않으면 반복을 중단하라는 의미 

 

 

 

 

처음에 저장했었던 some_digit 객체를 불러왔어요

근데 predict 메소드는 2차원 배열로 놓기 때문에 some_digit을 한번 더 []로 감싸

같은 형태로 바꿔주었습니다.

 

True라고 뜨네요! 제대로 학습된걸 확인했습니다 

 

 

교차검증을 사용한 정확도 측정 

교재에서는 cross_val_score을 불러왔는데

3번의 교차 검증의 정확도 값이 모두 95퍼센트를 넘습니다 !! 

근데 사실 생각해보면 5가 맞냐 아니냐를 10개의 숫자에서 고르는 거기 때문에 높을 수 밖에없죠 

이런게 데이터 분석의 함정이자 매력인거 같습니다 

 

 

 

croos_val_predict는 예측값을 리턴해주는 명령언데요 

y_train_pred에 해당 값을 넣어서 확인했어요

이를 통해  훈련세트의 모든 샘플에 대해 깨끗한 예측을 얻게 됩니다 

(깨끗하다는 뜻은 모델이 훈련하는 동안 보지 못했던 데이터에 대해 예측했다는 의미입니다) 

 

 

 

오차행렬에 대입했습니다. 2x2행렬도 나오는데 위를 살펴보면 실제 5가 아닌 것 중에서 아니라고 맞춘것은 53892개 

반대로 실제 5가 아닌 것 중에서 맞다라고 거짓양성의 값은 687개라는 의미입니다. 

 

오창행렬을 통해 우리는 정밀도와 재현율의 수치를 알 수 있습니다.

 

정밀도와 재현율 수치 중 어떤 데이터를 분석하냐에 따라 무엇이 더 중요한지 달라집니다. 

 

 

 

사이킷 런에서 임계값을 직접 지정할 수는 없지만 예측에 사용한 점수는 확인할 수 있습니다. 

method= 'decision_function'을 넣으면 각 샘플의 점수를 얻을 수 있습니다. 

또한 precision_recall_curve를 임포트하면 각각의 precision recalls thresholds 를 살펴 볼수 있습니다. 

 

 

 

 

 

decision_fuction을 하면 y_score 즉 precision의 score를 알 

수 있습니다. 이 precision의 score를 threshold 이상이면 true 아니면 false로 나오는 방식입니다.  

 

precision과 recall의 변화를 그래프로 그렸습니다.  

정밀도가 90퍼 일때의 재현율%를 확잉ㄴ할 수 있었습니다. 

 

 

 

 

recall/precision 그래프도 그려보았습니다. 

 

 

정확도가 90 이상인 것들의 threshold를 새로운 변수에 대입을 했습니다. 

그리고 이를 y_scores와 비교해서 그 이상인것 만 보겠다는 의미입니다. 

 

 

위 코드는  정확도가 90퍼센트 이상일 때의 threshold를 새로 만들고 

y_scores는 그 이상인 것만 보겠다고 정했습니다                         

 

 

 

이번엔 randomforest classfier 분류기를 통해 시각화 하겠습니다 .

 

 

랜덤 포레스트의 roc 곡선이에요 

roc 곡선은 거짓양성비율(fpr)에 대한 진짜 양성비율(재현율)입니다 

 

그래프가 왼쪽 끝으로 최대한 붙을수록 좋은 그래프라고 할 수 있습니다. 

 

이어서 계속 !