Ingeniería de funciones en sklearn (filtrado, incrustación y envoltura)

Tabla de contenido

​El primer paso en la edición de la ingeniería de funciones: comprender el negocio

método de filtro

​Editar filtrado de varianza

EDITAR - Filtrado por relevancia

- Filtrado chi-cuadrado

- Prueba F

- método de información mutua

​Editar método incrustado (Incrustado)

Método de embalaje (envoltorio)

inserte la descripción de la imagen aquí
El primer paso de la ingeniería de funciones: entender el negocio


Si las características son relativamente pequeñas y fáciles de entender, podemos juzgar la elección de características por nosotros mismos, como el conjunto de datos anterior del Titanic. Sin embargo, en el campo de las aplicaciones de datos reales, como las finanzas, la atención médica y el comercio electrónico, nuestros datos no pueden tener características tan pocas y obvias como los datos del Titanic. Entonces, ¿qué debemos hacer si nos encontramos con situaciones extremas y no podemos confiar en nuestra comprensión del negocio para seleccionar funciones? Tenemos cuatro métodos que se pueden usar para seleccionar características: filtrado, incrustación, envoltura y reducción de dimensionalidad

 

método de filtro


Los métodos de filtrado se utilizan a menudo como un paso de preprocesamiento, la selección de funciones es completamente independiente de cualquier algoritmo de aprendizaje automático. Selecciona características en función de sus puntuaciones en varias pruebas estadísticas y varios indicadores de correlación.

inserte la descripción de la imagen aquí
filtrado de varianza


Umbral de varianza
Por ejemplo, si la varianza de una característica en sí es muy pequeña, significa que las muestras básicamente no tienen ninguna diferencia en esta característica. Es posible que la mayoría de los valores en la característica sean los mismos, o incluso la los valores de toda la característica son los mismos. Entonces esta característica no tiene efecto en la distinción de la muestra.
Así que no importa lo que vaya a hacer la próxima ingeniería de características, las características con una varianza de 0 deben eliminarse primero. VarianceThreshold tiene un umbral de parámetro importante, que indica el umbral de varianza, lo que significa descartar todas las características con una varianza menor que el umbral. Si no se completa, el valor predeterminado es 0, es decir, eliminar todas las características con los mismos registros.

 

Primero importa la función original

import pandas as pd
data = pd.read_csv(r'F:\data\digitreconocer.csv')

La forma de la función original es (42000, 784)
y luego usamos el filtrado de varianza

from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold() #Instanciación, sin parámetros, la varianza predeterminada es 0
X_var0 = selector.fit_transform(X) #Obtener la nueva matriz de características después de eliminar características no calificadas
# Equivalente a X_var0 = selector.fit_transform( VarianceThreshold ())

La forma de la función después del filtrado de varianza es (42000, 708)
Hasta ahora, se han eliminado todas las características con una varianza de 0.
Si solo desea mantener la mitad de los valores propios, puede hacerlo

import numpy as np
np.median(X.var().values) # Este paso es tomar la mediana
X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)

X_fsvar en este momento .shape es (42000, 392)
Por supuesto, si desea obtener los primeros 50, puede ordenar los valores primero y luego definir el umbral como la varianza del 50.

Además, cuando la varianza es una clasificación binaria, el valor de la característica es una variable aleatoria de Bernoulli, y la varianza de estas variables se puede calcular como Var[X] = p(1-p), p es una clase de binaria características de clasificación en La probabilidad explicada por esta característica.
Se puede definir que cuando una determinada categoría representa más del 80% de las características de dos categorías, las características se eliminan.

X_bvar = VarianceThreshold(.8 * (1 - .8)).fit_transform(X)

El impacto del filtrado de varianza en el modelo
Después de hacer esto, ¿cómo afectará el efecto del modelo? Aquí, he preparado para usted la comparación del efecto y el tiempo de ejecución de KNN y el bosque aleatorio antes y después del filtrado de varianza.

