Est-ce que scikit-learn ont sélection avant / par étapes algorithme de régression?
-
16-10-2019 - |
Question
Je travaille sur le problème avec trop de fonctionnalités et de formation de mes modèles prend trop de temps. Je mis en œuvre l'algorithme de sélection avant de choisir les caractéristiques.
Cependant, je me demandais ne scikit-learn ont l'algorithme de sélection avant / régression par étapes?
La solution
Non, sklearn ne semble pas avoir un algorithme de sélection avant. Cependant, il fournit l'élimination de la fonction récursive, qui est un algorithme d'élimination de la fonctionnalité avide similaire à la sélection séquentielle vers l'arrière. Consultez la documentation ici:
http://scikit-learn.org/stable/modules/generated/sklearn .feature_selection.RFE.html
Autres conseils
Sklearn a un algorithme de sélection avant, bien qu'il ne soit pas appelé que scikit-learn. La méthode fonction de sélection appelée F_regression scikit-learn volonté inclure séquentiellement des caractéristiques qui améliorent le modèle le plus, jusqu'à ce qu'il n'y K
dispose dans le modèle (K est une entrée).
Il commence par régression les étiquettes sur chaque élément individuellement, puis en observant quelle fonctionnalité améliorée du modèle le plus en utilisant la statistique F. Ensuite, il intègre la fonction gagnante dans le modèle. Ensuite, il parcourt les autres caractéristiques de trouver la fonction suivante qui améliore le modèle le plus, en utilisant à nouveau le test statistique F ou F. Il fait cela jusqu'à ce qu'il K présente dans le modèle.
Notez que les autres caractéristiques qui sont corrélées aux fonctionnalités intégrées dans le modèle ne seront probablement pas sélectionnés, car ils ne sont pas en corrélation avec les résidus (bien qu'ils pourraient bien en corrélation avec les étiquettes). Cela permet de se prémunir contre multicollinéarité.
scikit-learn ne fait supporte pas la régression pas à pas. En effet, ce qui est communément appelé « régression par étapes » est un algorithme basé sur les valeurs p de coefficients de régression linéaire, et scikit-learn évite délibérément approche déductive à l'apprentissage du modèle (tests de signification, etc.). De plus, OLS pur est un des nombreux groupes d'algorithmes de régression, et du point de vue scikit-learn il est très important ni, ni l'un des meilleurs.
Il y a, cependant, quelques conseils pour ceux qui ont encore besoin d'un bon moyen pour la sélection des fonctionnalités avec des modèles linéaires:
- Utiliser des modèles intrinsèquement rares comme
ElasticNet
ouLasso
. - Normaliser vos fonctions avec
StandardScaler
, puis commander vos fonctions juste enmodel.coef_
. Pour covariables parfaitement indépendants, il est équivalent au tri des valeurs de p. Lasklearn.feature_selection.RFE
de classe le fera pour vous, etRFECV
va même évaluer le nombre optimal de fonctionnalités. - une de mise en œuvre de la sélection par l'avant ajusté $ R ^ 2 $ qui fonctionne avec
statsmodels
. - Do-force brute sélection avant ou en arrière pour maximiser votre favori métrique sur la validation croisée (il pourrait prendre du temps environ quadratique en nombre de covariables). Un scikit-learn package compatible
mlxtend
cette approche pour tout estimateur et toute métrique . - Si vous voulez toujours la régression vanille par étapes, il est plus facile de se baser sur
statsmodels
, puisque ce paquet calcule les valeurs de p pour vous. pourrait ressembler à une sélection avant-arrière de base ceci:
`` `
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)
Cet exemple imprimer la sortie suivante:
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']
En fait il y a un algorithme agréable appelé « Forward_Select » qui utilise Statsmodels et vous permet de définir votre propre métrique (AIC, BIC, ajusté-R-Squared, ou ce que vous voulez) pour ajouter progressivement une variable au modèle. L'algorithme se trouve dans la section des commentaires de cette page -. Défilement vers le bas et vous verrez près du bas de la page
https://planspace.org/20150423-forward_selection_with_statsmodels/
Je voudrais ajouter que l'algorithme a également une fonctionnalité intéressante: vous pouvez l'appliquer soit à des problèmes de classification ou régression! Il vous suffit de le dire.
Essayez et voyez par vous-même.
En fait sklearn ne dispose pas d'un algorithme de sélection avant, pensée demande de traction avec une mise en œuvre attend de sélection de fonction avant dans le scikit-learn référentiel depuis Avril 2017.
En variante, il est en avant et en une seule étape, de l'avant vers l'arrière dans la sélection mlxtend . Vous pouvez trouver ce document séquentielle Fonction Sélecteur