Складки только для одного класса, проверенные с помощью GridSearchCV - PullRequest
1 голос
/ 17 апреля 2019

При использовании GridSearchCV в пользовательском оценщике, являющемся оберткой в ​​SVC, я получаю сообщение об ошибке: «ValueError: число классов должно быть больше одного; получен 1 класс»

пользовательским оценщиком являетсясделано для добавления параметров gridsearch в оценщик и, кажется, работает нормально.

Используя отладчик, я обнаружил, что действительно, для моего оценщика предоставляется набор поездов только для одного класса, поэтому возникает 2 возможности:

  • Либо оценщик должен обрабатывать набор только для одного класса

  • Либо GridSearchCV не должен предоставлять набор только для одного класса

Когда я получаю сообщение об ошибке из вызова SVC.fit и кажется, что SVC не должен получать наборы только для одного класса, я думаю, что это второй вариант.Тем не менее, я посмотрел в реализации GridSearchCV, но я не нашел нигде, где он проверяет, есть ли сгиб только для одного класса или почему он потерпит неудачу ...

Я использовал поиск по сетке внутриперекрестная проверка для выполнения вложенной перекрестной проверки:

gs = GridSearchCV(clf.gs_clf.get_gs_clf(), parameter_grid, cv=n_inner_splits, iid=False)
gs.fit(*clf.get_train_set(X, y, train_index))

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Я обнаружил реальную проблему, документация GridsearchCV указывает для параметра cv:

# For integer/None inputs, if the estimator is a classifier and ``y`` is
# either binary or multiclass, `StratifiedKFold` is used. In all
# other cases, `KFold` is used.

И подклассы только для одного класса невозможны для StratifiedKFold.

Итак, решениебыл для моего пользовательского оценщика наследоваться от sklearn.base.ClassifierMixin

2 голосов
/ 17 апреля 2019

Как вы уже упоминали в своем вопросе, проблема в перекрестной проверке, не включающей данные 2-го класса.Вероятно, это связано с проблемой класса дисбаланса с вашими данными, из-за которой при выполнении стратифицированных n_inner_splits сгибов этот класс с неполной выборкой пропускается.

Чтобы преодолеть это, вы можете попробовать одно из следующих действий:

1- Уменьшить значение n_inner_splits в соответствии с процентным соотношением данных класса ниже выборки и числом имеющихся у вас экземпляров.

2- Вместо того, чтобы передавать целое число параметру cv gridsearch, вы можете выполнить разбиение себя и передать ему итеративные данные (обучать, тестировать), где вы будете уверены, что 2 классавсегда представлены.

3- Создайте / получите больше данных для этого в классе выборки.

Проверьте документацию по параметру cv для других способов решения этой проблемы здесь .

...