No scikit-learn haber algoritmo de regresión selección / por pasos hacia adelante?
-
16-10-2019 - |
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?
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:
- Usar modelos intrínsecamente escasas como
ElasticNet
oLasso
. - Normalizar sus características con
StandardScaler
, y luego disponer sus funciones con sólomodel.coef_
. Para las covariables perfectamente independientes es equivalente a la clasificación por los valores de p. Elsklearn.feature_selection.RFE
clase lo hará por ti, y aunRFECV
evaluará el número óptimo de características. - un implementación de la selección hacia adelante por ajustado $ R $ ^ 2 que funciona con
statsmodels
. - 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 . - 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