Рекурсивное исключение признаков (RFE) — это широко используемый алгоритм выбора признаков, который помогает определить наиболее релевантные признаки в обучающем наборе данных для прогнозирования целевой переменной. Одной из причин его популярности является простота использования и эффективность. Он также применим к числовым и категориальным данным, что делает этот метод незаменимым. При использовании RFE необходимо учитывать два важных параметра: количество объектов для выбора и алгоритм, используемый для выбора. Эти параметры можно настроить для достижения оптимальной производительности, но их идеальная настройка не имеет решающего значения для правильной работы алгоритма. Наиболее часто используемые алгоритмы с RFE включают:

  • Линейные модели, такие как линейная регрессия и логистическая регрессия
  • Машины опорных векторов (SVM)
  • Деревья решений и случайные леса
  • Наивный Байес
  • Нейронные сети

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

Вот пример использования RFE:

# define the method
rfe = RFE(estimator=DecisionTreeClassifier(), n_features_to_select=3)
# fit the model
rfe.fit(X, y)
# transform the data
X, y = rfe.transform(X, y)

Чтобы найти оптимальное количество функций для выбора, вы можете использовать следующий код для проверки диапазона номеров функций:

# get a list of models to evaluate
def get_models():
  models = dict()
  for i in range(2, 10):
    rfe = RFE(estimator=DecisionTreeClassifier(), n_features_to_select=i)
    model = DecisionTreeClassifier()
    models[str(i)] = Pipeline(steps=[('s',rfe),('m',model)])
  return models

# get models
models = get_models()
# define cv
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# get scores for each model
for name, model in models.items():
  scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
  results.append(scores)
  names.append(name)
  print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))

В качестве альтернативы вы можете использовать RFECV, чтобы позволить алгоритму выбирать количество функций для выбора:

# define the method
rfe = RFECV(estimator=DecisionTreeClassifier())
# fit the model
rfe.fit(X, y)
# transform the data
X, y = rfe.transform(X, y)

Если вам интересно посмотреть, какие функции были выбраны, вы можете использовать rfe.support_. Это логическое значение, которое принимает значение True, если функция выбрана, и False в противном случае.

# Plot which features were selected
for i in range(df_prep.shape[1]):
    print("Column: %d, Selected=%s, Rank:%d" % (i, rfe.support_[i], rfe.ranking_[i]))