2013-02-18 7 views
14

Das ist mein Ziel (y):Ich habe viel mehr als drei Elemente in jeder Klasse, aber ich bekomme diese Fehlermeldung: Klasse nicht als k weniger sein kann = 3 in Scikit-Learn

target = [7,1,2,2,3,5,4, 
     1,3,1,4,4,6,6, 
     7,5,7,8,8,8,5, 
     3,3,6,2,7,7,1, 
     10,3,7,10,4,10, 
     2,2,2,7] 

Ich weiß nicht, warum, während ich bin Ausführung: ... # Split den Datensatz in zwei gleiche Teile X_train, X_test, y_train, y_test = train_test_split ( X, y, test_size = 0,5, random_state = 0)

# Set the parameters by cross-validation 
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4], 
       'C': [1, 10, 100, 1000]}, 
       {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}] 

scores = ['precision', 'recall'] 

for score in scores: 
    print("# Tuning hyper-parameters for %s" % score) 
    print() 

    clf = GridSearchCV(SVC(C=1), tuned_parameters)#scoring non esiste 
    #I get error in the line below 
    clf.fit(X_train, y_train, cv=5) 
... 

Ich bekomme diesen Fehler:

Traceback (most recent call last): 
    File "C:\Python27\SVMpredictCROSSeGRID.py", line 232, in <module> 
clf.fit(X_train, y_train, cv=5) #The minimum number of labels for any class cannot be less than k=3. 
File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 354, in fit 
return self._fit(X, y) 
File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 372, in _fit 
cv = check_cv(cv, X, y, classifier=is_classifier(estimator)) 
File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 1148, in check_cv 
cv = StratifiedKFold(y, cv, indices=is_sparse) 
File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 358, in __init__ 
" be less than k=%d." % (min_labels, k)) 
ValueError: The least populated class in y has only 1 members, which is too few. The minimum number of labels for any class cannot be less than k=3. 

Antwort

16

Der Algorithmus erfordert mindestens 3 Instanzen für eine Bezeichnung in Ihrem Trainingssatz. Ihr target Array enthält zwar mindestens drei Instanzen jedes Labels, aber wenn Sie die Daten zwischen Training und Test aufteilen, haben nicht alle Trainingslabels drei Instanzen.

Sie müssen entweder einige Klassenbezeichnungen zusammenführen oder Ihre Trainingsbeispiele vergrößern, um das Problem zu lösen.

+1

Sie könnten auch einen "cv" -Parameter übergeben, zum Beispiel "KFold". Welche Version hast du übrigens, ich glaube, dass die Eingabevalidierung für StratifiedKFold (der Standard-Lebenslauf) in der neueren Version von sklearn weniger streng ist. Seien Sie jedoch vorsichtig bei der Interpretation der Ergebnisse. Sie sind wahrscheinlich nicht so aussagekräftig. –

+1

@AndreasMueller, Ich habe im Falle von StratifiedKFold keine Eingabevalidierung versucht. Ich werde es auf jeden Fall überprüfen. Danke für den Vorschlag. – jitendra

0

Wenn der Test- und Zugsatz nicht aufgeteilt werden kann und jede Klasse in jeder Falte ausreichend belegt ist, versuchen Sie, die Scikit-Bibliothek zu aktualisieren.

pip install -U scikit-learn

Sie die gleiche Nachricht als eine Warnung erhalten, so dass Sie den Code ausführen kann.