Las clases en el sklearn.feature_selection El módulo se puede utilizar para la selección de características / reducción de dimensionalidad en conjuntos de muestras, ya sea para mejorar las puntuaciones de precisión de los estimadores o para aumentar su rendimiento en conjuntos de datos de muy alta dimensión.

1.13.1. Eliminando características con baja variación

VarianceThreshold es un enfoque de línea de base simple para la selección de características. Elimina todas las características cuya variación no alcanza algún umbral. De forma predeterminada, elimina todas las características de varianza cero, es decir, las características que tienen el mismo valor en todas las muestras.

Como ejemplo, suponga que tenemos un conjunto de datos con características booleanas y queremos eliminar todas las características que son uno o cero (activadas o desactivadas) en más del 80% de las muestras. Las características booleanas son variables aleatorias de Bernoulli, y la varianza de tales variables está dada por

[mathrm{Var}[X] = p (1 – p) ]

para que podamos seleccionar usando el umbral .8 * (1 - .8):

>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
>>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
>>> sel.fit_transform(X)
array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])

Como se esperaba, VarianceThreshold ha eliminado la primera columna, que tiene una probabilidad (p = 5/6> .8 ) de contener un cero.

1.13.2. Selección de características univariadas

La selección de características univariadas funciona seleccionando las mejores características basadas en pruebas estadísticas univariadas. Puede verse como un paso previo al procesamiento de un estimador. Scikit-learn expone las rutinas de selección de características como objetos que implementan la transform método:

  • SelectKBest elimina todo menos el (k ) características de puntuación más alta
  • SelectPercentile elimina todas las características, excepto un porcentaje de puntuación más alto especificado por el usuario
  • utilizando pruebas estadísticas univariadas comunes para cada característica: tasa de falsos positivos SelectFpr, tasa de descubrimiento falso SelectFdro error familiar SelectFwe.
  • GenericUnivariateSelect permite realizar una selección de características univariadas con una estrategia configurable. Esto permite seleccionar la mejor estrategia de selección univariante con estimador de búsqueda de hiperparámetros.

Por ejemplo, podemos realizar una ( chi ^ 2 ) pruebe las muestras para recuperar solo las dos mejores características de la siguiente manera:

>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import chi2
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)

Estos objetos toman como entrada una función de puntuación que devuelve puntuaciones univariadas y valores p (o solo puntuaciones para SelectKBest y SelectPercentile):

  • Para regresión: f_regression, mutual_info_regression
  • Para clasificación: chi2, f_classif, mutual_info_classif

Los métodos basados ​​en la prueba F estiman el grado de dependencia lineal entre dos variables aleatorias. Por otro lado, los métodos de información mutua pueden capturar cualquier tipo de dependencia estadística, pero al ser no paramétricos, requieren más muestras para una estimación precisa.

Selección de características con datos escasos

Si usa datos dispersos (es decir, datos representados como matrices dispersas), chi2, mutual_info_regression, mutual_info_classif tratará los datos sin hacerlos densos.

Advertencia

Tenga cuidado de no utilizar una función de puntuación de regresión con un problema de clasificación, obtendrá resultados inútiles.

Ejemplos:

  • Selección de características univariadas
  • Comparación de la prueba F e información mutua

1.13.3. Eliminación de características recursivas

Dado un estimador externo que asigna pesos a las características (por ejemplo, los coeficientes de un modelo lineal), el objetivo de la eliminación de características recursivas (RFE) es seleccionar características considerando recursivamente conjuntos de características cada vez más pequeños. Primero, el estimador se entrena en el conjunto inicial de características y la importancia de cada característica se obtiene a través de cualquier atributo específico (como coef_, feature_importances_) o invocable. Luego, las características menos importantes se eliminan del conjunto de características actual. Ese procedimiento se repite de forma recursiva en el conjunto podado hasta que finalmente se alcanza el número deseado de características para seleccionar.

RFECV realiza RFE en un ciclo de validación cruzada para encontrar el número óptimo de características.

Ejemplos:

  • Eliminación de características recursivas: Un ejemplo de eliminación de características recursivas que muestra la relevancia de los píxeles en una tarea de clasificación de dígitos.
  • Eliminación de características recursivas con validación cruzada: Un ejemplo de eliminación de características recursivas con ajuste automático del número de características seleccionadas con validación cruzada.

1.13.4. Selección de características usando SelectFromModel

SelectFromModel es un metatransformador que se puede utilizar junto con cualquier estimador de la importancia de cada característica a través de un atributo específico (como coef_, feature_importances_) o invocable después del ajuste. Las características se consideran sin importancia y se eliminan, si la importancia correspondiente de los valores de la característica están por debajo de los proporcionados. threshold parámetro. Además de especificar el umbral numéricamente, existen heurísticas integradas para encontrar un umbral utilizando un argumento de cadena. Las heurísticas disponibles son “media”, “mediana” y múltiplos flotantes de estos como “0,1 * media”. En combinación con el threshold criterios, se puede utilizar el max_features parámetro para establecer un límite en el número de funciones a seleccionar.

Para obtener ejemplos sobre cómo se debe utilizar, consulte las secciones siguientes.

Ejemplos de

  • Selección de características secuenciales y basadas en modelos

1.13.4.1. Selección de funciones basadas en L1

Modelos lineales penalizados con la norma L1 tienen soluciones escasas: muchos de sus coeficientes estimados son cero. Cuando el objetivo es reducir la dimensionalidad de los datos para usarlos con otro clasificador, se pueden usar junto con SelectFromModel para seleccionar los coeficientes distintos de cero. En particular, los estimadores dispersos útiles para este propósito son los Lasso para regresión, y de LogisticRegression y LinearSVC para clasificación:

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
>>> model = SelectFromModel(lsvc, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 3)