Comparación #KNN vs Random Forest bajo diferentes efectos de filtrado de varianza
de sklearn.ensemble import RandomForestClassifier como RFC
de sklearn.neighbors import KNeighborsClassifier como KNN
de sklearn.model_selection import cross_val_score
import numpy as np
X = data.iloc[:,1:]
y = data.iloc[:,0]
X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)
#======【ADVERTENCIA DE TIEMPO: 35mins +】==== == #
cross_val_score(KNN(),X,y,cv=5).mean()
#El comando mágico en python, puede usar directamente %%timeit para calcular el tiempo requerido para ejecutar el código en esta celda
#Para calcular Necesita ejecutar el código en esta celda muchas veces (generalmente 7 veces) y calcular el valor promedio, por lo que el tiempo para ejecutar %%timeit será mucho más largo que el tiempo para ejecutar el código solo en la celda
#
=== == =【ADVERTENCIA DE TIEMPO: 4 horas】======#
%%timeit
cross_val_score(KNN(),X,y,cv=5).mean()
#======【ADVERTENCIA DE TIEMPO: 20 minutos o más】======#
cross_val_score(KNN(),X_fsvar,y,cv=5).mean()
#======【ADVERTENCIA DE TIEMPO: 2 horas】======#
%%timeit
cross_val_score(KNN(),X,y,cv=5).mean()
cross_val_score(RFC(n_estimators=10,random_state=0),X,y,cv= 5).media()
Tsai


Resultados KNN antes del filtrado de varianza

inserte la descripción de la imagen aquí
#======【ADVERTENCIA DE TIEMPO: 20 mins+】======#
cross_val_score(KNN(),X_fsvar,y,cv=5).mean()
#======【ADVERTENCIA DE TIEMPO: 2 horas】======#
%%timeit
cross_val_score(KNN(),X,y,cv=5).mean()

KNN resultado después del filtrado de varianza

 inserte la descripción de la imagen aquí

 

La tasa de precisión ha mejorado ligeramente, pero el tiempo de ejecución promedio se ha reducido en 10 minutos y la eficiencia del algoritmo ha aumentado en 1/3 después de la selección de funciones.
¿Qué pasa con los bosques aleatorios?
Antes del filtrado de varianza de bosque aleatorio

inserte la descripción de la imagen aquí

 

Después del filtrado de varianza de bosque aleatorio

inserte la descripción de la imagen aquí

 

Lo primero que se puede observar es que la precisión de Random Forest es ligeramente inferior a la de KNN, pero el tiempo de ejecución es inferior al 1 % de KNN, que solo tarda más de diez segundos. En segundo lugar, después del filtrado de varianza, la precisión del bosque aleatorio también aumentó ligeramente, pero el tiempo de ejecución apenas cambió, siendo 11 segundos.
¿Por qué el bosque aleatorio corre tan rápido? ¿Por qué el filtrado de varianza no tiene un gran impacto en los bosques aleatorios? Esto se debe a la diferencia en la cantidad de cálculo involucrado en los principios de los dos algoritmos. El algoritmo de vecino más cercano KNN, el árbol de decisión único, la máquina de vectores de soporte SVM, la red neuronal y el algoritmo de regresión necesitan atravesar entidades o aumentar dimensiones para realizar operaciones, por lo que ellos mismos tienen una gran cantidad de cómputo y toman mucho tiempo, por lo que Feature la selección, como el filtrado de varianza, es particularmente importante para ellos. Pero para los algoritmos que no necesitan atravesar características, como el bosque aleatorio, selecciona aleatoriamente las características para la bifurcación, y la operación en sí es muy rápida, por lo que la selección de características es mediocre. Esto es realmente fácil de entender. No importa cómo el método de filtrado reduzca la cantidad de características, el bosque aleatorio solo seleccionará una cantidad fija de características para modelar; el algoritmo del vecino más cercano es diferente, cuantas menos características, menor será la dimensión de cálculo de la distancia, el modelo Obviamente, se volverá más ligero a medida que se reduzcan las características. Por lo tanto, el objeto principal del método de filtrado es: algoritmos que necesitan atravesar características o aumentar dimensiones, y el objetivo principal del método de filtrado es ayudar a los algoritmos a reducir los costos informáticos mientras se mantiene el rendimiento del algoritmo.
En general,
el efecto del filtrado de varianza es el siguiente

