2013-02-18 16 views
14

To jest mój cel (y):mam znacznie więcej niż 3 elementy w każdej klasie, ale ja dostać ten błąd: klasa nie może być mniejsza niż k = 3 w 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] 

nie wiem Dlatego kiedy jestem wykonanie: ... # Podział zbioru danych w dwóch równych częściach 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) 
... 

pojawia się ten błąd:

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. 

Odpowiedz

16

Algorytm wymaga, aby w zestawie szkoleniowym znajdowały się co najmniej 3 wystąpienia. Chociaż twoja macierz target zawiera co najmniej 3 wystąpienia każdej etykiety, ale kiedy dzielisz dane pomiędzy trening i testowanie, nie wszystkie etykiety treningowe mają 3 wystąpienia.

Musisz połączyć etykiety klas lub zwiększyć próbki treningowe, aby rozwiązać problem.

+1

Można również przekazać parametr "cv", na przykład "KFold". Której wersji używasz, myślę, że sprawdzanie poprawności dla StratifiedKFold (domyślny cv) jest mniej ścisłe w nowszej wersji sklearn. Uważaj jednak, interpretując wyniki. Prawdopodobnie nie są tak znaczące. –

+1

@AndreasMueller, Nie próbowałem sprawdzania danych wejściowych w przypadku StratifiedKFold. Na pewno sprawdzę. Dzieki za sugestie. – jitendra

0

jeśli nie można podzielić testu i zestawu pociągów z każdą klasą w wystarczającym stopniu w każdym folderze, a następnie spróbuj zaktualizować bibliotekę scikit.

pip install -U scikit-learn

dostaniesz ten sam komunikat jako ostrzeżenie, dzięki czemu można uruchomić kod.