Чи має алгоритм вибору / покрокової регресії в scikit-learn?


37

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

Однак мені було цікаво, чи має scikit-learn алгоритм вибору / покрокової регресії?


Я створив для цього власний клас, але дуже здивований, що у sklearn цього немає.
Максуд

1
Використання гіпотезних тестів - жахливий метод вибору ознак. Вам доведеться зробити їх багато, і, звичайно, ви отримаєте багато помилкових позитивів і негативів.
Рікардо Крус

Відповіді:


21

Ні, sklearn, схоже, не має алгоритму вибору вперед. Однак він забезпечує рекурсивне усунення функції, що є алчним алгоритмом усунення функції, подібним послідовному вибору назад. Дивіться документацію тут:

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


3
Хороша пропозиція, але проблема при впровадженні наукового набору полягає в тому, що важливість функції кількісно визначається коефіцієнтами моделі, тобто якщо модель має coef_інтерфейс. Це виключає метод, заснований на дереві тощо. Однак, я думаю, що @Maksud попросив те, що описано у «Вступі до статистичного навчання» Джеймса, в якому функції рекурсивно додаються / видаляються за їх важливістю, які його кількісно визначають за допомогою точності встановлення валідації . Це дозволяє вибирати функції для всіх типів моделей, а не лише лінійних параметричних.
eggie5

9

У Sklearn є алгоритм вибору вперед, хоча це не називається в scikit-learn. Метод вибору функцій під назвою F_regression у scikit-learn послідовно включатиме функції, які найбільше вдосконалюють модель, доки Kв моделі не з’являться функції (K - це вхід).

Він починається з регресії міток на кожній характеристиці окремо, а потім спостерігаючи, яка функція покращила модель найбільше, використовуючи F-статистику. Потім він включає в себе виграшну функцію в модель. Потім він повторює інші функції, щоб знайти наступну функцію, яка найбільш вдосконалює модель, знову ж таки використовуючи F-статистику або F-тест. Це робиться до тих пір, поки в моделі не з’являться функції K.

Зауважте, що інші функції, пов'язані з функціями, включеними в модель, ймовірно, не будуть обрані, оскільки вони не співвідносяться із залишками (хоча вони можуть добре співвідноситись з мітками). Це допомагає захистити від багатоколірності.


1
Однак майте на
Candic3

1
Ви маєте на увазі Select K-best ?
Нітро

так. Крім того , ви повинні прочитати: stats.stackexchange.com/questions/204141 / ... .
Candic3

2
Це такий собі відбір вперед. Але це не є загальним - воно характерне для лінійної регресійної моделі, тоді як типовий вибір вперед може працювати з будь-якою моделлю (модель агностика), як і RFE, і може вирішувати проблеми класифікації або регресії. Але я підозрюю, що більшість людей шукають цей випадок використання, і це, звичайно, добре згадати тут.
Саймон

2
Це не вибір STEPWISE, оскільки кожне p-значення обчислюється для одновимірної регресії незалежно від усіх інших коваріатів.
Девід Дейл

9

Scikit-learn дійсно не підтримує ступінчату регресію. Це тому, що загальновідомий як «покрокова регресія» - це алгоритм, заснований на p-значеннях коефіцієнтів лінійної регресії, а scikit-learning навмисно уникає інфекційного підходу до модельного навчання (тестування значущості тощо). Більше того, чистий OLS - лише один із численних алгоритмів регресії, і з точки зору scikit-learn він не є дуже важливим, ані одним з найкращих.

Однак є кілька порад для тих, хто все ще потребує хорошого способу вибору функцій за допомогою лінійних моделей:

  1. Використовуйте вкрай рідкісні моделі, як ElasticNetабо Lasso.
  2. Нормалізуйте свої функції за допомогою StandardScaler, а потім замовляйте їх лише за допомогою model.coef_. Для ідеально незалежних коваріатів це еквівалентно сортування за р-значеннями. Клас sklearn.feature_selection.RFEзробить це за вас і RFECVнавіть оцінить оптимальну кількість функцій.
  3. R2statsmodels
  4. Зробіть грубу силу вперед або назад, щоб максимізувати свою улюблену метрику при перехресній валідації (це може зайняти приблизно квадратичний час у кількості коваріатів). Сумісний mlxtendпакет scikit-learn підтримує такий підхід для будь-якого оцінювача та будь-якої метрики.
  5. Якщо ви все ще хочете поетапної регресії ванілі, її легше базувати statsmodels, оскільки цей пакет обчислює значення p для вас. Основний вибір вперед-назад може виглядати так:

`` `

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']

Опублікований вперед поступовий регресійний код не працює належним чином. Це повинно дати однакові результати поступовій регресії назад, але це не так. Це повертаючі фактори з р-значеннями, що перевищують поріг, коли ви повторюєте регресію. Я також запускав один і той же набір даних зі STATA та однакові пороги, використовуючи крок назад, і отримую суттєво різні результати. В основному, не використовуйте його. Я буду писати власний крок поступової регресії за допомогою свого шаблону.
Майкл Корлі MBA LSSBB

Поступові регресії вперед та назад ні в якому разі не гарантуються для сходження до одного рішення. І якщо ви помітили помилку в моєму рішенні, додайте код, щоб відтворити його.
Девід Дейл

1

Насправді є приємний алгоритм під назвою "Forward_Select", який використовує Statsmodels і дозволяє встановити власну метрику (AIC, BIC, Adjusted-R-Squared, або все, що завгодно) для поступового додавання змінної до моделі. Алгоритм можна знайти в розділі коментарів цієї сторінки - прокрутіть униз, і ви побачите його внизу сторінки.

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

Я додам, що алгоритм також має одну приємну особливість: ви можете застосувати його або до проблем класифікації, або до регресії! Ви просто повинні це сказати.

Спробуйте і переконаєтеся самі.


0

Насправді sklearn не має алгоритму вибору прямого перегляду, подумав, що запит на витяг із реалізацією вибору функції прямого перегляду чекає у сховищі Scikit-Learn з квітня 2017 року.

Як альтернатива, в mlxtend є вибір вперед і назад на крок вперед . Ви можете знайти його документ у селективному селекторі функцій

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.