inserte la descripción de la imagen aquí
- Filtrado por relevancia


Después de seleccionar la varianza, debemos considerar la siguiente pregunta: la correlación. Queremos seleccionar características que sean relevantes y significativas para la etiqueta, porque dichas características pueden brindarnos mucha información. Si las características no están asociadas con etiquetas, solo desperdiciará nuestra memoria computacional y posiblemente introducirá ruido en el modelo. En sklearn, tenemos tres métodos de uso común para juzgar la correlación entre características y etiquetas: Chi-cuadrado, prueba F e información mutua.

- Filtrado chi-cuadrado


El filtrado de chi-cuadrado es un filtro de correlación específico para etiquetas discretas (es decir, problemas de clasificación). La clase de prueba de chi-cuadrado feature_selection.chi2 calcula la estadística de chi-cuadrado entre cada característica y etiqueta no negativa, y clasifica las características de acuerdo con la estadística de chi-cuadrado de mayor a menor. Combinado con feature_selection.SelectKBest, que puede ingresar "criterios de puntuación" para seleccionar las principales K características con las puntuaciones más altas, podemos usar esto para eliminar características que probablemente sean independientes de las etiquetas y no tengan nada que ver con nuestros propósitos de clasificación.
Además, si la prueba de chi-cuadrado detecta que todos los valores en una característica son iguales, nos pedirá que usemos la varianza para realizar primero el filtrado de varianza. Además, acabamos de comprobar que cuando usamos el filtrado de varianza para filtrar la mitad de las características, se mejora el rendimiento del modelo. Entonces, aquí, usamos los datos filtrados por varianza completados cuando el umbral = mediana para hacer la prueba de chi-cuadrado (si el rendimiento del modelo después del filtrado de varianza se reduce, entonces no usaremos los datos filtrados por varianza, pero usaremos datos sin procesar ):

 

from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2 #Chi Square Test
#Supongamos que aquí sabemos que necesitamos 300 características
X_fschi = SelectKBest(chi2,k= 300 ). fit_transform(X_fsvar,Y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,Y,cv=5).mean() cross_val_score(RFC(n_estimators=10,random_state=0) ,X_fsvar,Y, cv
= 5).mean()

Descubrimos que cuando se utilizó la mediana para el filtrado de métodos, la puntuación de la verificación cruzada fue 0,9388098166696807, pero después del filtrado de chi-cuadrado, la puntuación de la verificación cruzada se convirtió en 0,9333098667649198, ¡que se redujo!
Esto muestra que hay un problema con la configuración de K=300, y nuestro valor de K está ajustado demasiado pequeño.
¿Cómo elegir el valor K?
Podemos tomar una curva de aprendizaje y darle una oportunidad.

%matplotlib
importación en línea matplotlib.pyplot as plt
score = []
for i in range(390,200,-10):
    X_fschi = SelectKBest(chi2,k=i).fit_transform(X_fsvar,Y)
    once = cross_val_score(RFC(n_estimators=10 ,random_state=0),X_fschi,Y,cv=5).mean()
    puntuación.append(una vez)
plt.plot(rango(390,200,-10),puntuación)
plt.show()
inserte la descripción de la imagen aquí

 

Otra forma de seleccionar el valor de k: elija el valor de k mirando el valor p
Método: elija k mirando el valor p.
La esencia de la prueba de chi-cuadrado es inferir la diferencia entre dos grupos de datos, y la hipótesis original de la prueba es "los dos grupos de datos son independientes entre sí". La prueba de chi-cuadrado devuelve dos estadísticas, el valor de chi-cuadrado y el valor P. Entre ellos, el valor de chi-cuadrado es difícil de definir el rango efectivo, y el valor de p, generalmente usamos 0.01 o 0.05 como nivel de significancia , que es el límite del juicio de valor p. Específicamente, podemos verlo de esta manera:

Desde la perspectiva de la ingeniería de funciones, esperamos seleccionar funciones con un valor de chi-cuadrado grande y un valor de p inferior a 0,05, es decir, funciones asociadas con etiquetas. Antes de llamar a SelectKBest, podemos obtener directamente el valor de chi-cuadrado y el valor P correspondiente a cada característica del modelo instanciado por chi2.

