kfold,stratifiedKFold

jh_k·2023년 2월 14일
0

데이터 분석

목록 보기
14/17
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split,KFold
from sklearn.tree import DecisionTreeClassifier
import numpy as np
import pandas as pd

iris data 를 통하여 간단한 실습해보겠습니다.

iris = load_iris()
features = iris.data
label = iris.target
# train_test_split
x_train,x_test,y_train,y_test = train_test_split(features,label,test_size=0.2,random_state=121)
dt_clf = DecisionTreeClassifier(random_state=156)

iris_df = pd.DataFrame(iris.data,columns=iris.feature_names)
iris_df['label'] = iris.target
  1. kfold
# 5개의 폴드 세트로 분리하는 kfold객체와 폴드 세트별 정확도를 담을 리스트 객체 생성.
kfold = KFold(n_splits=5)
cv_accuracy= []


n_iter=0
# KFold객체의 split() 호출하려면 폴드 별 학습용,검증용테스트의 로우 인덱스를 array로 반환
for train_index,valid_index in kfold.split(x_train):
    # kfold.split() 으로 변환된 인덱스를 이용하여 학습용,검증용 데이터 추출
    x_train1, x_valid = x_train[train_index], x_train[valid_index]
    y_train1, y_valid = y_train[train_index], y_train[valid_index]
    # 학습 및 예측
    dt_clf.fit(x_train1,y_train1)
    pred = dt_clf.predict(x_valid)
    n_iter +=1
    # 반복 시 마다 정확도 측정
#     accuracy = np.round(np.mean(pred == y_valid),4)와 같다
    accuracy = np.round(accuracy_score(y_valid,pred),4)
    train_size = x_train1.shape[0]
    valid_size = x_valid.shape[0]
    print(f'#{n_iter} 교차 검증 정확도 :{accuracy} , 학습데이터의 크기: {train_size},검증데이터의 크기: {valid_size}')
    print(f"#{n_iter} 검증 세트 인덱스: {valid_index}")
    cv_accuracy.append(accuracy)

# 개별 iteration별 정확도를 합하여 평균 정확도 계산
print("평균 검증 정확도:",np.mean(cv_accuracy))

#1 교차 검증 정확도 :0.875 , 학습데이터의 크기: 96,검증데이터의 크기: 24
#1 검증 세트 인덱스: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
#2 교차 검증 정확도 :0.9583 , 학습데이터의 크기: 96,검증데이터의 크기: 24
#2 검증 세트 인덱스: [24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47]
#3 교차 검증 정확도 :1.0 , 학습데이터의 크기: 96,검증데이터의 크기: 24
#3 검증 세트 인덱스: [48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71]
#4 교차 검증 정확도 :0.9583 , 학습데이터의 크기: 96,검증데이터의 크기: 24
#4 검증 세트 인덱스: [72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95]
#5 교차 검증 정확도 :0.9167 , 학습데이터의 크기: 96,검증데이터의 크기: 24
#5 검증 세트 인덱스: [ 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
114 115 116 117 118 119]
평균 검증 정확도: 0.9416599999999999

각 교차검증에서 사용된 index번호와 그때 accuray값을 통하여 평가
최종 평균accuracy를 통하여 모델 자체의 성능을 평가해 볼수 있다.

  1. stratifiedKFold

stratifiedKfold 는 기본 kfold와 다르게 인덱스를 계층적으로 추출할 수있다 이렇게 교차검증일 실시하면 데이터의 불균형을 막을 수있다는 장점이 있다.

from sklearn.model_selection import StratifiedKFold

dt_clf = DecisionTreeClassifier(random_state=156)

skfold = StratifiedKFold(n_splits=5)
n_iter = 0
cv_accuracy = []

for train_index,valid_index in skfold.split(iris.data,iris.target):
    # StratifiedKFold.split() 으로 변환된 인덱스를 이용하여 학습용,검증용 데이터 추출
    x_train_1, x_valid_1 = iris.data[train_index], iris.data[valid_index]
    y_train_1, y_valid_1 = iris.target[train_index], iris.target[valid_index]
    # 학습 및 예측
    dt_clf.fit(x_train_1,y_train_1)
    pred = dt_clf.predict(x_valid_1)
    n_iter +=1
    # 반복 시 마다 정확도 측정
    accuracy = np.round(accuracy_score(y_valid_1,pred),4)
    train_size = x_train_1.shape[0]
    valid_size = x_valid_1.shape[0]
    print(f'#{n_iter} 교차 검증 정확도 :{accuracy} , 학습데이터의 크기: {train_size},검증데이터의 크기: {valid_size}')
    print(f"#{n_iter} 검증 세트 인덱스: {valid_index}")
    cv_accuracy.append(accuracy)

# 개별 iteration별 정확도를 합하여 평균 정확도 계산
print("평균 검증 정확도:",np.mean(cv_accuracy))

#1 교차 검증 정확도 :0.9667 , 학습데이터의 크기: 120,검증데이터의 크기: 30
#1 검증 세트 인덱스: [ 0 1 2 3 4 5 6 7 8 9 50 51 52 53 54 55 56 57
58 59 100 101 102 103 104 105 106 107 108 109]
#2 교차 검증 정확도 :0.9667 , 학습데이터의 크기: 120,검증데이터의 크기: 30
#2 검증 세트 인덱스: [ 10 11 12 13 14 15 16 17 18 19 60 61 62 63 64 65 66 67
68 69 110 111 112 113 114 115 116 117 118 119]
#3 교차 검증 정확도 :0.9 , 학습데이터의 크기: 120,검증데이터의 크기: 30
#3 검증 세트 인덱스: [ 20 21 22 23 24 25 26 27 28 29 70 71 72 73 74 75 76 77
78 79 120 121 122 123 124 125 126 127 128 129]
#4 교차 검증 정확도 :0.9667 , 학습데이터의 크기: 120,검증데이터의 크기: 30
#4 검증 세트 인덱스: [ 30 31 32 33 34 35 36 37 38 39 80 81 82 83 84 85 86 87
88 89 130 131 132 133 134 135 136 137 138 139]
#5 교차 검증 정확도 :1.0 , 학습데이터의 크기: 120,검증데이터의 크기: 30
#5 검증 세트 인덱스: [ 40 41 42 43 44 45 46 47 48 49 90 91 92 93 94 95 96 97
98 99 140 141 142 143 144 145 146 147 148 149]
평균 검증 정확도: 0.9600200000000001

kfold를 할때보다 성능이 더 좋아진것을 확인 할 수있고 인덱스 번호또한 좀더 랜덤하게 뽑아서 데이터의 불균형을 막은것을 볼 수있다.

  1. cross_val_score
    위에 코드처럼 index를 뽑아 하드 코딩하지 않고 라이브러리를 통하여 평가값을 바로 출력해주는 알고리즘으로 기본적으로 stratifiedkfold방식을 따른다.
from sklearn.model_selection import cross_val_score,cross
dt_clf = DecisionTreeClassifier(random_state=156)

data = iris_data.data
label = iris_data.target

scores = cross_val_score(dt_clf,data,label,cv=3,scoring="accuracy")
mean_score = np.round(np.mean(scores),4)
print(f"교차 검증별 정확도 : {scores}")
print(f"평균 검증 정확도 : {mean_score}"

교차 검증별 정확도 : [0.98 0.94 0.98]
평균 검증 정확도 : 0.9667

profile
Just Enjoy Yourself

0개의 댓글