in

Preprocesamiento con sklearn: una guía completa y completa

0j9TC7PTOq1YaQ5se

Preprocesamiento con sklearn: una guía completa y completa

Steven Van Dorpe

13 de diciembre de 2018·17 min de lectura

Para los aspirantes a científicos de datos, a veces puede ser difícil encontrar el camino a través del bosque de técnicas de preprocesamiento. Sklearn su biblioteca de preprocesamiento forma una base sólida para guiarlo a través de esta importante tarea en la canalización de la ciencia de datos. A pesar de que Sklearn a tiene una documentación bastante sólida, a menudo pierde la agilidad y la intuición entre los diferentes conceptos.

Este artículo pretende ser una guía completa onorte preprocesamiento con sklearn v0.20.0. Incluye todos funciones de utilidad y clases de transformadores disponibles en sklearn, complementadas con algunas funciones útiles de otras bibliotecas comunes. Además de eso, el artículo está estructurado en un orden lógico que representa el orden en el que se deben ejecutar las transformaciones discutidas.

Se tratarán los siguientes temas:

  • Valores faltantes
  • Características polinomiales
  • Características categóricas
  • Características numéricas
  • Transformaciones personalizadas
  • Escala de características
  • Normalización

Tenga en cuenta que los pasos tres y cuatro se pueden realizar de forma intercambiable, ya que estas transformaciones deben ejecutarse de forma independiente entre sí.

Valores faltantes

El manejo de los valores perdidos es una tarea de preprocesamiento esencial que puede deteriorar drásticamente su modelo si no se realiza con el cuidado suficiente. Deben surgir algunas preguntas al manejar los valores perdidos:

¿Tengo valores perdidos? ¿Cómo se expresan en los datos? ¿Debo retener muestras con valores perdidos? ¿O debería reemplazarlos? Si es así, ¿con qué valores deberían reemplazarse?

Antes de comenzar a manejar los valores perdidos, es importante identificar los valores faltantes y saber con qué valor se reemplazan. Debería poder averiguarlo combinando la información de metadatos con un análisis exploratorio.

Una vez que sepa un poco más sobre los datos faltantes, debe decidir si desea o no conservar las entradas con datos faltantes. Según Chris Albon (Aprendizaje automático con el libro de recetas de Python), esta decisión debería depender parcialmente de qué tan aleatorios son los valores perdidos.

Si son completamente aleatorios, no dan ninguna información adicional y pueden omitirse. Por otro lado, si no son aleatorios, el hecho de que falte un valor es en sí mismo información y puede expresarse como una característica binaria adicional.

También tenga en cuenta que eliminar una observación completa porque tiene un valor faltante, podría ser una mala decisión y provocar la pérdida de información. Al igual que mantener una fila completa de valores perdidos porque tiene un valor perdido significativo, podría no ser su mejor movimiento.

Materialicemos esta teoría con algunos ejemplos de codificación usando sklearn’s MissingIndicator. Para darle algún significado a nuestro código, crearemos un conjunto de datos muy pequeño con tres características y cinco muestras. Los datos contienen valores obvios que faltan expresados ​​como no un número o 999.

import numpy as np
import pandas as pd
X = pd.DataFrame(
np.array([5,7,8, np.NaN, np.NaN, np.NaN, -5,
0,25,999,1,-1, np.NaN, 0, np.NaN])
.reshape((5,3)))
X.columns = ['f1', 'f2', 'f3'] #feature 1, feature 2, feature 3
1*GOuqmvEWiJqvrRwWUNjgCQ

Conjunto de datos con tres características y cinco muestras

Eche un vistazo rápido a los datos para saber dónde se encuentran los valores faltantes. Las filas o columnas con muchos valores perdidos no significativos se pueden eliminar de sus datos con pandas ‘ dropna función. Echemos un vistazo a los parámetros más importantes:

  • eje: 0 para filas, 1 para columnas
  • tresh: el número de no NaN que no deben eliminar una fila o columna
  • inplace: actualiza el marco

Actualizamos nuestro conjunto de datos eliminando todas las filas (eje= 0) con solamente valores faltantes. Tenga en cuenta que en este caso, en lugar de configurar tresh a 1, también puede configurar el cómo parámetro a ‘todos’. Como resultado, se descarta nuestra segunda muestra, ya que solo consta de valores perdidos. Tenga en cuenta que restablecemos el índice y eliminamos la columna de índice anterior para mayor comodidad en el futuro.

