728x90
교차 검증이 무엇인가요?
교차검증이란 모델 학습 시 데이터를 훈련용과 검증용으로 교차로 선택하는 방법
이전에 150개 중 120개만 데이터 훈련용, 30개를 검증용으로 사용했다면 단 1번만 훈련이 된다.

이를 보안하기 위하여 학습용 데이터 셋을 분할시켜 정확도를 올림.

예시로 150개의 자료가 있다면 대략 5등분 하여(유효한 수의 데이터셋을 유지한 채) 4 x Train(초록색)을 이용해서 학습을 시킨다음 1 x 검증용(파란색) 데이터로 정확도를 측정을 총 5번 반복해서 진행하는 과정이다.
교차 검증 왜 하나요?
장점
- 특정 데이터셋에 대한 과적합 방지
- 더욱 일반화된 모델 생성 가능
- 데이터셋 규모가 적을 시 과소적합 방지
단점
- 학습 및 검증에 필요한 시간이 증가
코드를 통하여서 알아보자.
1. 주요 라이브러리 임포트
# 필수 라이브러리 호출
from sklearn.datasets import load_iris # 품종 데이터셋
from sklearn.tree import DecisionTreeClassifier # 의사결정나무 알고리즘
from sklearn.model_selection import KFold # 교차검증 자료 나누기
from sklearn.metrics import accuracy_score as acc_sc # 평가지표
from sklearn.model_selection import train_test_split # 훈련, 검증용 자료 나누기
import numpy as np
import pandas as pd
2. 데이터 불러오기
# 데이터 재정의
iris = load_iris()
features = iris.data # X값
label = iris.target # y값
dt_clf = DecisionTreeClassifier(random_state=156)
# kfold에서 k= 5로 놓자. (5등분한다)
kfold = KFold(n_splits=5)
print('데이터 셋의 크기:', features.shape[0])
# 데이터 셋의 크기: 150
3. 학습 수행
n_iter = 0
cv_accuracy = [] # CV : cross validation
for train_index, val_index in kfold.split(label):
# Kfold.split()으로 반환된 인덱스를 통해 학습용, 검증용 데이터 정의
X_val, X_train = features[val_index], features[train_index]
y_val, y_train = label[val_index], label[train_index]
# 각 CV별 학습 및 예측
dt_clf.fit(X_train,y_train) # 학습
pred = dt_clf.predict(X_val) # 예측
# 정확도 지표 계산
accuracy = np.round(acc_sc(y_val, pred),3)
train_size = X_train.shape[0]
val_size = X_val.shape[0]
n_iter += 1
print(f'\n #{n_iter} CV 정확도:{accuracy}, 학습데이터 크기:{train_size}, 검증데이터 크기 : {val_size}')
print(f'#{n_iter} 검증 데이터셋 인덱스 :{val_index}')
cv_accuracy.append(accuracy)
# 개별 iteration 별 정확도 평균내기
print(f'\n ## 평균 CV정확도 :{np.mean(cv_accuracy)}')
<정확표 값>
#1 CV 정확도: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 CV 정확도:0.967, 학습데이터 크기: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 CV 정확도:0.867, 학습데이터 크기: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 CV 정확도:0.933, 학습데이터 크기: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 CV 정확도:0.733, 학습데이터 크기: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]
## 평균 CV정확도 :0.9
cv_accuracy
# [1.0, 0.967, 0.867, 0.933, 0.733]
728x90
'AI > [ML]' 카테고리의 다른 글
[ML] 머신러닝 분류 (0) | 2023.03.30 |
---|---|
[ML] Scikit-learn 을 활용한 붓꽃 품종 예측하기 (0) | 2023.02.08 |