chivalue, pvalues_chi = chi2(X_fsvar,Y)
#¿Cuánto ocupa k? Queremos eliminar todas las características con un valor p mayor que un valor establecido, digamos 0.05 o 0.01:
k = chivalue.shape[0] - (pvalues_chi > 0.05).sum()
 

- Prueba F


La prueba F, también conocida como ANOVA, es un método de filtrado que se utiliza para capturar la relación lineal entre cada característica y la etiqueta. Puede hacer regresión y
clasificación, por lo que contiene dos clases: feature_selection.f_classif (clasificación de prueba F) y feature_selection.f_regression (regresión de prueba F). La clasificación de prueba F se usa para datos cuyas etiquetas son variables discretas, mientras que la regresión de prueba F se usa para datos cuyas etiquetas son variables continuas.
La esencia de la prueba F es encontrar una relación lineal entre dos conjuntos de datos, y su hipótesis nula es "no hay una relación lineal significativa en los datos". Devuelve dos estadísticas, valor F y valor p. Al igual que el filtrado de chi-cuadrado, queremos seleccionar características con un valor p inferior a 0,05 o 0,01, que están significativamente relacionadas de forma lineal con la etiqueta, y las características con un valor p superior a 0,05 o 0,01 se consideran características que no tienen una relación significativa. relación lineal con la etiqueta. , debe eliminarse. Tomando la clasificación de la prueba F como ejemplo, continuamos realizando la selección de características en el conjunto de datos digitales:

from sklearn.feature_selection import f_classif
F, pvalues_f = f_classif(X_fsvar,Y)
k = F.shape[0] - (pvalues_f > 0.05).sum()
 

- método de información mutua


El método de información mutua es un método de filtrado utilizado para capturar cualquier relación (incluidas las relaciones lineales y no lineales) entre cada entidad y etiqueta. Similar a la prueba F, puede hacer regresión y clasificación, y contiene dos clases feature_selection.mutual_info_classif (clasificación de información mutua) y
feature_selection.mutual_info_regression (regresión de información mutua). El uso y los parámetros de estas dos clases son exactamente los mismos que los de la prueba F, pero el método de información mutua es más poderoso que la prueba F, y la prueba F solo puede encontrar una relación lineal, mientras que el método de información mutua puede encontrar cualquier relación. .

from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(X_fsvar,y)
k = result.shape[0] - sum(result <= 0)
#X_fsmic = SelectKBest(MIC, k=completar k específico).fit_transform(X_fsvar , y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()

sugerencia:
use primero el filtrado de varianza y luego use el método de información mutua para capturar la correlación

inserte la descripción de la imagen aquí
Incorporado


Por lo tanto, en comparación con el método de filtrado**, el resultado del método de incrustación será más preciso para la utilidad del modelo en sí y tiene un mejor efecto en la mejora de la eficacia del modelo**. Además, debido a la consideración de la contribución de las características al modelo, las características irrelevantes (características que requieren filtrado de correlación) y las características indiscriminadas (características que requieren filtrado de varianza) se eliminarán debido a la falta de contribución al modelo, que se puede describir como filtrado Una evolución de la ley.

 inserte la descripción de la imagen aquí

 

Puede usar el método de incrustación directamente sin filtrar en absoluto.

Feature_selection.SelectFromModel

inserte la descripción de la imagen aquí

 

Los dos primeros parámetros son los más importantes.
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier as RFC
RFC_ = RFC(n_estimators = 10,random_state = 0) #Instanciación de bosque aleatorio
X_embedded = SelectFromModel(RFC_, umbral=0.005).fit_transform(X,Y)
X_embedded El el resultado de .shape

es (42000, 47)
El umbral de 0,005 es muy alto para los datos de 780 entidades y la dimensionalidad del modelo aquí se reduce significativamente.
Del mismo modo, también podemos encontrar el umbral óptimo dibujando una curva de aprendizaje.

