본문 바로가기
python 및 머신러닝/파이썬 라이브러리를 활용한 머신러닝

파이썬 라이브러리를 활용한 머신러닝 5장

by java개발자 2017. 8. 28.

모델 평가와 성능 향상


5.1 교차 검증(306p)

k겹 교차 검증

 

 폴드1

 폴드2

 폴드3

 폴드4

 폴드5
 분할1

 테스트

 훈련

 

 

 

 분할2

 

 

 

 

 

 분할3

 

 

 

 

 

 분할4

 

 

 

 

 

 분할5

 

 

 

 

 

scores = sklearn.model_selection.cross_val_score(LogisticRegression(), iris.data, iris.target cv=5)


5.1.3 계층별 k-겹 교차 검증(그룹간의 비율을 일정하게 유지)

기본값

회귀-> k-겹 교차 검증

분류-> 계층별 k-겹 교차 검증


*분류에 기본 k-겹 교차 검증 이용하기

kfold = sklearn.model_selection.KFold(n_split=5, shuffle=True, random_state=0)    // shuffle : 샘플의 순서를 섞기

scores = cross_val_score(LogisticRegression(), iris.data, iris.target, cv=kfold)


LOOCV

폴드 하나에 샘플 하나만 들어 있는 k-겹 교차검증


임의 분할 교차 검증

데이터를 부분 샘플링 한다.

shffle_split = sklearn.model_selection.ShuffleSplit(test_size=0.5, train_size=0.5, n_splits=10)    // 실수를 입력하면 비율이 된다.

scores = cross_val_score(LogisticRegression(), iris.data, iris.target, cv=shffle_split)


* ShuffleSplit의 계층별 버전 : StratifiedShuffleSplit


그룹별 교차 검증(폴드의 단위가 그룹이 된다.)

groupKFold = sklearn.model_selection.GroupKFold(n_splits=3)

groups = [0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3]

scores = cross_val_score(LogisticRegression(), X, y, groups, cv=groupKFold)


==> KFold, StratifiedKFold, GroupKFold 를 가장 널리 사용함


5.2 그리드 서치(316p)

5.2.1 간단한 그리드 서치(직접 구현)

5.2.2 매개변수 과대적합과 검증 세트(직접구현)

데이터 = 훈련 + 검증 + 테스트 세트

데이터 세트를 훈련, 검증으로 나눠서 좋은 매개변수를 찾고, 마지막에 테스트세트로 정확도를 측정한다.(결국 테스트세트의 정확도가 높았던 매개변수를 찾는 것임.)


5.2.3 교차 검증을 사용한 그리드 서치

직접구현

SVC에서 gamma(6단계), C(6단계), 5-겹 교차 검증 : 6*6*5 = 180번의 모델을 생성해야 한다.


그리드서치 GridSearchCV

param_grid = {'C' : [,,,], 'gamma' : [,,,]}

grid_search = GridSearchCV(SCV(), param_grid, cv=5)           // 5겹 교차검증

grid_search.fit(X_train, y_train)                                        // X_train데이터를 훈련, 검증 세트로 나누고, 교차검증 및 매개변수를 돌려서 최적의 매개변수 찾음. 또한 최종 모델을 새로 만듬.

grid_search.score(X_test, y_test)

print(grid_search.best_params_)

print(grid_search.best_score_)

print(grid_search.best_estimator_)


비대칭 매개변수 그리드 탐색(조건부...)

예) kernel='linear'이면 C 매개변수만 사용한다.

kernel='rbf' 이면 C와 gamma 모두 사용한다.

param_grid = [

{'kernel' : ['linear'], 'C' : [,,,]}

, {'kernel' : ['rbf'], 'C' : [,,,], 'gamma' : [,,,]}

]


그리드 서치에 다양한 교차 검증 적용

GridSearchCV는 분류에 기본적으로 계층형 k-겹 교차검증을 사용하고

회귀에는 k-겹 교차 검증을 사용한다.

그러나 다른 교차검증 분할기를 사용할 수도 있다(311p)


중첩 교차 검증

데이터 = 훈련 + 테스트

훈련 -> 그리드서치(자체적으로 훈련데이터를 훈련과 검증으로 나눠서 매개변수 찾음)

그런데, 데이터를 훈련 + 테스트로 나누는 과정도 여러번 할 수 있다.


scores = cross_val_score(GridSearchCV(SCV(), param_grid, cv=5), iris.data, iris.target, cv=5)            // 대박!!!  -> 직접구현(333p)

scores

scores.mean()


CPU 병렬화 : n_jobs 매개변수

scikit-learn에서는 병렬화를 중첩해서 사용할 수 없음

spark-sklearn 이용


5.3 평가 지표와 측정

5.3.1 최종 목표를 기억하라


5.3.2 이진 분류의 평가 지표

에러의 종류: 거짓 양성, 거짓 음성

불균형 데이터셋


오차 행렬

 음성

 TN

 FP

 양성

 FN

 TP

 

 음성으로 예측

 양성으로 예측


정확도 = (TP + TN) / 전체


정밀도 = TP / (TP + FP)

양성으로 예측된 것 중에서 진짜 양성이 얼마인가?


재현율 = TP / (TP + FN)

전체 양성 중에서 진짜 양성이 얼마인가? (진짜 양성 비율TPR, 민감도sensitivity, 적중률hit rate)


f-점수 = 2*정밀도*재현율 / (정밀도 + 재현율)


FPR거짓 양성 비율 = FP / (FP + TN)

전체 음성 중에서 양성으로 예측된 것이 얼마인가?

ROC 곡선 = FPR / TPR(재현율)

AUC = ROC 곡선의 면적


* 불균형한 데이터셋에서는 정확도보다 AUC가 훨씬 좋은 지표이다.


5.3.3 다중 분류의 평가 지표


5.3.4 회귀의 평가 지표

scores = cross_val_score(SVC(), digits.data, digits.target==9, scoring="accuracy")   

scores = cross_val_score(SVC(), digits.data, digits.target==9, scoring="roc_auc")