Исключение рекурсивных функций с перекрестной проверкой регрессии в scikit-learn
Я хочу применить метод-обертку, такой как Recursive Feature Elission, к моей проблеме регрессии с scikit-learn. Удаление рекурсивных функций с перекрестной проверкой дает хороший обзор того, как автоматически настроить количество функций.
Я попробовал это:
modelX = LogisticRegression()
rfecv = RFECV(estimator=modelX, step=1, scoring='mean_absolute_error')
rfecv.fit(df_normdf, y_train)
print("Optimal number of features : %d" % rfecv.n_features_)
# Plot number of features VS. cross-validation scores
plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Cross validation score (nb of correct classifications)")
plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)
plt.show()`
но я получаю сообщение об ошибке вроде
`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 n_folds=3. % (min_labels, self.n_folds)), Warning)
Звучит предупреждение, будто у меня проблема с классификацией, но моя задача - это проблема регрессии. Что я могу сделать, чтобы получить результат и что не так?
1 ответ
Вот что случилось:
По умолчанию, когда количество сгибов не указано пользователем, перекрестная проверка RFE
использует 3-fold
перекрестная проверка. Все идет нормально.
Однако, если вы посмотрите на документацию, он также использует StartifiedKFold
который гарантирует, что сгибы созданы, сохраняя процент образцов для каждого класса. Поэтому, поскольку кажется (согласно ошибке), что некоторые элементы вашего вывода y
уникальны, они не могут быть одновременно в 3 разных складках. Выдает ошибку!
Ошибка исходит отсюда.
Затем вам нужно использовать нерасчлененный K-fold: KFold
,
Документация RFECV
Говорит, что:"If the estimator is a classifier or if y is neither binary nor multiclass, sklearn.model_selection.KFold is used."