python 및 머신러닝/파이썬 라이브러리를 활용한 머신러닝

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

java개발자 2017. 8. 28. 10:50

모델 평가와 성능 향상


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")