Рекурсивное исключение признаков (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]))