해결된 질문
작성
·
189
·
수정됨
1
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('#{0} 검증 세트 인덱스:{1}'.format(n_iter,test_index))
cv_accuracy.append(accuracy)
# 교차 검증별 정확도 및 평균 정확도 계산
print('\n## 교차 검증별 정확도:', np.round(cv_accuracy, 4))
print('## 평균 검증 정확도:', np.mean(cv_accuracy))
안녕하세요 선생님. k-fold 작동방식에 관한 질문이 있어 글 남깁니다.
전체 데이터셋에서 테스트셋을 제외하고, k개의 데이터셋으로 나누어 학습과 검증을 k번 반복한다. 그리고, 교차 검증 최종 평가는 k번의 학습과 검증에서의 평가지표를 평균낸다. 정도로 이해하였습니다.
여기서 저의 궁금점은 다음과 같습니다.
k번의 학습과 검증을 반복하면서 가장 좋았던 iteration의 모델을 최종 모델로 가져가는것인지, 아니면 k번의 학습을 통한 모델의 파라미터들을 평균을 내어 최종 모델을 새로 구하는 것인지 궁금합니다.
최종 평가지표는 k번의 학습과 검증에서의 평가지표 평균이 아닌, 테스트셋에 대한 평가지표가 더 적당하지 않은지 궁금합니다.
위 코드에서처럼 for문 안에 fit을 통해 모델 학습을 시킬 때, 이전 iteration에서의 모델 학습과는 전혀 연관되지 않게 새로 학습을 시작하는것인지 아니면 이어서 학습하는 것인지 궁금합니다.
답변 1
1
안녕하십니까,
k번의 학습과 검증을 반복하면서 가장 좋았던 iteration의 모델을 최종 모델로 가져가는것인지, 아니면 k번의 학습을 통한 모델의 파라미터들을 평균을 내어 최종 모델을 새로 구하는 것인지 궁금합니다.
=> 일반적으로는 K번 평균을 내어서 가장 평균이 높은 모델을 선택합니다.
최종 평가지표는 k번의 학습과 검증에서의 평가지표 평균이 아닌, 테스트셋에 대한 평가지표가 더 적당하지 않은지 궁금합니다.
=> 네 맞습니다. 최종 평가지표는 테스트 셋 평가 지표입니다. 다만 테스트 세트로 평가이전에 사전 모의 고사 형식으로 평가를 해보는 측면도 있고, 테스트 데이터 자체가 작을 경우에는 오히려 테스트 결과에 신뢰성이 떨어질 수 있다는 측면등을 감안해서 최종 테스트 데이터에서 평가를 하기 전에 Cross validation 기반으로 검증 평가를 하는 것입니다.
위 코드에서처럼 for문 안에 fit을 통해 모델 학습을 시킬 때, 이전 iteration에서의 모델 학습과는 전혀 연관되지 않게 새로 학습을 시작하는것인지 아니면 이어서 학습하는 것인지 궁금합니다.
=> 이전 모델과 전혀 연관되지 않게 새로 학습을 시작합니다.
감사합니다.
모두 이해되었습니다.
답변해주셔서 감사합니다~~