Scikit-Learn RFECV количество функций, основанных только на оценках сетки

Из документации RFE scikit-learn алгоритмы отбирают последовательно меньшие наборы функций, и сохраняются только функции с наивысшими весами. Объекты с низким весом отбрасываются, и этот процесс повторяется до тех пор, пока число оставшихся объектов не совпадет с заданным пользователем (или по умолчанию будет принято равным половине исходного числа объектов).

Документы RFECV указывают, что функции ранжируются по RFE и KFCV.

У нас есть набор из 25 функций в коде, показанном в примере документации для RFECV:

from sklearn.svm import SVC
from sklearn.cross_validation import StratifiedKFold
from sklearn.feature_selection import RFECV,RFE
from sklearn.datasets import make_classification

# Build a classification task using 3 informative features
X, y = make_classification(n_samples=1000, n_features=25, n_informative=3,
                           n_redundant=2, n_repeated=0, n_classes=8,
                           n_clusters_per_class=1, random_state=0)

# Create the RFE object and compute a cross-validated score.
svc = SVC(kernel="linear")
# The "accuracy" scoring is proportional to the number of correct
# classifications
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(y, 2),scoring='accuracy')
rfecv.fit(X, y)
rfe = RFE(estimator=svc, step=1)
rfe.fit(X, y)

print('Original number of features is %s' % X.shape[1])
print("RFE final number of features : %d" % rfe.n_features_)
print("RFECV final number of features : %d" % rfecv.n_features_)
print('')

import numpy as np
g_scores = rfecv.grid_scores_
indices = np.argsort(g_scores)[::-1]
print('Printing RFECV results:')
for f in range(X.shape[1]):
    print("%d. Number of features: %d;
                  Grid_Score: %f" % (f + 1, indices[f]+1, g_scores[indices[f]]))

Вот вывод, который я получаю:

Original number of features is 25
RFE final number of features : 12
RFECV final number of features : 3

Printing RFECV results:
1. Number of features: 3; Grid_Score: 0.818041
2. Number of features: 4; Grid_Score: 0.816065
3. Number of features: 5; Grid_Score: 0.816053
4. Number of features: 6; Grid_Score: 0.799107
5. Number of features: 7; Grid_Score: 0.797047
6. Number of features: 8; Grid_Score: 0.783034
7. Number of features: 10; Grid_Score: 0.783022
8. Number of features: 9; Grid_Score: 0.781992
9. Number of features: 11; Grid_Score: 0.778028
10. Number of features: 12; Grid_Score: 0.774052
11. Number of features: 14; Grid_Score: 0.762015
12. Number of features: 13; Grid_Score: 0.760075
13. Number of features: 15; Grid_Score: 0.752003
14. Number of features: 16; Grid_Score: 0.750015
15. Number of features: 18; Grid_Score: 0.750003
16. Number of features: 22; Grid_Score: 0.748039
17. Number of features: 17; Grid_Score: 0.746003
18. Number of features: 19; Grid_Score: 0.739105
19. Number of features: 20; Grid_Score: 0.739021
20. Number of features: 21; Grid_Score: 0.738003
21. Number of features: 23; Grid_Score: 0.729068
22. Number of features: 25; Grid_Score: 0.725056
23. Number of features: 24; Grid_Score: 0.725044
24. Number of features: 2; Grid_Score: 0.506952
25. Number of features: 1; Grid_Score: 0.272896

В этом конкретном примере:

  1. Для RFE: код всегда возвращает 12 функций (примерно половина из 25, как ожидается из документации)
  2. Для RFECV код возвращает другое число, отличное от 1-25 (не половина количества функций)

Мне кажется, что при выборе RFECV количество функций выбирается только на основе оценок KFCV, т. Е. Оценки перекрестной проверки перекрывают последовательное сокращение функций RFE.

Это правда? Если кто-то хотел бы использовать собственный алгоритм исключения рекурсивных признаков, то использует ли RFECV этот алгоритм или его гибридную версию?

В RFECV проводится ли перекрестная проверка для подмножества функций, оставшихся после сокращения? Если да, то сколько функций сохраняется после каждого сокращения в RFECV?

1 ответ

Решение

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

Если вы хотите сравнить это с наивной версией, вам нужно будет вычислить перекрестную оценку для функций, выбранных RFE. Я предполагаю, что ответ RFECV является правильным - судя по резкому увеличению производительности модели при уменьшении возможностей, у вас, вероятно, есть некоторые сильно коррелированные функции, которые наносят ущерб производительности вашей модели.

Другие вопросы по тегам