У меня есть этот набор данных о белках, на котором мне нужно выполнить RFE. Есть 100 примеров с бинарными метками классов (больной — 1, здоровый — 0) и 9847 признаков для каждого примера. Чтобы уменьшить размерность, я выполняю RFECV с оценкой LogisticRegression и 5-кратным CV. Это код:
model = LogisticRegression()
rfecv = RFECV(estimator=model, step=1, cv=StratifiedKFold(5), n_jobs=-1)
rfecv.fit(X_train, y_train)
print("Number of features selected: %d" % rfecv.n_features_)
Количество выбранных функций: 9874
Затем я строю график количества функций по сравнению с оценками CV:
plt.figure()
plt.xlabel("feature count")
plt.ylabel("CV accuracy")
plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)
plt.show()
Я думаю, что происходит (и для этого мне нужен эксперт), так это то, что первый пик показывает оптимальное количество признаков. После этого кривая падает и снова начинает расти только из-за переобучения, не разделения классов, а примеров. Может ли это быть так? И если да, то как я могу получить эти функции (т.е. те, что находятся на первом пике), потому что rfecv.support_ дает мне только те, где была достигнута наивысшая точность (то есть все они).
И пока я этим занимаюсь: как мне выбрать лучший оценщик для RFE? Это просто метод проб и ошибок, прохождение всех возможных классификаторов или есть какая-то логика, почему я бы, например, использовал Logit вместо линейного SVC?