Количество классов должно быть больше одного; получил 1 класс - PullRequest
0 голосов
/ 14 апреля 2019

Я занимаюсь разработкой программы машинного обучения и застрял на этой ошибке. В настоящее время мой набор данных имеет 2 класса и выглядит следующим образом:

2652,0.09,-1.02,0.43,-0.01,-0.94,0.35,1
1,0.38,-0.90,0.19,0.30,0.95,0.12,2
2653,0.09,-1.02,0.43,-0.01,-0.94,0.35,1
4,0.38,-0.90,0.19,0.29,0.96,0.06,2
5,0.38,-0.90,0.19,0.29,0.96,0.06,2
2654,0.15,-1.01,0.45,-0.01,-0.94,0.35,1
2,0.38,-0.90,0.19,0.29,0.96,0.06,2

И когда я запускаю свой код, я получаю эту ошибку

ValueError                                Traceback (most recent call last)
<ipython-input-7-c44a67b01cf1> in <module>
     11 model, params = train_model(X_train, y_train, 
     12                     est=SVC(probability=True),
---> 13                     grid={'C': param_range, 'gamma': param_range, 'kernel': ['linear']})
     14 eval_model(model, X_test, y_test, 'SVC')
     15 

<ipython-input-5-d902442b6ba1> in train_model(X, y, est, grid)
      2     print('::::Train Model::::')
      3     gs = GridSearchCV(estimator=est, param_grid=grid, scoring='accuracy', cv=4, n_jobs=-1)
----> 4     gs = gs.fit(X, y)
      5 
      6     return (gs.best_estimator_, gs.best_params_)
.
.
.
ValueError: The number of classes has to be greater than one; got 1 class

Но я понял, что в этой части кода

feats, y = get_simple_features(data, wsize='10s')
# split data into train and test sets

X_train, X_test, y_train, y_test = train_test_split(feats, y, test_size=.25, random_state=0, stratify=y)


print('Support Vector Machine')
model, params = train_model(X_train, y_train, 
                    est=SVC(probability=True),
                    grid={'C': param_range, 'gamma': param_range, 'kernel': ['linear']})
eval_model(model, X_test, y_test, 'SVC')

Когда я сделал print(np.unique(y)), вывод будет [ 1 ]. И это происходит в этой строке кода:

y = data['label'].resample(wsize, how=lambda ts: mode(ts)[0] if ts.shape[0] > 0 else np.nan)  

Потому что data ['label'] имеет оба класса, но в результате повторной выборки только 1 класс. Тем не менее, я попросил другого человека запустить мой код, и ошибки вообще нет.

Что это может быть?

PS: Здесь - полный код.

1 Ответ

0 голосов
/ 14 апреля 2019

Это связано со случайностью повторной выборки, которую вы выполняете при запуске функции resample, тем более что размер выборки слишком мал (<10) и это не стратифицированная выборка, вы, вероятно, получите выборку, котораяпредставляет только один класс. </p>

...