scikit-learn
모델 선택
수색…
교차 검증
예측 함수의 매개 변수를 학습하고 동일한 데이터에서 테스트하는 것은 방법 론적 실수입니다. 방금 본 샘플의 레이블을 반복하면 모델은 완벽한 점수를 얻지 만 아직 예측할 수없는 기능을 예측하지는 못합니다. 보이지 않는 데이터. 이 상황을 오버 피팅 (overfitting )이라고 합니다 . 이를 피하기 위해, (감독 된) 기계 학습 실험을 수행하여 사용 가능한 데이터의 일부를 테스트 세트 X_test, y_test
로 유지하는 것이 X_test, y_test
입니다. "실험"이라는 단어는 상업적 환경에서도 기계 학습이 일반적으로 실험적으로 시작되기 때문에 학술적 용도로만 사용됩니다.
scikit-learn 에서는 train_test_split 도우미 함수를 사용하여 무작위로 훈련 및 테스트 세트로 분할 할 수 있습니다. 선형 지원 벡터 머신에 맞게 조리개 데이터 세트를로드 해 봅시다.
>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm
>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))
이제 분류 기준을 테스트 (평가)하기 위해 데이터의 40 %를 보유하면서 교육 세트를 신속하게 샘플링 할 수 있습니다.
>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split(
... iris.data, iris.target, test_size=0.4, random_state=0)
>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))
자, 우리가 훈련과 시험 세트를 가지고 있다면 그것을 사용할 수 있습니다 :
>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
케이 폴드 교차 검증
K- 폴 교차 검증은 열차 / 시험 분할의 단일 시험과 관련된 변동을 줄이기 위해 열차 / 시험 분할 절차를 여러 번 반복하는 체계적인 프로세스입니다. 기본적으로 전체 데이터 세트를 K 개의 동일한 크기 "폴드"로 분할하고 각 폴드는 모델을 테스트하기 위해 한 번 사용하고 모델을 훈련하기 위해 K-1 번 사용합니다.
Scikit 라이브러리에는 여러 가지 접기 기술을 사용할 수 있습니다. 사용법은 입력 데이터 특성에 따라 다릅니다. 몇 가지 예는 다음과 같습니다.
케이 폴드
기본적으로 전체 데이터 세트를 K 개의 동일한 크기 "폴드"로 분할하고 각 폴드는 모델을 테스트하기 위해 한 번 사용하고 모델을 훈련하기 위해 K-1 번 사용합니다.
from sklearn.model_selection import KFold
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = KFold(n_splits=3, random_state=0)
for train_index, test_index in cv.split(X):
... print("TRAIN:", train_index, "TEST:", test_index)
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1 3] TEST: [2]
TRAIN: [0 1 2] TEST: [3]
StratifiedKFold
는 StratifiedKFold
폴드를 반환하는 k-fold의 변형입니다. 각 세트에는 전체 집합과 각 대상 클래스의 샘플 백분율이 거의 같습니다
ShuffleSplit
독립적 인 기차 / 테스트 데이터 세트 스플릿의 사용자 정의 번호를 생성하는 데 사용됩니다. 샘플을 먼저 섞은 다음 기차 세트와 테스트 세트로 나눕니다.
from sklearn.model_selection import ShuffleSplit
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = ShuffleSplit(n_splits=3, test_size=.25, random_state=0)
for train_index, test_index in cv.split(X):
... print("TRAIN:", train_index, "TEST:", test_index)
TRAIN: [3 1 0] TEST: [2]
TRAIN: [2 1 3] TEST: [0]
TRAIN: [0 2 1] TEST: [3]
StratifiedShuffleSplit
은 계층화 된 분할을 반환하는 ShuffleSplit의 변형입니다. 즉, 전체 집합과 마찬가지로 각 대상 클래스에 대해 동일한 비율을 유지함으로써 분할을 생성합니다.
Leave One / p Out, TimeSeriesSplit (K-fold의 변형)과 같은 다른 폴딩 기술은 scikit model_selection 라이브러리에서 사용할 수 있습니다.