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?

Était-ce utile?

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:

  1. Utiliser des modèles intrinsèquement rares comme ElasticNet ou Lasso.
  2. Normaliser vos fonctions avec StandardScaler, puis commander vos fonctions juste en model.coef_. Pour covariables parfaitement indépendants, il est équivalent au tri des valeurs de p. La sklearn.feature_selection.RFE de classe le fera pour vous, et RFECV va même évaluer le nombre optimal de fonctionnalités.
  3. une de mise en œuvre de la sélection par l'avant ajusté $ R ^ 2 $ qui fonctionne avec statsmodels.
  4. 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 .
  5. 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 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

Licencié sous: CC-BY-SA avec attribution
scroll top