importar numpy como np
importar matplotlib.pyplot como plt
RFC_.fit(X,Y).feature_importances_

umbral = np.linspace(0,(RFC_.fit(X,Y).feature_importances_).max(),20)

puntuación = []
para i en el umbral:
    X_embedded = SelectFromModel(RFC_,threshold=i).fit_transform(X,Y)
    once = cross_val_score(RFC_,X_embedded,Y,cv=5).mean()
    score.append(once)
plt.plot(umbral,puntuación)
plt.show()

代码结果如下:

inserte la descripción de la imagen aquí

 

A medida que el umbral aumenta, el efecto del modelo empeora gradualmente, se eliminan más y más funciones y la pérdida de información aumenta gradualmente. Pero antes de 0,00134, el efecto del modelo se puede mantener por encima de 0,93, por lo que podemos elegir un valor para verificar el efecto del modelo.

X_embedded = SelectFromModel(RFC_,threshold = 0.00067).fit_transform(X,Y)
X_embedded.shape
cross_val_score(RFC_,X_embedded,Y,cv=5).mean()

代码结果为
(42000, 324)
0.939905083368037

Se puede ver que el número de características se reduce a más de 324 en un instante, que es más pequeño que las 392 columnas de los resultados filtrados por la mediana cuando filtramos la varianza, y el puntaje de validación cruzada de 0.9399 es más alto que el resultado de 0,9388 después del filtro de varianza, que es Dado que el método de incrustación es más específico para el rendimiento del modelo que el filtrado de varianza, si cambia el algoritmo y usa el mismo umbral, es posible que el efecto no sea tan bueno.

Al igual que con otros parámetros de ajuste, podemos elegir un rango después de la primera curva de aprendizaje y usar una curva de aprendizaje refinada para encontrar el mejor valor:

score2 = []
for i in np.linspace(0,0.00134,20):
    X_embedded = SelectFromModel(RFC_, threshold=i).fit_transform(X,Y)
    once = cross_val_score(RFC_, X_embedded, Y, cv=5). mean()
    score2.append(once)
plt.figure(figsize=[20,5])
plt.plot(np.linspace(0,0.00134,20),score2)
plt.xticks(np.linspace(0,0.00134, 20))
plt.mostrar()
 


X_embedded = SelectFromModel(RFC_,threshold=0.000564).fit_transform(X,Y)
X_embedded.shape
cross_val_score(RFC_,X_embedded,Y,cv=10).mean()

Es posible que hayamos encontrado el mejor resultado del modelo existente.
(42000, 340)
0.9414774325210074
¿Y si ajustamos los parámetros del random forest?

cross_val_score(RFC(n_estimators=100,random_state=0),X_embedded,Y,cv=5).mean()

0.9639525817795566

La cantidad de características obtenidas es aún menor que la detección de varianza, y el rendimiento del modelo es mayor que antes sin detección, que ya es comparable a KNN calculado una vez durante media hora (la precisión de KNN es 96.58%), y luego el bosque aleatorio Al ajustar los parámetros, la tasa de precisión debería poder aumentar mucho. Se puede ver que con el método de incrustación, podemos lograr fácilmente el objetivo de la selección de características: reducir la cantidad de cálculo y mejorar el rendimiento del modelo. Por lo tanto, la incrustación puede ser un enfoque más eficiente que el filtrado, que implica pensar en muchas estadísticas. Sin embargo, cuando el algoritmo en sí es muy complejo, el cálculo del método de filtrado es mucho más rápido que el método de incrustación, por lo que en datos grandes, aún le daremos prioridad al método de filtrado.

Método de embalaje (envoltorio)

inserte la descripción de la imagen aquí

 

El contenedor entrena a un estimador en un conjunto de características inicial y obtiene la importancia de cada característica a través de coef_attribute o mediante feature_importances_attribute. Luego, las características menos importantes se eliminan del conjunto actual de características. Este proceso se repite recursivamente en el conjunto podado hasta que finalmente se alcanza el número deseado de características a seleccionar. A diferencia del método de filtrado y el método de incrustación, el entrenamiento único resuelve todos los problemas, y el método de empaquetado necesita usar subconjuntos de funciones para múltiples entrenamientos, por lo que requiere el costo computacional más alto.

