Pregunta

Estoy trabajando en el problema con demasiadas características y la formación de mis modelos se tarda mucho. He implementado algoritmo de selección hacia adelante para elegir características.

Sin embargo, me preguntaba hace scikit-learn tener la selección hacia adelante / paso a paso del algoritmo de regresión?

¿Fue útil?

Solución

No, sklearn no parecen tener un algoritmo de selección hacia adelante. Sin embargo, sí proporciona función recursiva de eliminación, que es un algoritmo de eliminación de característica codicioso similar a la selección hacia atrás secuencial. Consulte la documentación aquí:

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

Otros consejos

Sklearn tiene un algoritmo de selección hacia adelante, aunque no se conoce que en scikit-learn. El método de selección característica llamada F_regression en scikit-learn voluntad incluir secuencialmente características que mejoran el modelo más, hasta que hay K cuenta en el modelo (K es una entrada).

Se inicia por regresión las etiquetas de cada característica individual, y luego observar que característica mejoró el modelo más usando el F-estadística. Luego se incorpora la función de ganar en el modelo. A continuación, se itera a través de las características restantes para encontrar la siguiente característica que mejora el modelo de la mayoría, de nuevo utilizando la prueba estadística F o F. Esto lo hace hasta que haya K cuenta en el modelo.

Tenga en cuenta que probablemente no se seleccionan las características restantes que estén en correspondencia con características incorporadas en el modelo, ya que no se correlacionan con los residuos (aunque podrían correlacionarse bien con las etiquetas). Esto ayuda a proteger contra multicolinealidad.

scikit-learn de hecho no soporta regresión paso a paso. Esto se debe a lo que comúnmente se conoce como 'paso a paso regresión' es un algoritmo basado en los valores de p de los coeficientes de regresión lineal, y (pruebas de significación etc) scikit-learn evita deliberadamente el enfoque deductivo al aprendizaje del modelo. Por otra parte, OLS puro es sólo uno de los numerosos algoritmos de regresión, y desde el punto de vista scikit-learn No es ni muy importante, ni uno de los mejores.

Hay, sin embargo, una serie de consejos para aquellos que todavía necesitan una manera buena para la selección de características con los modelos lineales:

  1. Usar modelos intrínsecamente escasas como ElasticNet o Lasso.
  2. Normalizar sus características con StandardScaler, y luego disponer sus funciones con sólo model.coef_. Para las covariables perfectamente independientes es equivalente a la clasificación por los valores de p. El sklearn.feature_selection.RFE clase lo hará por ti, y aun RFECV evaluará el número óptimo de características.
  3. un implementación de la selección hacia adelante por ajustado $ R $ ^ 2 que funciona con statsmodels.
  4. Do fuerza bruta hacia delante o hacia atrás de selección para maximizar su favorito métrica de validación cruzada (que podría tomar tiempo aproximado de segundo grado en el número de covariables). Un scikit-learn paquete mlxtend compatibles este enfoque para cualquier estimador y cualquier métrica .
  5. Si aún desea regresión paso a paso de vainilla, es más fácil que se base en statsmodels, ya que este paquete calcula los valores de p para usted. Una selección de delante hacia detrás básico podría tener este aspecto:

`` `

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)

En este ejemplo se imprimiría la siguiente salida:

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

De hecho, hay un algoritmo agradable llamado "Forward_Select" que utiliza Statsmodels y le permite establecer su propia métrica (AIC, BIC, Ajustado-R-Cuadrado, o lo que quieras) añadir progresivamente una variable al modelo. El algoritmo se puede encontrar en la sección de comentarios de esta página -. De desplazamiento hacia abajo y verá que en la parte inferior de la página

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

Yo añadiría que el algoritmo también tiene una característica interesante: se puede aplicar a cualquiera de los problemas de clasificación o regresión! Sólo tienes que contarla.

probarlo y ver por sí mismo.

En realidad sklearn no tiene un algoritmo de selección hacia adelante, que se cree una solicitud de extracción con una implementación de espera de selección de características de avance en el scikit-learn repositorio desde abril de 2017.

Como alternativa, hay adelante y un paso por delante en la selección hacia atrás mlxtend . Lo puede encontrar en el documento de secuencial selector de funciones

Licenciado bajo: CC-BY-SA con atribución
scroll top