데이터 세트를 분할하기위한 적절한 전략은 무엇입니까?
나는 다음과 같은 접근 방식에 대한 피드백을 요청 (안 같은 개별 매개 변수에 대한 test_size
또는 n_iter
,하지만 내가 사용하는 경우 X
, y
, X_train
, y_train
, X_test
, 그리고 y_test
적절하고 순서가 의미가있는 경우) :
( scikit-learn 문서 에서이 예제를 확장 )
1. 데이터 셋로드
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2. 교육 및 테스트 세트로 분할 (예 : 80/20)
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
3. 견적자를 선택하십시오
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4. 교차 검증 반복자를 선택하십시오
from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
5. 하이퍼 파라미터 조정
훈련 세트 에 교차 검증 반복자를 적용
from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)
6. 학습 곡선으로 디버그 알고리즘
X_train
훈련과 테스트 세트로 무작위로 10 회 분할됩니다 ( n_iter=10
). 훈련 점수 곡선의 각 지점은 모델이 첫 i 훈련 예제 에서 훈련되고 평가 된 평균 10 점 입니다. 교차 검증 점수 곡선의 각 지점은 모델이 첫 번째 i 훈련 예제에서 학습되고 테스트 세트의 모든 예제에서 평가 된 평균 10 점 입니다.
from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()
plot_learning_curve () 는 현재 개발 버전의 scikit-learn (0.15-git)에서 찾을 수 있습니다.
7. 시험 세트에 대한 최종 평가
classifier.score(X_test, y_test)
7a. 중첩 교차 검증을 사용하여 모델 선택에서 오버 피팅 테스트 (전체 데이터 세트 사용)
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
추가 질문 : 7 단계를 중첩 교차 검증으로 대체하는 것이 합리적입니까? 또는 중첩 된 cv가 7 단계를 보완하는 것으로 간주되어야합니다.
(코드는 scikit-learn에서 k-fold cross validation으로 작동하지만 shuffle & split에서는 작동하지 않는 것 같습니다. 따라서 cv
코드를 작동 시키려면 위의 코드를 변경해야합니다)
8. 전체 데이터 세트에서 최종 모델 훈련
classifier.fit(X, y)
편집 : 이제 7a 단계 가이 순서에서 의미가 없다는 맹세에 동의합니다. 그래서 나는 그것을 채택하지 않을 것입니다.