2017-11-23 3 views
-1

동일한 분류 기준의 예측을 비교하고 싶습니다. 예 :으로 선형 판별 분석 분류 기준을 선택했습니다.Sklearn과 함께 교차 유효성 검사 (Kfold)를 사용하여 레이블을 예측하는 방법

따라서 sklearn의 문서를 살펴 보았습니다. 나는이 두 개의 웹 사이트 발견 : Link 1 Link 2

내가 그들을 함께 연결하고 싶습니다 : (예를 Kfold에 대한) 교차 유효성 검사의 도움으로 라벨의 예측을.

그러나 코드를 관리 할 수 ​​없습니다.

from sklearn.model_selection import cross_val_predict, KFold 
from sklearn.model_selection import train_test_split 
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis 

X = np.array([[1, 2], [2, 4], [3, 2], [4, 4], [5, 2], [6, 4], [7, 2], [8, 4]]) 
Y = np.array([1, 2, 3, 4, 5, 6, 7, 8]) 

Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,Y,train_size=0.5,random_state=1) 

clf = LinearDiscriminantAnalysis() 
clf.fit(Xtrain, Ytrain) 
LinearDiscriminantAnalysis(n_components=None, priors=None, shrinkage='auto', solver='lsqr', store_covariance=False, tol=0.001) 

# without cross-valdidation 
prediction = clf.predict(Xtest) 

# with cross-valdidation 
cv = KFold(n_splits=2) 
prediction_cv = cross_val_predict(clf, X, Y, cv=cv) 

누군가가 나를 도울 수 있기를 바랍니다.

편집 :

은 내가 더 설명 할 필요가 있다고 생각합니다. 현재 232 개의 데이터 포인트 (X)가 있습니다. 각 포인트는 16 개의 값으로 구성되며 특정 클래스에 할당됩니다. Kfold 또는 Leave One Out과 같은 교차 유효성 검사를 사용할 때 예측 (= 보이지 않는 데이터 포인트에 대한 분류 실수 감소)을 개선 할 수 있기를 바랍니다.

라인이 cross_val_predict(clf, X, Y, cv=cv) 인 경우, Python은 Kfold 교차 유효성 검사를 수행합니다.

지금, 새로운 데이터 포인트 (X_new)가 생겼습니다. 어떻게 분류 할 수 있습니까?

+0

글쎄, 당신은 지금까지 정확하고'prediction'와'prediction_cv'이 : 업데이트 된 질문에 대한

는,이 질문의 중복입니다. 어떻게 그들을 비교하고 싶습니까? 무엇을하고 싶은지 자세히 설명해주십시오. –

+0

코드가 지금까지 작동하지 않습니다. 'predict' 나'prediction_cv'에 대한 결과를 얻지 못합니다. 파이썬은 내 코드에서 뭔가를 좋아하지 않으며 무엇을 알아 내지 못합니다. 배경 : 파이썬이 예측을 계산하자마자'predictions'와'Ytest' (실제 레이블/클래스) 사이의 실수를 계산하고 싶습니다. –

+0

제공된 예제 데이터는 아래 답변을 참조하십시오. –

답변

2

난 당신이 비슷한 모양의 코드를 실행할 때 트레이스 백을 받고 가정 :

난 당신의 코드를 실행하면 내가 무엇을 얻을
376   # avoid division by zero in normalization 
    377   std[std == 0] = 1. 
--> 378   fac = 1./(n_samples - n_classes) 
    379 
    380   # 2) Within variance scaling 

ZeroDivisionError: float division by zero 

. 이유는 각 클래스에 대해 1 데이터 포인트가 있으므로 n_samples - n_classes이 0과 같기 때문입니다.

당신은 더 많은 예제를 채우기 나 클래스의 수를 줄임으로써이 문제를 완화 할 수 있습니다 다른 문제가있는 경우

import numpy as np 

from sklearn.model_selection import cross_val_predict, KFold 
from sklearn.model_selection import train_test_split 
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis 

X = np.array([[1, 2], [2, 4], [3, 2], [4, 4], [5, 2], [6, 4], [7, 2], [8, 4], [1, 2], [2, 4], [3, 2], [4, 4], [5, 2], [6, 4], [7, 2], [8, 4]]) 
Y = np.array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8]) 

Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,Y,train_size=0.5,random_state=1) 

clf = LinearDiscriminantAnalysis() 
clf.fit(X, Y) 

# without cross-valdidation 
prediction = clf.predict(Xtest) 

# with cross-valdidation 
cv = KFold(n_splits=2) 
prediction_cv = cross_val_predict(clf, X, Y, cv=cv) 

, 당신의 질문을 업데이트합니다.

편집 : Using cross_val_predict against test data set

+0

답변 해 주셔서 감사합니다! 이제는 'ZeroDivisionError'를 이해합니다. 코드 라인이 LinearDiscriminantAnalysis (n_components = None, priors = None, shrinkage = 'auto', solver = 'lsqr', store_covariance = False, tol = 0.001) –

+0

예제 코드 스 니펫에서 붙여 넣은 것 같습니다. 이 줄은 클래스의 인쇄 된 표현 인'__repr__'입니다. 그것이 그대로, 그 선은 당신에게 유용한 어떤 것도하지 않습니다. 이 답변으로 문제가 해결되면 답변으로 받아 들일 수 있다면 좋을 것입니다. – jonnybazookatone

관련 문제