X.dropna(axis=0, thresh=1, inplace=True)X.reset_index(inplace=True)X.drop(['index'], axis=1, inplace=True)

También creemos algunas características booleanas adicionales que nos digan si a una muestra le falta un valor para una característica determinada. Empiece por importar el MissingIndicator de sklearn.impute (tenga en cuenta que versión 0.20.0 es obligatorio (actualizar con ‘actualización de conda scikit-learn‘)).

Desafortunadamente, el MissingIndicator no admite varios tipos de valores perdidos (consulte esta pregunta en Stackoverflow). De ahí por qué tenemos que convertir el 999 valores en nuestro marco de datos para Yaya‘s. A continuación, creamos, ajustamos y transformamos un objeto MissingIndicator que detectará todos NaN’s en nuestros datos.

A partir de este indicador, podemos crear un nuevo marco de datos con valores booleanos que indiquen si una instancia tiene un valor faltante para una determinada característica. Pero, ¿por qué solo tenemos dos columnas nuevas mientras que teníamos tres características originales? Después de la eliminación de nuestra segunda muestra, f2 ya no tenía valores perdidos. Si el MissingIndicator no detecta ningún valor faltante en una característica, no crea una nueva característica de esta característica.

Agregaremos estas nuevas características más adelante a nuestros datos originales, por ahora podemos almacenarlas en el indicador variable.

from sklearn.impute import MissingIndicatorX.replace({999.0 : np.NaN}, inplace=True)indicator = MissingIndicator(missing_values=np.NaN)indicator = indicator.fit_transform(X)indicator = pd.DataFrame(indicator, columns=['m1', 'm3'])

Después de decidir conservar (algunos de) sus valores perdidos y crear indicadores de valor perdidos, la siguiente pregunta es si debe reemplazar los valores perdidos. La mayoría de los algoritmos de aprendizaje funcionan mal cuando los valores perdidos se expresan como no un número (np.NaN) y necesitan alguna forma de imputación de valor faltante. Tenga en cuenta que algunas bibliotecas y algoritmos, como XGBoost, pueden manejar los valores perdidos e imputar estos valores automáticamente mediante el aprendizaje.

Imputación de valores

Para completar los valores perdidos con estrategias comunes, sklearn proporciona una SimpleImputer. Las cuatro estrategias principales son significar, más frecuente, mediana y constante (no olvide configurar el fill_value parámetro). En el siguiente ejemplo, imputamos los valores faltantes para nuestro marco de datos X con la media de la característica.

from sklearn.impute import SimpleImputerimp = SimpleImputer(missing_values=np.nan, strategy='mean')imp.fit_transform(X)

Tenga en cuenta que los valores devueltos se colocan en un Numpy array y perdemos toda la metainformación. Dado que todas estas estrategias se pueden imitar en pandas, vamos a usar pandas Fillna método para imputar valores perdidos. Para ‘significar‘podemos usar el siguiente código. Esta pandas La implementación también proporciona opciones para completar (llenar) o rellenar al revés (bfill), que son convenientes cuando se trabaja con series de tiempo.

X.fillna(X.mean(), inplace=True)

Otras formas populares de imputar datos faltantes son agrupar los datos con el vecino k más cercano (KNN) algoritmo o interpolando los valores utilizando una amplia gama de métodos de interpolación. Ambas técnicas no se implementan en sklearnde preprocesamiento de la biblioteca y no se discutirá aquí.

Características polinomiales

La creación de entidades polinomiales es una forma simple y común de ingeniería de entidades que agrega complejidad a los datos de entrada numéricos mediante la combinación de entidades.

A menudo se crean características polinómicas cuando queremos incluir la noción de que existe una relación no lineal entre las características y el objetivoSe utilizan principalmente para agregar complejidad a modelos lineales con características pequeñas, o cuando sospechamos que el efecto de una característica depende de otra característica.

Antes de manejar los valores perdidos, debe decidir si desea utilizar entidades polinomiales o no. Si, por ejemplo, reemplaza todos los valores perdidos por 0, todos los productos cruzados que utilizan esta función serán 0. Además, si no reemplaza los valores perdidos (Yaya), la creación de entidades polinomiales generará un error de valor en el fit_transform fase, ya que la entrada debe ser finita.

