Имеет ли Scikit-Learn прямооборотный алгоритм отбора/поэтапной регрессии?

datascience.stackexchange https://datascience.stackexchange.com/questions/937

  •  16-10-2019
  •  | 
  •  

Вопрос

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

Тем не менее, мне было интересно, имеет ли Scikit-Learn прямооборотный алгоритм отбора/поэтапной регрессии?

Это было полезно?

Решение

Нет, у Sklearn, похоже, нет алгоритма отбора вперед. Тем не менее, он обеспечивает рекурсивное устранение функций, которое представляет собой жадный алгоритм устранения функций, аналогичный последовательному обратному выбору. Смотрите документацию здесь:

http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.rfe.html

Другие советы

У Sklearn есть алгоритм отбора вперед, хотя это не называется в Scikit-Learn. Метод выбора функции называется F_regression в Scikit-learn последовательно включают функции, которые больше всего улучшают модель, пока не появятся K Особенности в модели (k - это вход).

Он начинается с регрессии на метках на каждой функции индивидуально, а затем наблюдает, что, какая функция улучшила модель наиболее с использованием F-статистики. Затем он включает в себя выигрышную функцию в модель. Затем он повторяется через оставшиеся функции, чтобы найти следующую функцию, которая больше всего улучшает модель, опять же, используя F-статистику или F-тест. Это происходит до тех пор, пока в модели не появятся K функции.

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

Scikit-learn действительно не поддерживает пошаговую регрессию. Это потому, что то, что обычно называют «пошаговой регрессией», является алгоритмом, основанным на значениях p коэффициентов линейной регрессии, и Scikit-learn намеренно избегает логического подхода к моделированию (тестирование значимости и т. Д.). Более того, Pure OLS является лишь одним из многочисленных алгоритмов регрессии, и с точки зрения Scikit-Learn он не является ни очень важным, ни одним из лучших.

Однако есть несколько советов для тех, кому все еще нужен хороший способ для выбора функций с линейными моделями:

  1. Используйте ненужные модели, такие как ElasticNet или же Lasso.
  2. Нормализовать свои функции с помощью StandardScaler, а затем закажите свои функции. model.coef_. Анкет Для совершенно независимых ковариат это эквивалентно сортировке с помощью p-значений. Класс sklearn.feature_selection.RFE сделаю это для вас, и RFECV Даже оценит оптимальное количество функций.
  3. Использовать реализация выбора вперед по скорректированному $ r^2 $, который работает с statsmodels.
  4. Сделайте грубую силу вперед или назад, чтобы максимизировать свой любимый показатель по перекрестной проверке (это может занять приблизительно квадратичное время в ковариатах). Scikit-learn совместимый mlxtend упаковка поддержка Этот подход для любого оценки и любой метрики.
  5. Если вам все еще нужна ванильная пошаговая регрессия, легче основывать ее на statsmodels, поскольку этот пакет рассчитывает для вас. Основной выбор вперед может выглядеть так:

```

from sklearn.datasets import load_boston
import pandas as pd
import numpy as np
import statsmodels.api as sm

data = load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target


def stepwise_selection(X, y, 
                       initial_list=[], 
                       threshold_in=0.01, 
                       threshold_out = 0.05, 
                       verbose=True):
    """ Perform a forward-backward feature selection 
    based on p-value from statsmodels.api.OLS
    Arguments:
        X - pandas.DataFrame with candidate features
        y - list-like with the target
        initial_list - list of features to start with (column names of X)
        threshold_in - include a feature if its p-value < threshold_in
        threshold_out - exclude a feature if its p-value > threshold_out
        verbose - whether to print the sequence of inclusions and exclusions
    Returns: list of selected features 
    Always set threshold_in < threshold_out to avoid infinite looping.
    See https://en.wikipedia.org/wiki/Stepwise_regression for the details
    """
    included = list(initial_list)
    while True:
        changed=False
        # forward step
        excluded = list(set(X.columns)-set(included))
        new_pval = pd.Series(index=excluded)
        for new_column in excluded:
            model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included+[new_column]]))).fit()
            new_pval[new_column] = model.pvalues[new_column]
        best_pval = new_pval.min()
        if best_pval < threshold_in:
            best_feature = new_pval.argmin()
            included.append(best_feature)
            changed=True
            if verbose:
                print('Add  {:30} with p-value {:.6}'.format(best_feature, best_pval))

        # backward step
        model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included]))).fit()
        # use all coefs except intercept
        pvalues = model.pvalues.iloc[1:]
        worst_pval = pvalues.max() # null if pvalues is empty
        if worst_pval > threshold_out:
            changed=True
            worst_feature = pvalues.argmax()
            included.remove(worst_feature)
            if verbose:
                print('Drop {:30} with p-value {:.6}'.format(worst_feature, worst_pval))
        if not changed:
            break
    return included

result = stepwise_selection(X, y)

print('resulting features:')
print(result)

Этот пример будет распечатать следующий вывод:

Add  LSTAT                          with p-value 5.0811e-88
Add  RM                             with p-value 3.47226e-27
Add  PTRATIO                        with p-value 1.64466e-14
Add  DIS                            with p-value 1.66847e-05
Add  NOX                            with p-value 5.48815e-08
Add  CHAS                           with p-value 0.000265473
Add  B                              with p-value 0.000771946
Add  ZN                             with p-value 0.00465162
resulting features:
['LSTAT', 'RM', 'PTRATIO', 'DIS', 'NOX', 'CHAS', 'B', 'ZN']

На самом деле существует хороший алгоритм, называемый «forward_select», который использует StatsModels и позволяет вам устанавливать свой собственный метрику (AIC, BIC, скорректированный R-квадрат или все, что вам нравится), чтобы постепенно добавлять переменную в модель. Алгоритм можно найти в разделе комментариев этой страницы - прокрутите вниз, и вы увидите его в нижней части страницы.

https://planspace.org/20150423-forward_selection_with_statsmodels/

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

Попробуйте и убедитесь сами.

На самом деле у Sklearn нет алгоритма отбора вперед, подумал Получить запрос С реализацией выбора форвардов в репозитории Scikit-Learn с апреля 2017 года.

В качестве альтернативы, есть вперед и один шаг к обратному отбору в mlxtend. Анкет Вы можете найти его документ в Селектор последовательных функций

Лицензировано под: CC-BY-SA с атрибуция
Не связан с datascience.stackexchange
scroll top