ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [인프런 - 파이썬 머신러닝 완벽 가이드] 교차 검증
    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()를 통해 예측도 가능하다.

     

    반응형
Designed by Tistory.