본문 바로가기
개발 Tools/파이썬_Deep learning & ML

머신러닝 KFold (n_splits)

by 전컴반 2021. 7. 13.
반응형

우리가 데이터를 주고 훈련을 시킬 때,

일정 부분은 훈련만 시키고 이게 잘 훈련됐는지 판단할 검증 데이터가 있어야 합니다.

우린 수능을 보기 위해 모의고사를 준비합니다.

 

모의고사 == 학습

수능 == 검증

 

나에게 5개의 시험지가 주어졌다면, 4개는 풀면서 오답도 체크하고 풀이법도 익힙니다. 그리고 나머지 1개로 내가 지금까지 공부를 잘했나 평가하는 것입니다.

머신러닝에서는 데이터를 나누는데 여러가지 방법이 있습니다. 하나의 방법 중 하나인 KFold를 이용해보겠습니다.

 

라이브러리

 

필요한 라이브러리를 불러 옵니다

 

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
import numpy as np
from sklearn.model_selection import KFold

 

accurcy_score는 점수를 낼 때 사용합니다.

이번 모델은 결정 트리를 사용합니다. 꼭 결정 트리가 아니어도 됩니다.

 

데이터 불러오기

 

붓꽃 데이터를 불러옵니다. 그리곤 data와 target을 나눕니다.

 

data = iris.data
target = iris.target
clf = DecisionTreeClassifier(random_state=1)

 

iris.data 에는  [[ 5.6, 4.5, 2.5, 1.4]..] 이런 형태로 들어있습니다. iris.target에는 [[0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]...]

 

이런 애들로 결정 트리의 객체를 생성합니다. 우린 KFold를 이용해 데이터를 나눠야 합니다. 

 

KFold

 

5개로 나눌 것입니다. 행과 열이 5인 정사각 행렬을 그린다고 생각하시면 됩니다.

그렇다면 아래와 같은 그림으로 됩니다.

 

 

그리고 각각의 회차에 대한 정확도를 알아내고 평균으로 이 모델의 성능을 평가합니다. 

만약 150개의 데이터가 있다면 한 번은 (0-29) 번까지를 검증으로 쓰고 다음번엔 (30-59) 번을 검증으로 사용하는 방식입니다.

 

코드를 보면설 설명하겠습니다.

 

Kfold = KFold(n_splits=5)
accurcy_ac = []  # 각각의 정확도 담을 리스트
n_iter = 0

for train_index, test_index in Kfold.split(data):
    X_train, X_test = data[train_index], data[test_index]
    y_train, y_test = target[train_index], target[test_index]
    clf.fit(X_train, y_train)
    pred = clf.predict(X_test)
    n_iter += 1

    accurcy = np.round(accuracy_score(y_test, pred), 4)
    train_size = X_train.shape[0]
    test_size = X_test.shape[0]
    print(f"{n_iter}번째 교차 검증 정확도: {accurcy} 학습 데이터 크기: {train_size} 검증 데이터: {test_size}")
    print(f"{n_iter}번째 검증 세트 인덱스: {test_index}\n")
    accurcy_ac.append(accurcy)

print(f"평균 검증 정확도: {np.mean(accurcy_ac)}")

출력
1번째 교차 검증 정확도: 1.0 학습 데이터 크기: 120 검증 데이터: 30
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
 24 25 26 27 28 29]

2번째 교차 검증 정확도: 1.0 학습 데이터 크기: 120 검증 데이터: 30
2번째 검증 세트 인덱스: [30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
 54 55 56 57 58 59]

3번째 교차 검증 정확도: 0.9 학습 데이터 크기: 120 검증 데이터: 30
3번째 검증 세트 인덱스: [60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
 84 85 86 87 88 89]

4번째 교차 검증 정확도: 0.9333 학습 데이터 크기: 120 검증 데이터: 30
4번째 검증 세트 인덱스: [ 90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107
 108 109 110 111 112 113 114 115 116 117 118 119]

5번째 교차 검증 정확도: 0.7333 학습 데이터 크기: 120 검증 데이터: 30
5번째 검증 세트 인덱스: [120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
 138 139 140 141 142 143 144 145 146 147 148 149]

평균 검증 정확도: 0.91332

 

이처럼 출력됩니다. 

각각의 인덱스를 부여하여 훈련 데이터와 검증 데이터를 나눕니다.

n_splits=5 이면 총 150개의 데이터라 했을 땐 한번 시행할 때마다 30개씩 사용합니다.

 

그리고 한번 수행할 때마다 정확도를 저장하여 평균을 냅니다.

 

 

 

 

 

반응형

댓글