ML con Python: selección de características de datos
En el capítulo anterior, hemos visto en detalle cómo preprocesar y preparar datos para el aprendizaje automático. En este capítulo, comprendamos en detalle la selección de características de datos y varios aspectos involucrados en ella.
Importancia de la selección de características de datos
El rendimiento del modelo de aprendizaje automático es directamente proporcional a las características de datos que se utilizan para entrenarlo. El rendimiento del modelo de AA se verá afectado negativamente si las características de datos que se le proporcionan son irrelevantes. Por otro lado, el uso de características de datos relevantes puede aumentar la precisión de su modelo ML, especialmente la regresión lineal y logística.
Ahora surge la pregunta de qué es la selección automática de funciones. Puede definirse como el proceso con la ayuda del cual seleccionamos aquellas características en nuestros datos que son más relevantes para la variable de salida o predicción en la que estamos interesados. También se denomina selección de atributos.
Los siguientes son algunos de los beneficios de la selección automática de características antes de modelar los datos:
Realizar la selección de características antes del modelado de datos reducirá el sobreajuste.
Realizar la selección de características antes del modelado de datos aumentará la precisión del modelo ML.
Realizar la selección de características antes del modelado de datos reducirá el tiempo de entrenamiento
Técnicas de selección de funciones
Las siguientes son técnicas de selección automática de características que podemos usar para modelar datos ML en Python:
Selección univariante
Esta técnica de selección de características es muy útil para seleccionar esas características, con la ayuda de pruebas estadísticas, y tiene una relación más fuerte con las variables de predicción. Podemos implementar la técnica de selección de características univariadas con la ayuda de SelectKBest0class de la biblioteca de Python scikit-learn.
Example
En este ejemplo, usaremos el conjunto de datos de diabetes de los indios Pima para seleccionar 4 de los atributos que tengan las mejores características con la ayuda de la prueba estadística de chi-cuadrado.
from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values
A continuación, separaremos la matriz en componentes de entrada y salida:
X = array[:,0:8]
Y = array[:,8]
Las siguientes líneas de código seleccionarán las mejores características del conjunto de datos:
test = SelectKBest(score_func=chi2, k=4)
fit = test.fit(X,Y)
También podemos resumir los datos para la salida según nuestra elección. Aquí, establecemos la precisión en 2 y mostramos los 4 atributos de datos con las mejores características junto con la mejor puntuación de cada atributo:
set_printoptions(precision=2)
print(fit.scores_)
featured_data = fit.transform(X)
print ("\nFeatured data:\n", featured_data[0:4])
Output
[ 111.52 1411.89 17.61 53.11 2175.57 127.67 5.39 181.3 ]
Featured data:
[
[148. 0. 33.6 50. ]
[ 85. 0. 26.6 31. ]
[183. 0. 23.3 32. ]
[ 89. 94. 28.1 21. ]
]
Eliminación de características recursivas
Como sugiere el nombre, la técnica de selección de características RFE (eliminación recursiva de características) elimina los atributos de forma recursiva y crea el modelo con los atributos restantes. Podemos implementar la técnica de selección de características RFE con la ayuda de la clase RFE de la biblioteca de Python scikit-learn.
Ejemplo
En este ejemplo, usaremos RFE con algoritmo de regresión logística para seleccionar los 3 mejores atributos que tengan las mejores características del conjunto de datos de Diabetes de los indios Pima a.
from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values
A continuación, separaremos la matriz en sus componentes de entrada y salida:
X = array[:,0:8]
Y = array[:,8]
Las siguientes líneas de código seleccionarán las mejores características de un conjunto de datos:
model = LogisticRegression()
rfe = RFE(model, 3)
fit = rfe.fit(X, Y)
print("Number of Features: %d")
print("Selected Features: %s")
print("Feature Ranking: %s")
Salida
Number of Features: 3
Selected Features: [ True False False False False True True False]
Feature Ranking: [1 2 3 5 6 1 1 4]
Podemos ver en la salida anterior, RFE elige preg, mass y pedi como las primeras 3 mejores características. Están marcados como 1 en la salida.
Análisis de componentes principales (PCA)
PCA, generalmente llamada técnica de reducción de datos, es una técnica de selección de características muy útil ya que usa álgebra lineal para transformar el conjunto de datos en una forma comprimida. Podemos implementar la técnica de selección de características de PCA con la ayuda de la clase PCA de la biblioteca de Python scikit-learn. Podemos seleccionar el número de componentes principales en la salida.
Ejemplo
En este ejemplo, usaremos PCA para seleccionar los 3 mejores componentes principales del conjunto de datos de diabetes de los indios Pima.
from pandas import read_csv
from sklearn.decomposition import PCA
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values
A continuación, separaremos la matriz en componentes de entrada y salida:
X = array[:,0:8]
Y = array[:,8]
Las siguientes líneas de código extraerán características del conjunto de datos:
pca = PCA(n_components=3)
fit = pca.fit(X)
print("Explained Variance: %s") % fit.explained_variance_ratio_
print(fit.components_)
Salida
Explained Variance: [ 0.88854663 0.06159078 0.02579012]
[
[
-2.02176587e-03 9.78115765e-02 1.60930503e-02 6.07566861e-02
9.93110844e-01 1.40108085e-02 5.37167919e-04 -3.56474430e-03
]
[
2.26488861e-02 9.72210040e-01 1.41909330e-01 -5.78614699e-02
-9.46266913e-02 4.69729766e-02 8.16804621e-04 1.40168181e-01
]
[
-2.24649003e-02 1.43428710e-01 -9.22467192e-01 -3.07013055e-01
2.09773019e-02 -1.32444542e-01 -6.39983017e-04 -1.25454310e-01
]
]
Podemos observar a partir del resultado anterior que los 3 componentes principales se parecen poco a los datos de origen.
Importancia de la característica
Como sugiere el nombre, la técnica de importancia de características se utiliza para elegir las características de importancia. Básicamente, utiliza un clasificador supervisado capacitado para seleccionar características. Podemos implementar esta técnica de selección de características con la ayuda de la clase ExtraTreeClassifier de la biblioteca de Python scikit-learn.
Ejemplo
En este ejemplo, usaremos ExtraTreeClassifier para seleccionar características del conjunto de datos de diabetes de los indios Pima.
from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier
path = r'C:\Desktop\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(data, names=names)
array = dataframe.values
A continuación, separaremos la matriz en componentes de entrada y salida:
X = array[:,0:8]
Y = array[:,8]
Las siguientes líneas de código extraerán características del conjunto de datos:
model = ExtraTreesClassifier()
model.fit(X, Y)
print(model.feature_importances_)
Salida
[ 0.11070069 0.2213717 0.08824115 0.08068703 0.07281761 0.14548537 0.12654214 0.15415431]
A partir de la salida, podemos observar que existen puntuaciones para cada atributo. Cuanto mayor sea la puntuación, mayor será la importancia de ese atributo.