El rendimiento de los modelos predictivos de aprendizaje automático sólo es tan bueno como sus datos, y sus datos sólo son tan buenos como la forma en que los prepara para el modelado.
El enfoque más común de la preparación de datos consiste en estudiar un conjunto de datos y revisar las expectativas de un algoritmo de aprendizaje automático, y luego elegir cuidadosamente las técnicas de preparación de datos más apropiadas para transformar los datos en bruto de manera que satisfagan mejor las expectativas del algoritmo. Esto es lento, costoso y requiere una gran cantidad de conocimientos.
Un enfoque alternativo de la preparación de datos consiste en aplicar paralelamente a los datos brutos un conjunto de técnicas de preparación de datos comunes y de utilidad común y combinar los resultados de todas las transformaciones en un único gran conjunto de datos a partir del cual se puede ajustar y evaluar un modelo.
Se trata de una filosofía alternativa para la preparación de datos que trata las transformaciones de datos como un enfoque para extraer las características más destacadas de los datos en bruto para exponer la estructura del problema a los algoritmos de aprendizaje. Requiere algoritmos de aprendizaje que sean escalables de las características de entrada de peso y que utilicen las características de entrada más relevantes para el objetivo que se está prediciendo.
Este enfoque requiere menos conocimientos especializados, es eficaz desde el punto de vista informático en comparación con una búsqueda completa en la cuadrícula de los métodos de preparación de datos, y puede ayudar a descubrir soluciones de preparación de datos no intuitivas que logren un buen o mejor rendimiento para un determinado problema de modelización predictiva.
En este tutorial, descubrirá cómo utilizar la extracción de características para la preparación de datos con datos tabulares.
Después de completar este tutorial, lo sabrás:
- La extracción de características proporciona un enfoque alternativo para la preparación de datos tabulares, en el que todas las transformaciones de datos se aplican en paralelo a los datos de entrada en bruto y se combinan para crear un gran conjunto de datos.
- Cómo utilizar el método de extracción de características para la preparación de datos para mejorar el rendimiento del modelo sobre una línea de base para un conjunto de datos de clasificación estándar.
- Cómo añadir la selección de características a la tubería de modelización de la extracción de características para dar un nuevo impulso al rendimiento de la modelización en un conjunto de datos estándar.
Descubre la limpieza de datos, la selección de características, la transformación de datos, la reducción de la dimensionalidad y mucho más en mi nuevo libro, con 30 tutoriales paso a paso y el código fuente completo en Python.
Empecemos.
Resumen del Tutorial
Este tutorial está dividido en tres partes; son:
- Técnica de extracción de características para la preparación de datos
- Conjunto de datos y línea de base de rendimiento
- Conjunto de datos de la clasificación del vino
- Desempeño del modelo de base
- Enfoque de extracción de características para la preparación de datos
Técnica de extracción de características para la preparación de datos
La preparación de los datos puede ser un desafío.
El enfoque que se prescribe y sigue con mayor frecuencia es analizar el conjunto de datos, revisar los requisitos de los algoritmos y transformar los datos en bruto para satisfacer mejor las expectativas de los algoritmos.
Esto puede ser efectivo, pero también es lento y puede requerir una profunda experiencia tanto con el análisis de datos como con los algoritmos de aprendizaje de máquinas.
Un enfoque alternativo consiste en tratar la preparación de las variables de entrada como un hiperparámetro de la tubería de modelización y ajustarla junto con la elección del algoritmo y la configuración del mismo.
Este también puede ser un enfoque eficaz que exponga soluciones poco intuitivas y que requiera muy poca experiencia, aunque puede ser costoso desde el punto de vista computacional.
Un enfoque que busca un término medio entre estos dos enfoques de la preparación de datos es tratar la transformación de los datos de entrada como una ingeniería de características o extracción de características procedimiento. Este consiste en aplicar a los datos en bruto un conjunto de técnicas de preparación de datos comunes o de utilidad común, y luego agregar todas las características para crear un gran conjunto de datos, para luego ajustar y evaluar un modelo sobre estos datos.
La filosofía del enfoque trata cada técnica de preparación de datos como una transformación que extrae las características más destacadas de los datos en bruto para presentarlas al algoritmo de aprendizaje. Lo ideal sería que esas transformaciones desenmarañaran las relaciones complejas y compusieran las variables de entrada, permitiendo a su vez el uso de algoritmos de modelización más sencillos, como las técnicas de aprendizaje de las máquinas lineales.
A falta de un nombre mejor, nos referiremos a esto como el «Método de ingeniería de características«o el»Método de extracción de características» para configurar la preparación de datos para un proyecto de modelado predictivo.
Permite utilizar el análisis de datos y la experiencia en algoritmos en la selección de métodos de preparación de datos y permite encontrar soluciones no intuitivas pero a un costo computacional mucho menor.
La exclusión en el número de características de entrada también puede abordarse explícitamente mediante el uso de técnicas de selección de características que intentan clasificar por orden la importancia o el valor del vasto número de características extraídas y sólo seleccionan un pequeño subconjunto de las más relevantes para predecir la variable objetivo.
Podemos explorar este enfoque de la preparación de datos con un ejemplo práctico.
Antes de sumergirnos en un ejemplo trabajado, seleccionemos primero un conjunto de datos estándar y desarrollemos una línea de base en el rendimiento.
¿Quieres empezar a preparar los datos?
Toma mi curso intensivo gratuito de 7 días por correo electrónico ahora (con código de muestra).
Haga clic para inscribirse y también para obtener una versión gratuita del curso en formato PDF.
Descargue su minicurso GRATUITO
Conjunto de datos y línea de base de rendimiento
En esta sección, primero seleccionaremos un conjunto de datos estándar de aprendizaje de la máquina y estableceremos una línea de base en el rendimiento de este conjunto de datos. Esto proporcionará el contexto para explorar el método de extracción de características de la preparación de datos en la siguiente sección.
Conjunto de datos de la clasificación del vino
Usaremos el conjunto de datos de clasificación del vino.
Este conjunto de datos tiene 13 variables de entrada que describen la composición química de las muestras de vino y requiere que el vino sea clasificado como uno de los tres tipos.
Puedes aprender más sobre el conjunto de datos aquí:
No hay necesidad de descargar el conjunto de datos ya que lo descargaremos automáticamente como parte de nuestros ejemplos de trabajo.
Abrir el conjunto de datos y revisar los datos en bruto. Las primeras filas de datos se enumeran a continuación.
Podemos ver que se trata de un problema de modelización predictiva de clasificación multiclase con variables de entrada numérica, cada una de las cuales tiene escalas diferentes.
14.23,1.71,2.43,15.6,127,2.8,3.06,.28,2.29,5.64,1.04,3.92,1065,1 13.2,1.78,2.14,11.2,100,2.65,2.76,.26,1.28,4.38,1.05,3.4,1050,1 13.16,2.36,2.67,18.6,101,2.8,3.24,.3,2.81,5.68,1.03,3.17,1185,1 14.37,1.95,2.5,16.8,113,3.85,3.49,.24,2.18,7.8,.86,3.45,1480,1 13.24,2.59,2.87,21,118,2.8,2.69,.39,1.82,4.32,1.04,2.93,735,1 … |
El ejemplo carga el conjunto de datos y lo divide en las columnas de entrada y salida, y luego resume los conjuntos de datos.
# Ejemplo de carga y resumen del conjunto de datos del vino de pandas importación read_csv # Definir la ubicación del conjunto de datos url = «https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv # Cargar el conjunto de datos como un marco de datos df = read_csv(url, encabezado=Ninguno) # Recuperar la matriz numérica datos = df.valores # Dividir las columnas en variables de entrada y salida X, y = datos[[:, :–1], datos[[:, –1] # resumir la forma de los datos cargados imprimir(X.forma, y.forma) |
Ejecutando el ejemplo, podemos ver que el conjunto de datos se cargó correctamente y que hay 179 filas de datos con 13 variables de entrada y una sola variable objetivo.
A continuación, vamos a evaluar un modelo en este conjunto de datos y establecer una línea de base en el rendimiento.
Desempeño del modelo de base
Podemos establecer una línea de base en el desempeño de la tarea de clasificación del vino mediante la evaluación de un modelo sobre los datos de entrada en bruto.
En este caso, evaluaremos un modelo de regresión logística.
En primer lugar, podemos realizar una preparación mínima de los datos asegurándonos de que las variables de entrada sean numéricas y que la variable objetivo esté codificada en una etiqueta, como espera la biblioteca de aprendizaje de ciencias.
... # Preparar mínimamente el conjunto de datos X = X.astype(«flotar) y = LabelEncoder().fit_transform(y.astype(«str)) |
A continuación, podemos definir nuestro modelo de predicción.
... # Definir el modelo modelo = LogisticRegression(solver=«Liberal»…) |
Evaluaremos el modelo usando el patrón oro de validación cruzada estratificada k-doble con 10 pliegues y tres repeticiones.
El rendimiento del modelo se evaluará utilizando la precisión de la clasificación.
... modelo = LogisticRegression(solver=«Liberal»…) # Definir el procedimiento de validación cruzada cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Evaluar el modelo resultados = puntaje_valor_cruzado(modelo, X, y, puntuación=«exactitud, cv=cv, n_jobs=–1) |
Al final del recorrido, informaremos la media y la desviación estándar de las puntuaciones de precisión recogidas en todas las repeticiones y pliegues de evaluación.
... # Informe de rendimiento imprimir(«Precisión: %.3f (%.3f) % (significa(resultados), std(resultados))) |
Enlazando todo esto, el ejemplo completo de la evaluación de un modelo de regresión logística en el conjunto de datos de la clasificación del vino crudo se enumera a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# Rendimiento del modelo base en el conjunto de datos del vino de numpy importación significa de numpy importación std de pandas importación read_csv de sklearn.preprocesamiento importación LabelEncoder de sklearn.model_selection importación RepeatedStratifiedKFold de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.modelo_lineal importación LogisticRegression # Cargar el conjunto de datos url = «https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv df = read_csv(url, encabezado=Ninguno) datos = df.valores X, y = datos[[:, :–1], datos[[:, –1] # Preparar mínimamente el conjunto de datos X = X.astype(«flotar) y = LabelEncoder().fit_transform(y.astype(«str)) # Definir el modelo modelo = LogisticRegression(solver=«Liberal»…) # Definir el procedimiento de validación cruzada cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Evaluar el modelo resultados = puntaje_valor_cruzado(modelo, X, y, puntuación=«exactitud, cv=cv, n_jobs=–1) # Informe de rendimiento imprimir(«Precisión: %.3f (%.3f) % (significa(resultados), std(resultados))) |
Al ejecutar el ejemplo se evalúa el rendimiento del modelo y se informa de la precisión de la clasificación de la media y la desviación estándar.
Sus resultados pueden variar dada la naturaleza estocástica del algoritmo de aprendizaje, el procedimiento de evaluación y las diferencias de precisión entre las máquinas. Intenta ejecutar el ejemplo unas cuantas veces.
En este caso, podemos ver que el modelo de regresión logística ajustado a los datos de entrada brutos alcanzó la precisión de clasificación media de alrededor del 95,3 por ciento, proporcionando una línea de base en el rendimiento.
A continuación, exploremos si podemos mejorar el rendimiento usando el enfoque basado en la extracción de características para la preparación de datos.
Enfoque de extracción de características para la preparación de datos
En esta sección, podemos explorar si podemos mejorar el rendimiento utilizando el enfoque de extracción de características para la preparación de datos.
El primer paso es seleccionar un conjunto de técnicas de preparación de datos comunes y de utilidad común.
En este caso, dado que las variables de entrada son numéricas, utilizaremos un rango de transformaciones para cambiar la escala de las variables de entrada como MinMaxScaler, StandardScaler y RobustScaler, así como transformaciones para encadenar la distribución de las variables de entrada como QuantileTransformer y KBinsDiscretizer. Finalmente, también usaremos transformadas que eliminan las dependencias lineales entre las variables de entrada como PCA y TruncatedSVD.
La clase FeatureUnion puede utilizarse para definir una lista de transformaciones a realizar, cuyos resultados serán agregados, es decir, unidos. Esto creará un nuevo conjunto de datos que tiene un gran número de columnas.
Una estimación del número de columnas sería de 13 variables de entrada por cinco transformaciones o 65 más las 14 columnas de salida de los métodos de reducción de la dimensionalidad PCA y SVD, para dar un total de unas 79 características.
... # Transforma para la unión de características transforma = lista() transforma.anexar((«mms, MinMaxScaler())) transforma.anexar((«ss, StandardScaler())) transforma.anexar((«rs, RobustScaler())) transforma.anexar((«qt, QuantileTransformer(n_quantiles=100, distribución_de_salida=«normal))) transforma.anexar((«kbd, KBinsDiscretizador(n_bins=10, codificar=«ordinal, estrategia=«uniforme))) transforma.anexar((«pca, PCA(n_componentes=7))) transforma.anexar((«svd, TruncadoSVD(n_componentes=7))) # Crear la unión de características fu = FeatureUnion(transforma) |
Podemos entonces crear un Pipeline de modelización con la FeatureUnion como primer paso y el modelo de regresión logística como paso final.
... # Definir el modelo modelo = LogisticRegression(solver=«Liberal»…) # Definir el oleoducto pasos = lista() pasos.anexar((«fu, fu)) pasos.anexar((‘m’, modelo)) tubería = Oleoducto(pasos=pasos) |
El oleoducto puede entonces ser evaluado utilizando una repetida validación cruzada estratificada en k como antes.
A continuación se muestra el ejemplo completo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# La preparación de datos como ingeniería de características para el conjunto de datos del vino de numpy importación significa de numpy importación std de pandas importación read_csv de sklearn.model_selection importación RepeatedStratifiedKFold de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.modelo_lineal importación LogisticRegression de sklearn.tubería importación Oleoducto de sklearn.tubería importación FeatureUnion de sklearn.preprocesamiento importación LabelEncoder de sklearn.preprocesamiento importación MinMaxScaler de sklearn.preprocesamiento importación StandardScaler de sklearn.preprocesamiento importación RobustScaler de sklearn.preprocesamiento importación QuantileTransformer de sklearn.preprocesamiento importación KBinsDiscretizador de sklearn.descomposición importación PCA de sklearn.descomposición importación TruncadoSVD # Cargar el conjunto de datos url = «https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv df = read_csv(url, encabezado=Ninguno) datos = df.valores X, y = datos[[:, :–1], datos[[:, –1] # Preparar mínimamente el conjunto de datos X = X.astype(«flotar) y = LabelEncoder().fit_transform(y.astype(«str)) # Transforma para la unión de características transforma = lista() transforma.anexar((«mms, MinMaxScaler())) transforma.anexar((«ss, StandardScaler())) transforma.anexar((«rs, RobustScaler())) transforma.anexar((«qt, QuantileTransformer(n_quantiles=100, distribución_de_salida=«normal))) transforma.anexar((«kbd, KBinsDiscretizador(n_bins=10, codificar=«ordinal, estrategia=«uniforme))) transforma.anexar((«pca, PCA(n_componentes=7))) transforma.anexar((«svd, TruncadoSVD(n_componentes=7))) # Crear la unión de características fu = FeatureUnion(transforma) # Definir el modelo modelo = LogisticRegression(solver=«Liberal»…) # Definir el oleoducto pasos = lista() pasos.anexar((«fu, fu)) pasos.anexar((‘m’, modelo)) tubería = Oleoducto(pasos=pasos) # Definir el procedimiento de validación cruzada cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Evaluar el modelo resultados = puntaje_valor_cruzado(tubería, X, y, puntuación=«exactitud, cv=cv, n_jobs=–1) # Informe de rendimiento imprimir(«Precisión: %.3f (%.3f) % (significa(resultados), std(resultados))) |
Al ejecutar el ejemplo se evalúa el rendimiento del modelo y se informa de la precisión de la clasificación de la media y la desviación estándar.
Sus resultados pueden variar dada la naturaleza estocástica del algoritmo de aprendizaje, el procedimiento de evaluación y las diferencias de precisión entre las máquinas. Intenta ejecutar el ejemplo unas cuantas veces.
En este caso, podemos ver un aumento en el rendimiento sobre el rendimiento de la línea de base, logrando una precisión de clasificación media de alrededor del 96,8 por ciento en comparación con el 95,3 por ciento de la sección anterior.
Intenta añadir más métodos de preparación de datos a la FeatureUnion para ver si puedes mejorar el rendimiento.
¿Puedes obtener mejores resultados?
Hágame saber lo que descubra en los comentarios de abajo.
También podemos utilizar la selección de rasgos para reducir los aproximadamente 80 rasgos extraídos a un subconjunto de los más relevantes para el modelo. Además de reducir la complejidad del modelo, también puede resultar en un aumento del rendimiento al eliminar las características de entrada irrelevantes y redundantes.
En este caso, utilizaremos la técnica de eliminación de rasgos recursivos, o RFE, para la selección de rasgos y la configuraremos para seleccionar los 15 rasgos más relevantes.
... # Definir la selección de la característica rfe = RFE(estimador=LogisticRegression(solver=«Liberal»…), n_funciones_para_seleccionar=15) |
Podemos entonces añadir la selección de la característica RFE a la tubería de modelación después de la FeatureUnion y antes de la LogisticRegression algoritmo.
... # Definir el oleoducto pasos = lista() pasos.anexar((«fu, fu)) pasos.anexar((«rfe, rfe)) pasos.anexar((‘m’, modelo)) tubería = Oleoducto(pasos=pasos) |
Enlazando todo esto, el ejemplo completo del método de preparación de datos de selección de características con selección de características se enumera a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# Preparación de datos como ingeniería de características con selección de características para el conjunto de datos del vino de numpy importación significa de numpy importación std de pandas importación read_csv de sklearn.model_selection importación RepeatedStratifiedKFold de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.modelo_lineal importación LogisticRegression de sklearn.tubería importación Oleoducto de sklearn.tubería importación FeatureUnion de sklearn.preprocesamiento importación LabelEncoder de sklearn.preprocesamiento importación MinMaxScaler de sklearn.preprocesamiento importación StandardScaler de sklearn.preprocesamiento importación RobustScaler de sklearn.preprocesamiento importación QuantileTransformer de sklearn.preprocesamiento importación KBinsDiscretizador de sklearn.selección_de_características importación RFE de sklearn.descomposición importación PCA de sklearn.descomposición importación TruncadoSVD # Cargar el conjunto de datos url = «https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv df = read_csv(url, encabezado=Ninguno) datos = df.valores X, y = datos[[:, :–1], datos[[:, –1] # Preparar mínimamente el conjunto de datos X = X.astype(«flotar) y = LabelEncoder().fit_transform(y.astype(«str)) # Transforma para la unión de características transforma = lista() transforma.anexar((«mms, MinMaxScaler())) transforma.anexar((«ss, StandardScaler())) transforma.anexar((«rs, RobustScaler())) transforma.anexar((«qt, QuantileTransformer(n_quantiles=100, distribución_de_salida=«normal))) transforma.anexar((«kbd, KBinsDiscretizador(n_bins=10, codificar=«ordinal, estrategia=«uniforme))) transforma.anexar((«pca, PCA(n_componentes=7))) transforma.anexar((«svd, TruncadoSVD(n_componentes=7))) # Crear la unión de características fu = FeatureUnion(transforma) # Definir la selección de la característica rfe = RFE(estimador=LogisticRegression(solver=«Liberal»…), n_funciones_para_seleccionar=15) # Definir el modelo modelo = LogisticRegression(solver=«Liberal»…) # Definir el oleoducto pasos = lista() pasos.anexar((«fu, fu)) pasos.anexar((«rfe, rfe)) pasos.anexar((‘m’, modelo)) tubería = Oleoducto(pasos=pasos) # Definir el procedimiento de validación cruzada cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Evaluar el modelo resultados = puntaje_valor_cruzado(tubería, X, y, puntuación=«exactitud, cv=cv, n_jobs=–1) # Informe de rendimiento imprimir(«Precisión: %.3f (%.3f) % (significa(resultados), std(resultados))) |
Al ejecutar el ejemplo se evalúa el rendimiento del modelo y se informa de la precisión de la clasificación de la media y la desviación estándar.
Sus resultados pueden variar dada la naturaleza estocástica del algoritmo de aprendizaje, el procedimiento de evaluación y las diferencias de precisión entre las máquinas. Intenta ejecutar el ejemplo unas cuantas veces.
De nuevo, podemos ver un nuevo aumento en el rendimiento desde el 96,8 por ciento con todos los rasgos extraídos hasta cerca del 98,9 con la selección de rasgos utilizada antes del modelado.