2013-02-18 5 views
14

Questo è il mio obiettivo (y):Ho molto di più di 3 elementi in ogni classe, ma ottengo questo errore: classe non può essere inferiore a k = 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] 

Non lo so perché mentre sto eseguendo: ... # divide il dataset in due parti uguali 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) 
... 

ho questo errore:

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. 

risposta

16

L'algoritmo richiede che ci siano almeno 3 istanze per un'etichetta nel set di allenamento. Sebbene l'array target contenga almeno 3 istanze di ciascuna etichetta, ma quando si suddividono i dati tra allenamento e test, non tutte le etichette di allenamento hanno 3 istanze.

È necessario unire alcune etichette di classe o aumentare i campioni di allenamento per risolvere il problema.

+1

È anche possibile passare un parametro "cv", ad esempio "KFold". Quale versione hai tra l'altro, penso che la validazione dell'input per StratifiedKFold (il cv predefinito) abbia ottenuto meno rigore nella nuova versione di sklearn. Stai attento nell'interpretazione dei risultati, però. Probabilmente non sono così significativi. –

+1

@AndreasMueller, Non ho provato la convalida dell'input in caso di StratifiedKFold. Sicuramente controllerò. Grazie per il suggerimento. – jitendra

0

se non è possibile dividere il test e addestrare il set con ogni classe abbastanza popolata in ogni piega, quindi provare ad aggiornare la libreria di scikit.

pip install -U scikit-learn

si otterrà lo stesso messaggio come un avvertimento in modo da poter eseguire il codice.

Problemi correlati