En este sentido, la sustitución de los valores perdidos por la mediana o la media parece ser una opción razonable. Como no estoy completamente seguro de esto y no puedo encontrar ninguna información consistente, hice esta pregunta en el StackExchange de ciencia de datos.

Sklearn provee un Características del polinomio class para crear entidades polinomiales desde cero. los la licenciatura El parámetro determina el grado máximo del polinomio. Por ejemplo, cuando la licenciatura se establece en dos y X = x1, x2, las características creadas serán 1, x1, x2, x1², x1x2 y x2². los Interacción_only El parámetro deja que la función sepa que solo queremos las características de interacción, es decir, 1, x1, x2 y x1x2.

Aquí, creamos características polinomiales hasta el tercer grado y la única característica de interacción. Como resultado, obtenemos cuatro características nuevas: f1.f2, f1.f3, f2.f3 y f1.f2.f3. Tenga en cuenta que nuestras características originales también se incluyen en la salida y cortamos las nuevas características para agregarlas a nuestros datos más adelante.

from sklearn.preprocessing import PolynomialFeaturespoly = PolynomialFeatures(degree=3, interaction_only=True)polynomials = pd.DataFrame(poly
.fit_transform(X),
columns=['0','1','2','3',
'p1', 'p2', 'p3', 'p4'])
[['p1', 'p2', 'p3', 'p4']]

Al igual que con cualquier otra forma de ingeniería de características, es importante crear características polinomiales antes de haciendo cualquier escala de características.

Ahora, concatenemos nuestras nuevas características de indicadores faltantes y características polinomiales a nuestros datos con pandas. concat método.

X = pd.concat([X, indicator, polynomials], axis=1)
1*cYZP26jphBcq mCFbaEvqg

Marco de datos con características originales (f), indicadores de valor perdido (m) y características polinomiales (p)

Características categóricas

La recopilación de datos categóricos es otro proceso esencial durante el preprocesamiento de datos. Desafortunadamente, sklearn’s La biblioteca de aprendizaje automático no admite el manejo de datos categóricos. Incluso para los modelos basados ​​en árboles, es necesario convertir características categóricas en una representación numérica.

Antes de comenzar a transformar sus datos, es importante averiguar si la función en la que está trabajando es ordinal (en lugar de nominal). Una característica ordinal se describe mejor como una característica con categorías naturales ordenadas y las distancias entre las categorías no se conocen.

Una vez que sepa en qué tipo de datos categóricos está trabajando, puede elegir una herramienta de transformación adecuada. En sklearn eso será un Codificador ordinal para datos ordinales, y un OneHotEncoder para datos nominales.

Consideremos un ejemplo simple para demostrar cómo funcionan ambas clases. Cree un marco de datos con cinco entradas y tres características: sexo, tipo de sangre y Nivel de Educación.

X = pd.DataFrame(
np.array(['M', 'O-', 'medium',
'M', 'O-', 'high',
'F', 'O+', 'high',
'F', 'AB', 'low',
'F', 'B+', np.NaN])
.reshape((5,3)))
X.columns = ['sex', 'blood_type', 'edu_level']

Al observar el marco de datos, debe notar que el nivel de educación es la única característica ordinal (se puede ordenar y se desconoce la distancia entre las categorías). Comenzaremos codificando esta función con el Codificador ordinal clase. Importe la clase y cree una nueva instancia. A continuación, actualice la función de nivel educativo ajustando y transformando la función en el codificador. El resultado debería verse como se muestra a continuación.

from sklearn.preprocessing import OrdinalEncoderencoder = OrdinalEncoder()X.edu_level = encoder.fit_transform(X.edu_level.values.reshape(-1, 1))
1*VJoERQks8uiJ6oJu4WzWfA

Tenga en cuenta que tenemos un problema bastante molesto aquí: nuestro valor perdido está codificado como una clase separada (3.0). Al observar detenidamente la documentación, se revela que aún no existe una solución para este problema. Una buena señal es que el sklearn los desarrolladores están discutiendo las posibilidades de implementar una solución adecuada.

Otro problema es que el orden de…

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

04QR3SerbRrNlhxRgLnbQUU 1.1632597467.fit lim.size 1200x630

El evento de fans de Tudum de Netflix muestra ‘Stranger Things’, ‘The Witcher’ y más

oracle social share fb

Big Data | Oráculo