Con SVM y regresión logística, el parámetro C controla la escasez: cuanto menor es C, menos características se seleccionan. Con Lasso, cuanto mayor sea el parámetro alfa, menos funciones se seleccionarán.

Ejemplos:

  • Clasificación de documentos de texto usando características dispersas: Comparación de diferentes algoritmos para la clasificación de documentos, incluida la selección de características basada en L1.

Detección de compresión y recuperación de L1

Para una buena elección de alfa, el Lazo puede recuperar completamente el conjunto exacto de variables distintas de cero utilizando solo unas pocas observaciones, siempre que se cumplan ciertas condiciones específicas. En particular, el número de muestras debe ser “suficientemente grande”, o los modelos L1 funcionarán al azar, donde “suficientemente grande” depende del número de coeficientes distintos de cero, el logaritmo del número de características, la cantidad de ruido, el valor absoluto más pequeño de los coeficientes distintos de cero y la estructura de la matriz de diseño X. Además, la matriz de diseño debe mostrar ciertas propiedades específicas, como no estar demasiado correlacionada.

No existe una regla general para seleccionar un parámetro alfa para la recuperación de coeficientes distintos de cero. Puede establecerse mediante validación cruzada (LassoCV o LassoLarsCV), aunque esto puede conducir a modelos infravalorados: incluir un pequeño número de variables no relevantes no es perjudicial para la puntuación de predicción. BIC (LassoLarsIC) tiende, por el contrario, a establecer valores altos de alfa.

Referencia Richard G. Baraniuk “Detección compresiva”, Revista de procesamiento de señales IEEE [120] Julio de 2007 http://users.isr.ist.utl.pt/~aguiar/CS_notes.pdf

1.13.4.2. Selección de características basadas en árboles

Estimadores basados ​​en árboles (ver el sklearn.tree módulo y bosque de árboles en el sklearn.ensemble módulo) se puede utilizar para calcular importancias de características basadas en impurezas, que a su vez se pueden usar para descartar características irrelevantes (cuando se combinan con la SelectFromModel meta-transformador):

>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier(n_estimators=50)
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_  
array([ 0.04...,  0.05...,  0.4...,  0.4...])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape               
(150, 2)

Ejemplos:

  • Destacan importancias con bosques de árboles: ejemplo de datos sintéticos que muestran la recuperación de las características realmente significativas.
  • Importancia de píxeles con un bosque de árboles paralelo: ejemplo sobre datos de reconocimiento facial.

1.13.5. Selección secuencial de funciones

Selección secuencial de funciones [sfs] (SFS) está disponible en SequentialFeatureSelector transformador. SFS puede ser hacia adelante o hacia atrás:

Forward-SFS es un procedimiento codicioso que encuentra iterativamente la mejor característica nueva para agregar al conjunto de características seleccionadas. Concretamente, inicialmente comenzamos con una característica cero y encontramos la característica que maximiza una puntuación con validación cruzada cuando un estimador se entrena en esta característica única. Una vez que se selecciona esa primera característica, repetimos el procedimiento agregando una nueva característica al conjunto de características seleccionadas. El procedimiento se detiene cuando se alcanza el número deseado de funciones seleccionadas, según lo determinado por el n_features_to_select parámetro.

Backward-SFS sigue la misma idea pero funciona en la dirección opuesta: en lugar de comenzar sin característica y agregar características con avidez, comenzamos con todos las facciones y con avidez retirar características del set. los direction El parámetro controla si se usa SFS hacia adelante o hacia atrás.

En general, la selección hacia adelante y hacia atrás no produce resultados equivalentes. Además, una puede ser mucho más rápida que la otra dependiendo del número solicitado de características seleccionadas: si tenemos 10 características y solicitamos 7 características seleccionadas, la selección hacia adelante necesitaría realizar 7 iteraciones mientras que la selección hacia atrás solo necesitaría realizar 3.

SFS se diferencia de RFE y SelectFromModel en que no requiere que el modelo subyacente exponga un coef_ o feature_importances_ atributo. Sin embargo, puede ser más lento teniendo en cuenta que es necesario evaluar más modelos, en comparación con los otros enfoques. Por ejemplo, en la selección hacia atrás, la iteración que va de m características para m - 1 las características que utilizan la validación cruzada de k-fold requieren ajuste m * k modelos, mientras RFE requeriría solo un ajuste, y SelectFromModel siempre hace un solo ajuste y no requiere iteraciones.

Ejemplos de

  • Selección de características secuenciales y basadas en modelos

Referencias:

sfs

Ferri et al, Estudio comparativo de técnicas para la selección de características a gran escala.

1.13.6. Selección de características como parte de una canalización

La selección de características se usa generalmente como un paso de procesamiento previo antes de realizar el aprendizaje real. La forma recomendada de hacer esto en scikit-learn es usar un Pipeline:

clf = Pipeline([
  ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
  ('classification', RandomForestClassifier())
])
clf.fit(X, y)

En este fragmento utilizamos un LinearSVC junto con SelectFromModel para evaluar la importancia de las características y seleccionar las características más relevantes. Entonces un RandomForestClassifier se entrena en la salida transformada, es decir, usando solo características relevantes. Puede realizar operaciones similares con los otros métodos de selección de características y también clasificadores que proporcionan una forma de evaluar la importancia de las características, por supuesto. Ver el Pipeline ejemplos para más detalles.