Обобщите интуицию выбора функций для модели на основе дерева и регрессии, а также некоторые распространенные стратегии выбора функций, такие как рекурсивное исключение функций, перестановка функций и исключение функций.

Полные методы выбора функций

  1. Статистическое тестирование и анализ
  2. Корреляционный анализ
  3. Уменьшение размеров
  4. На основе модели

Модель на основе дерева

В процессе роста (или разделения) дерева решений дерево решений оценит все функции и выберет одну функцию (и ее значение) для разделения узла дерева, если после разделения узла дерево получит максимальное улучшение с точки зрения критериев разделения, таких как GINI, Прирост информации (классификация) или дисперсия (регрессия).

Итак, для каждой функции мы можем агрегировать

сколько раз функция использовалась при разделении узла или

насколько улучшились критерии разделения после разделения узла по признаку

в качестве оценки важности функции, затем выберите функции с высокой оценкой

Та же интуиция применима ко всем древовидным моделям, таким как Random Forrest, XGBoost и т. д.

Ниже приведен пример на Python

import xgboost as xgb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
boston = load_boston()
data = pd.DataFrame(boston.data)
data['PRICE'] = boston.target
X, y = data.iloc[:,:-1], data.iloc[:,-1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)
xg_reg = xgb.XGBRegressor(
    n_estimators = 50, 
    max_depth = 4,
    learning_rate = 0.3)
xg_reg.fit(X_train,y_train)
preds = xg_reg.predict(X_test)
rmse = np.sqrt(mean_squared_error(y_test, preds))
print("RMSE: %f" % (rmse))
RMSE: 3.509045
feature_imp= xg_reg.get_booster().get_score(importance_type= 'gain')
sorted_feature_imp = np.array(sorted(feature_imp.items(), key=lambda kv: int(kv[1]), reverse=False))
plt.barh(
    boston.feature_names[sorted_feature_imp[:,0].astype(int)], 
    sorted_feature_imp[:,1].astype(float))
plt.xlabel("Feature Importance")

Модель регрессии (линейная регрессия LASSO)

В линейной регрессии целевая функция с регуляризацией L1, как показано ниже

Интуиция такова, что мы используем коэффициенты β как важность признака:

Если коэффициент признака β далек от 0, то признак имеет большее значение.

Если коэффициент признака βочень близок к 0, то признак не имеет значения, и мы можем удалить его при обучении модели.

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

Рекурсивное устранение признаков

Интуиция стратегий проиллюстрирована ниже

Исключение функции

Стратегия исключения функций аналогична обратному исключению функций.

Перестановка функций

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

Основная интуиция для перестановки функций:

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

Основываясь на этой идее, проект boruta придумывает реализацию для запуска функции выбора.

Общий процесс boruta выглядит следующим образом:

1. Создайте случайным образом перемешанные функции SF_X и присоедините к исходному набору данных.

2. Обучите модель случайного леса, используя вышеуказанный набор данных.

3. Рассчитайте важность каждой функции

4. Xi = 1(i=1,2,3,4), если Важность признака Xi › max ( Важность признака SF_X1, SF_X2, SF_X3, SF_X4), иначе =0

5. Xi_Sum = Xi_Sum + Xi (i = 1,2,3,4)

6. Повторите шаги с 1 по 5 N раз.

7. Сравните каждую Xi_Sum с биномиальным распределением N следов и на основе заданного уровня достоверности классифицируйте все функции как сильные, исключенные за неделю.

pip install Boruta or conda install -c conda-forge boruta_py
###########################
from boruta import BorutaPy
from sklearn.ensemble import RandomForestRegressor
forest = RandomForestRegressor(
   n_jobs = -1, 
   max_depth = 5
)
boruta = BorutaPy(
   estimator = forest, 
   alpha = 0.05, # p value
   max_iter = 100
)
boruta.fit(X_train.values,y_train.values)
print('Strong Features')
print(boston.feature_names[boruta.support_])
print('Weak Features')
print(boston.feature_names[boruta.support_weak_])
Strong Features
['CRIM' 'NOX' 'RM' 'DIS' 'TAX' 'PTRATIO' 'LSTAT']
Weak Features
['AGE' 'B']

ССЫЛКА

  1. Методы выбора признаков для науки о данных (всего несколько)
  2. Борута объяснил, как именно вы хотели, чтобы кто-то объяснил вам
  3. Важность перестановки
  4. Автоматизированный выбор функций с борутой