2

sklearn의 교차 유효성 검사 및 GridSearch에 대한 데이터 세트를 분할하려고합니다. 내 스플릿을 정의하고 싶지만 GridSearch는 내장 된 교차 유효성 검사 메소드 만 사용합니다.사용자 정의 교차 유효성 검사 분할 sklearn

그러나 같은 배의 특정 그룹의 예제가 필요하기 때문에 내장 된 교차 유효성 검사 방법을 사용할 수 없습니다. 예 : [A1, A2, A3, A4, A5, B1, B2, B3, C1, C2, C3, C4, ..., Z1, Z2, Z3]

각 그룹 [A, B, C ...]의 예제가 한 번만 존재하도록 교차 유효성 검사를 수행하려고합니다.

즉 K1에 [D, E, G, J, K ...]가 포함되어 있고 K2에 [A, C, L, M ...]이 있고 K3에 [B, F, I ...가 포함되어 있습니다. ] etc

답변

11

이 유형의 것은 일반적으로 sklearn.cross_validation.LeaveOneLabelOut으로 수행 할 수 있습니다. 그룹을 인코딩하는 라벨 벡터를 만들어야합니다. 즉, K1의 모든 샘플은 1 레이블을 취하고 K2의 모든 샘플은 레이블 2를 사용합니다.

다음은 가짜 데이터로 완전히 실행 가능한 예입니다. 중요한 선은 cv 객체를 생성 한 및 cross_val_score

import numpy as np 

n_features = 10 

# Make some data 
A = np.random.randn(3, n_features) 
B = np.random.randn(5, n_features) 
C = np.random.randn(4, n_features) 
D = np.random.randn(7, n_features) 
E = np.random.randn(9, n_features) 

# Group it 
K1 = np.concatenate([A, B]) 
K2 = np.concatenate([C, D]) 
K3 = E 

data = np.concatenate([K1, K2, K3]) 

# Make some dummy prediction target 
target = np.random.randn(len(data)) > 0 

# Make the corresponding labels 
labels = np.concatenate([[i] * len(K) for i, K in enumerate([K1, K2, K3])]) 

from sklearn.cross_validation import LeaveOneLabelOut, cross_val_score 

cv = LeaveOneLabelOut(labels) 

# Use some classifier in crossvalidation on data 
from sklearn.linear_model import LogisticRegression 

lr = LogisticRegression() 
scores = cross_val_score(lr, data, target, cv=cv) 

를 호출하지만, 당신이 완전히 손으로 당신의 주름을 정의하려는 상황으로 실행하는 것이 가능 물론이다 있습니다. 이 경우 (train, test)의 (예 : list)을 만들어 열차로 가져올 샘플과 각 폴드의 테스트 세트를 나타내는 지표를 통해 표시해야합니다. 이것을 확인해 봅시다 :

# create train and test folds from our labels: 
cv_by_hand = [(np.where(labels != label)[0], np.where(labels == label)[0]) 
       for label in np.unique(labels)] 

# We check this against our existing cv by converting the latter to a list 
cv_to_list = list(cv) 

print cv_by_hand 
print cv_to_list 

# Check equality 
for (train1, test1), (train2, test2) in zip(cv_by_hand, cv_to_list): 
    assert (train1 == train2).all() and (test1 == test2).all() 

# Use the created cv_by_hand in cross validation 
scores2 = cross_val_score(lr, data, target, cv=cv_by_hand) 


# assert equality again 
assert (scores == scores2).all() 
관련 문제