La función objetivo más típica es el método de eliminación de características recursivas (eliminación de características recursivas, abreviado como RFE). Es un algoritmo de optimización codicioso diseñado para encontrar el subconjunto de características de mejor rendimiento. Construye iterativamente el modelo y mantiene las mejores características o elimina las peores características en cada iteración, y en la próxima iteración, usa las características que no fueron seleccionadas en el modelado anterior para construir el siguiente modelo hasta que se agotan todas las características. tan lejos como sea posible. A continuación, clasifica las funciones según el orden en que se mantienen o eliminan y, finalmente, selecciona el mejor subconjunto. El efecto del método de empaquetado es el más propicio para mejorar el rendimiento del modelo entre todos los métodos de selección de características. Puede usar muy pocas características para lograr excelentes resultados. Además, cuando el número de características es el mismo, se puede comparar el efecto del método de empaquetado y el método de incrustación, pero es más lento que el método de incrustación, por lo que no es adecuado para datos demasiado grandes. Por el contrario, el método de envoltura es el método de selección de características que mejor puede garantizar el efecto del modelo.

feature_selection.RFE
clase sklearn.feature_selection.RFE(estimador,n_features_to_select=Ninguno,paso=1,verbose=0)

inserte la descripción de la imagen aquí

 

from sklearn.feature_selection import RFE
RFC_ = RFC(n_estimators=10, random_state=0) selector = RFE(RFC_, n_features_to_select=340, step=50).fit(X,Y) #340 selector
recién seleccionado por método de incrustación. selector.ranking_ X_wrapper = selector.transform(X) cross_val_score(RFC_,X_wrapper,Y,cv=5).mean() 0.9389522459432109





A continuación, dibuje la curva de aprendizaje de los envoltorios.

puntuación = []
para i en el rango (1,751,50):
    X_wrapper = RFE(RFC_, n_features_to_select=i, step=50).fit_transform(X,Y)
    once = cross_val_score(RFC_, X_wrapper, Y, cv=5). mean()
    score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(1,751,50),score)
plt.xticks(range(1,751,50))
plt.show()
inserte la descripción de la imagen aquí

 

Se puede ver claramente que bajo el método de empaquetado, cuando se aplican 50 funciones, el rendimiento del modelo ha alcanzado más del 90%, que es mucho más eficiente que el método de incrustación y el método de filtrado. Podemos ampliar la imagen y buscar puntos en los que el modelo se vuelve muy estable para dibujar más curvas de aprendizaje (como hicimos en las incrustaciones). Si lo que perseguimos en este momento es minimizar el tiempo de ejecución del modelo, podemos incluso elegir directamente 50 como el número de características, que se basa en reducir las características en un 94%, y también puede garantizar que el rendimiento del modelo sea más del 90% La combinación de características no es ineficiente.

Además, mencionamos que los envoltorios pueden superar a las incrustaciones cuando la cantidad de características es la misma. Intente ver si también usamos 340 como el número de funciones, ejecútelo y podrá sentir cuál es más rápido, el método de empaquetado o el método de incrustación. Dado que el efecto del método de envoltura es similar al del método de incrustación, utilizando la curva de aprendizaje en un rango más pequeño, también podemos ajustar muy bien el efecto del método de envoltura. Puede probarlo.

Resumen de la ingeniería de características
Cuando la cantidad de datos es grande, se prefieren el filtrado de varianza y el ajuste de información mutua, seguidos de otros métodos de selección de características.
Cuando se utiliza la regresión logística, se prefiere el método de incrustación.
Cuando se utilizan máquinas de vectores de soporte, se prefieren los envoltorios.

Enlace original: https://blog.csdn.net/xlperpetual/article/details/103402737

Creo que este artículo está muy bien escrito, pero la cantidad de visitas es muy pequeña. Quiero llevarlo al campo de visión de todos para que más personas puedan aprenderlo.

Supongo que te gusta

Origin blog.csdn.net/m0_63309778/article/details/130682922
Recomendado
Clasificación