-
[인프런 - 파이썬 머신러닝 완벽 가이드] 교차 검증Data Science 2020. 6. 8. 00:19반응형
교차검증
train dataset을 다시 분할하여 학습 데이터와
학습된 모델의 성능을 일차 평가하는 검증 데이터로 나눔
1. KFold
from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score from sklearn.model_selection import KFold import numpy as np iris = load_iris() features = iris.data label = iris.target dt_clf = DecisionTreeClassifier(random_state=156) # 5개의 폴드 세트로 분리하는 KFold객체와 폴드 세트별 정확도를 담을 리스트 객체 생성 kfold = KFold(n_splits=5) cv_accuracy = [] n_iter = 0 # KFold 객체의 split() 호출하면 폴드 별 학습용, 검증용 데스트의 로우 인덱스를 array로 반환 for train_index , test_index in kfold.split(features): # kfold.split()으로 반환된 인덱스를 이용하여 학습용, 검증용 테스트 데이터 추출 X_train, X_test = features[train_index] , features[test_index] y_train, y_test = label[train_index] , label[test_index] #학습 및 예측 dt_clf.fit(X_train , y_train) pred = dt_clf.predict(X_test) n_iter +=1 # 매번 정확도 측정 accuracy = np.round(accuracy_score(y_test,pred),4) train_size = X_train.shape[0] test_size = X_test.shape[0] print('\n#{0} 교차 검증 정확도 : {1} , 학습데이터 크기 {2} , 검증데이터 크기 : {3} ' .format(n_iter , accuracy , train_size , test_size)) print('\n#{0} 검증 세트 인덱스 : {1}'.format(n_iter , test_index)) cv_accuracy.append(accuracy) print(np.mean(cv_accuracy))
2.Stratified KFold
from sklearn.model_selection import StratifiedKFold skf = StratifiedKFold(n_splits=3) n_iter = 0 # StratifiedKFold 에서는 데이터셋과 함께 label값을 같이 넘겨야한다. for train_index , test_index in skf.split(iris_df , iris_df['label']): n_iter +=1 label_train = iris_df['label'].iloc[train_index] label_test = iris_df['label'].iloc[test_index] print('## 교차검증 : {0}'.format(n_iter)) print('학습 레이블 데이터 분포 \n',label_train.value_counts()) print('검증 레이블 데이터 분포 \n',label_test.value_counts()) print('=======================================================')
각 dataset의 class별 분포가 비슷하게 만들어졌다.
iris = load_iris() features = iris.data label = iris.target dt_clf = DecisionTreeClassifier(random_state=156) skfold = StratifiedKFold(n_splits=3) n_iter = 0 cv_accuracy = [] # StratifiedKFold의 split() 호출시 반드시 레이블 데이터 셋도 추가 입력 해야한다. for train_index , test_index in skfold.split(features , label): # split()으로 반환된 인덱스를 이용하여 학습용 , 검증용 테스트 데이터 추출 X_train , X_test = features[train_index], features[test_index] y_train , y_test = label[train_index], label[test_index] # 학습및 예측 dt_clf.fit(X_train,y_train) pred = dt_clf.predict(X_test) # 반복시 마다 정확도 측정 n_iter +=1 accuracy = np.round(accuracy_score(y_test,pred),4) train_size = X_train.shape[0] test_size = X_test.shape[0] print('\n#{0} 교차 검증 정확도 : {1} , 학습데이터 크기 {2} , 검증데이터 크기 : {3} ' .format(n_iter , accuracy , train_size , test_size)) print('\n#{0} 검증 세트 인덱스 : {1}'.format(n_iter , test_index)) print('=============================================================\n') cv_accuracy.append(accuracy) print("\n## 교차 검증별 정확도: ", np.round(cv_accuracy,4)) print("\n## 평균 검증 정확도: ", np.mean(cv_accuracy))
KFold 클래스를 이용한 교차 검증 방법
1. 폴드 세트 설정
2. for 루프에서 반복적으로 학습/검증 데이터 추출 및 학습과 예측 수행
3. 폴드 세트별로 예측 성능의 평균을 구하여 최종 성능 평가
의 단계를 거친다.
cross_val_score() 함수는 폴드 세트 추출, 학습/예측, 평가를 한 번에 수행가능
cross_val_score()
from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import cross_val_score, cross_validate from sklearn.datasets import load_iris import numpy as np iris_data = load_iris() dt_clf = DecisionTreeClassifier(random_state=156) data = iris_data.data label = iris_data.target # 성능 지표는 정확도 (accuracy) , 교차 검증 세트 3개 scores = cross_val_score(dt_clf , data, label, scoring='accuracy', cv=3) print(scores) print("교차 검증별 정확도", np.round(scores, 4)) print("평균 검증 정확도", np.round(np.mean(scores), 4))
GridSearchCV
교차 검증과 최적 하이퍼 파라미터 튜닝을 한번에 가능
from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import GridSearchCV , train_test_split from sklearn.metrics import accuracy_score from sklearn.datasets import load_iris iris = load_iris() # 학습데이터와 테스트 데이터로 분리 X_train , X_test , y_train , y_test = train_test_split(iris.data , iris.target, test_size = 0.2 , random_state =121) dtree = DecisionTreeClassifier() # parameter 들을 dictionary 형태로 설정 parameters = {'max_depth' : [1,2,3] , 'min_samples_split':[2,3]} import pandas as pd # param_grid의 하이퍼 파라미터들을 3개의 train, test set fold로 나누어서 테스트 수행 설정 ## refit = True 가 default임 True 면 가장 좋은 파라미터 설정으로 재 학습 시킴 grid_dtree = GridSearchCV(dtree , param_grid=parameters, cv=3 ,refit=True , return_train_score=True) # iris Train 데이터로 param_grid의 하이퍼 파라미터들을 순차적으로 학습/평가 grid_dtree.fit(X_train , y_train) print("grid_dtree" , grid_dtree) #GridSearchCV 결과는 cv_results 라는 딕셔너리로 저장됨 이를 DataFrame으로 변환 scores_df = pd.DataFrame(grid_dtree.cv_results_) scores_df[['params','mean_test_score', 'rank_test_score', 'split0_test_score','split1_test_score', 'split2_test_score']]
위에서 생성한 grid_dtree객체는 fit()을 수행 시 학습이 완료된 Estimator를 내포하고 있으므로
predict()를 통해 아래와 같이 예측도 가능하다.
print("GridSearchCV 최적 파라미터 : " , grid_dtree.best_params_) print("GridSearchCV 최고 정확도 : {0:.4f}" .format(grid_dtree.best_score_)) # refit =True로 설정된 GridSearchCV 객체가 fit()을 수행시 학습이 완료된 Estimator를 내포하고있으므로 predict()를 통해 예측도 가능 pred = grid_dtree.predict(X_test) print("테스트 데이터 세트 정확도 : {0:.4f}".format(accuracy_score(y_test,pred)))
위에서 생성한 grid_dtree객체는 fit()을 수행 시 학습이 완료된 Estimator를 내포하고 있으므로
predict()를 통해 예측도 가능하다.
반응형'Data Science' 카테고리의 다른 글
[인프런 - 파이썬 머신러닝 완벽 가이드]머신러닝 classification(분류) 성능 지표 - 정밀도(Precision)과 재현율(Recall) (0) 2020.06.09 [인프런 - 파이썬 머신러닝 완벽 가이드] 머신러닝 classification(분류) 성능 지표 - 정확도 Accuracy , 오차 행렬 (Confusion Matrix) (0) 2020.06.09 [인프런 - 파이썬 머신러닝 완벽 가이드] 데이터 전처리 (데이터 인코딩과 스케일링) (0) 2020.06.08 [인프런 - 파이썬 머신러닝 완벽 가이드] iris 품종 예측하기 (0) 2020.06.07 [Data Science] 공공데이터 활용해 프랜차이즈 분석하기 (0) 2020.06.06