scikit-learn

ScikitLearn

Tutorial ScikitLearn: Introducción al preprocesamiento de datos

Scikit Learn: Introducción al preprocesamiento de datos en Python. Aprende técnicas clave para limpiar y transformar datos antes del modelado, utilizando pandas y scikit-learn.

Aprende ScikitLearn GRATIS y certifícate

¿Qué es el preprocesamiento de datos y por qué es necesario antes del modelado?

El preprocesamiento de datos es una etapa crucial en el flujo de trabajo de aprendizaje automático, donde se transforman y preparan los datos brutos para hacerlos aptos para el modelado

Los datos reales, provenientes de fuentes diversas, suelen contener imperfecciones como valores faltantes, ruido, errores y formatos inconsistentes, lo que puede afectar negativamente el rendimiento de los algoritmos si no se tratan adecuadamente.

La necesidad de preprocesar los datos radica en que la mayoría de los algoritmos de aprendizaje automático asumen que los datos son de alta calidad y están en un formato específico. Por ejemplo, muchos algoritmos no pueden manejar valores nulos o requieren que las variables estén escaladas en un rango determinado. Ignorar estas necesidades puede conducir a modelos inexactos o incluso a fallos en la ejecución del algoritmo.

Existen varias razones fundamentales para realizar un preprocesamiento cuidadoso:

  • Mejora de la calidad de los datos: Al limpiar los datos, se eliminan errores y se corrigen inconsistencias, lo que conduce a resultados más confiables.
  • Homogeneización de formatos: Los datos pueden provenir de múltiples fuentes y en distintos formatos; es necesario unificar estos formatos para garantizar una correcta interpretación por parte de los algoritmos.
  • Tratamiento de valores faltantes: Los valores nulos o faltantes pueden distorsionar el análisis. Las técnicas de imputación permiten reemplazar estos valores de manera que se preserve la integridad del conjunto de datos.
  • Escalado y normalización: Las diferencias en las escalas de las variables pueden influir en el comportamiento de ciertos algoritmos. Aplicar escalado o normalización ayuda a que todas las variables contribuyan de manera equitativa al modelo.
  • Codificación de variables categóricas: Los algoritmos requieren datos numéricos; por tanto, las variables categóricas deben ser convertidas mediante técnicas de codificación como One-Hot Encoding.
  • Reducción de dimensionalidad: Simplificar el conjunto de datos mediante la eliminación de características irrelevantes o redundantes puede mejorar la eficiencia y la interpretabilidad del modelo.

Por ejemplo, considerar un conjunto de datos con información demográfica para predecir el ingreso anual. Si la variable "ocupación" está categorizada como texto, los algoritmos no podrán utilizarla directamente. Es necesario convertir esta variable en un formato numérico utilizando técnicas de codificación.

Además, el preprocesamiento facilita el cumplimiento de las suposiciones estadísticas que subyacen en muchos algoritmos. Por ejemplo, algunos modelos asumen que las variables siguen una distribución normal o que no existe multicolinealidad entre ellas. Aplicar transformaciones adecuadas puede ayudar a cumplir estas condiciones.

En el contexto de Scikit-Learn, el preprocesamiento es apoyado por una variedad de herramientas diseñadas para simplificar y estandarizar estas tareas. Algunas de las funciones y clases más relevantes incluyen:

  • sklearn.preprocessing.StandardScaler: Para estandarizar características eliminando la media y escalando a varianza unitaria.
  • sklearn.impute.SimpleImputer: Para completar valores faltantes utilizando estrategias como la media o la mediana.
  • sklearn.preprocessing.OneHotEncoder: Para convertir variables categóricas en una matriz de características binarias.
  • sklearn.feature_selection.SelectKBest: Para seleccionar las k características más importantes basadas en pruebas estadísticas.

El uso de estas herramientas no solo agiliza el proceso de preprocesamiento, sino que también garantiza que las transformaciones sean aplicadas de manera consistente y reproducible. Esto es especialmente importante en proyectos colaborativos o cuando se integran diferentes conjuntos de datos.

En resumen, el preprocesamiento de datos es una etapa indispensable que impacta directamente en la efectividad y precisión de los modelos de aprendizaje automático. Invertir tiempo en esta fase asegura que los algoritmos puedan aprender correctamente de los datos, conduciendo a resultados más fiables y robustos.

Preprocesamiento vs. modelado

El preprocesamiento de datos y el modelado son dos etapas fundamentales y claramente diferenciadas en el flujo de trabajo del aprendizaje automático. Mientras que el preprocesamiento se centra en la preparación y transformación de los datos para que sean aptos para su análisis, el modelado implica la aplicación de algoritmos de aprendizaje automático para ajustar un modelo a los datos preprocesados.

El preprocesamiento puede incluir tareas como la limpieza de datos, la transformación de variables, el manejo de valores atípicos y la codificación de variables categóricas. Estas operaciones son esenciales para garantizar que los datos cumplan con los requisitos de entrada de los algoritmos y para mejorar la calidad de los datos que alimentarán al modelo.

Por otro lado, el modelado se refiere al proceso de seleccionar y entrenar un algoritmo específico, como una regresión lineal o un árbol de decisión, para aprender patrones a partir de los datos preprocesados. El objetivo del modelado es encontrar una función que pueda generalizar y hacer predicciones sobre nuevos datos.

Es importante distinguir entre ambas etapas porque cada una requiere enfoques y herramientas diferentes. El preprocesamiento suele involucrar operaciones de manipulación y transformación de datos, a menudo utilizando bibliotecas como pandas o los módulos de preprocesamiento de scikit-learn. El modelado, en cambio, se basa en la aplicación de algoritmos estadísticos y de aprendizaje automático disponibles en módulos como sklearn.linear_model o sklearn.ensemble.

Además, separar claramente el preprocesamiento del modelado ayuda a evitar problemas como el sesgo de validación o el data leakage. Por ejemplo, si se escala todo el conjunto de datos antes de dividirlo en entrenamiento y prueba, se puede introducir información del conjunto de prueba en el modelo durante el entrenamiento, lo que lleva a una sobreestimación del rendimiento.

Para ilustrar esta diferencia, considerar un conjunto de datos con variables numéricas y categóricas. El preprocesamiento podría incluir la imputación de valores faltantes utilizando SimpleImputer, el escalado de variables numéricas con StandardScaler y la codificación de variables categóricas con OneHotEncoder. Una vez que los datos están preprocesados correctamente, se procede al modelado, donde se puede utilizar un algoritmo como RandomForestClassifier para entrenar el modelo.

Es recomendable utilizar pipelines de scikit-learn para encadenar las etapas de preprocesamiento y modelado de manera cohesiva y reproducible. Los pipelines permiten aplicar secuencialmente transformaciones de preprocesamiento y finalmente ajustar el modelo, asegurando que las transformaciones se aplican correctamente tanto al conjunto de entrenamiento como al de prueba.

La distinción entre preprocesamiento y modelado también facilita la optimización de hiperparámetros. Al separar las etapas, es posible utilizar técnicas como la validación cruzada para ajustar los parámetros del modelo sin contaminar el proceso con datos de prueba. Esto contribuye a obtener un modelo más generalizable y robusto.

Preprocesamientos habituales en pandas y scikit learn

El preprocesamiento de datos es un paso esencial en el aprendizaje automático que involucra la transformación y preparación de los datos para su uso en modelos predictivos. Tanto pandas como scikit-learn ofrecen herramientas robustas para realizar estas tareas de manera eficiente y efectiva.

En pandas, es común utilizar funciones para la limpieza y manipulación de datos. Por ejemplo, para manejar valores faltantes se emplea DataFrame.isnull() junto con DataFrame.fillna() o DataFrame.dropna(). Estas funciones permiten identificar y reemplazar valores nulos o eliminar filas y columnas que los contienen:

import pandas as pd

# Reemplazar valores nulos por la media de la columna
df['columna_numerica'] = df['columna_numerica'].fillna(df['columna_numerica'].mean())

Además, pandas facilita la transformación de tipos de datos, lo cual es crucial cuando se trabaja con fechas o variables categóricas. La función pd.to_datetime() convierte cadenas de texto en objetos de fecha y hora, permitiendo extraer características temporales como el día, mes o año:

# Convertir columna de texto a datetime
df['fecha'] = pd.to_datetime(df['fecha'])

# Extraer el mes de la fecha
df['mes'] = df['fecha'].dt.month

La codificación de variables categóricas es otro preprocesamiento habitual. Con pandas, se utiliza get_dummies() para realizar una codificación one-hot, transformando variables categóricas en variables binarias:

# Codificación one-hot de la columna 'categoría'
df_codificado = pd.get_dummies(df, columns=['categoría'])

Por su parte, scikit-learn ofrece transformadores más avanzados y estandarizados para el preprocesamiento, integrándose fácilmente en pipelines de modelado. El módulo sklearn.preprocessing contiene clases como StandardScaler para escalar características y OneHotEncoder para codificar variables categóricas de manera eficiente:

from sklearn.preprocessing import StandardScaler, OneHotEncoder

# Escalado de variables numéricas
scaler = StandardScaler()
df['columna_escalada'] = scaler.fit_transform(df[['columna_numerica']])

El uso de OneHotEncoder en scikit-learn es preferible cuando se trabaja dentro de un pipeline, permitiendo una integración fluida con otros pasos del preprocesamiento y el modelado:

from sklearn.compose import ColumnTransformer

# Definir transformadores para diferentes tipos de datos
preprocesamiento = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), ['columna_numerica']),
        ('cat', OneHotEncoder(), ['columna_categórica'])
    ])

# Aplicar preprocesamiento
X_preprocesado = preprocesamiento.fit_transform(X)

La gestión de valores atípicos es otra tarea común. En pandas, es posible identificarlos utilizando técnicas estadísticas como el rango intercuartílico (IQR) o mediante visualizaciones con boxplots. Posteriormente, se pueden tratar eliminándolos o aplicando transformaciones:

# Detectar valores atípicos utilizando IQR
Q1 = df['columna_numerica'].quantile(0.25)
Q3 = df['columna_numerica'].quantile(0.75)
IQR = Q3 - Q1

# Filtrar valores atípicos
df_sin_atipicos = df[~((df['columna_numerica'] < (Q1 - 1.5 * IQR)) | (df['columna_numerica'] > (Q3 + 1.5 * IQR)))]

En scikit-learn, el módulo sklearn.impute incluye clases como SimpleImputer para la imputación de valores faltantes siguiendo estrategias como la media, mediana o moda:

from sklearn.impute import SimpleImputer

# Imputación de valores faltantes con la media
imputador = SimpleImputer(strategy='mean')
X_imputado = imputador.fit_transform(X)

La normalización es otro preprocesamiento habitual para ajustar las escalas de las variables. Scikit-learn proporciona Normalizer, que normaliza las muestras individualmente para que tengan una norma unitaria:

from sklearn.preprocessing import Normalizer

# Normalizar datos
normalizador = Normalizer()
X_normalizado = normalizador.fit_transform(X)

Para seleccionar características relevantes, scikit-learn ofrece métodos como SelectKBest y RFE (Recursive Feature Elimination), permitiendo mejorar el rendimiento y reducir la complejidad del modelo:

from sklearn.feature_selection import SelectKBest, f_regression

# Seleccionar las 10 mejores características
selector = SelectKBest(score_func=f_regression, k=10)
X_seleccionado = selector.fit_transform(X, y)

La división de datos en conjuntos de entrenamiento y prueba es esencial para evaluar el rendimiento del modelo. La función train_test_split de scikit-learn facilita esta tarea:

from sklearn.model_selection import train_test_split

# Dividir datos en entrenamiento y prueba
X_entrenamiento, X_prueba, y_entrenamiento, y_prueba = train_test_split(X, y, test_size=0.2, random_state=42)

Finalmente, el uso de pipelines permite encadenar múltiples pasos de preprocesamiento y modelado en un flujo cohesivo, facilitando la reproducibilidad y evitando el data leakage:

from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier

# Crear pipeline con preprocesamiento y modelo
pipeline = Pipeline(steps=[
    ('preprocesamiento', preprocesamiento),
    ('modelo', RandomForestClassifier())
], memory = None)

# Entrenar modelo
pipeline.fit(X_entrenamiento, y_entrenamiento)

Este enfoque integrado con pipelines asegura que todas las transformaciones se apliquen de manera consistente tanto en los datos de entrenamiento como en los de prueba, mejorando la fiabilidad de las predicciones.

La combinación de pandas y scikit-learn en el preprocesamiento proporciona un conjunto completo de herramientas para preparar los datos de forma efectiva. Al aprovechar las fortalezas de ambas bibliotecas, es posible desarrollar modelos más precisos y robustos.

Aprende ScikitLearn GRATIS online

Ejercicios de esta lección Introducción al preprocesamiento de datos

Evalúa tus conocimientos de esta lección Introducción al preprocesamiento de datos con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de ScikitLearn

Accede a todas las lecciones de ScikitLearn y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Aprendizaje Automático

scikit-learn

Introducción Y Entorno

Introducción E Instalación

scikit-learn

Introducción Y Entorno

Introducción Al Preprocesamiento De Datos

scikit-learn

Preprocesamiento De Datos

Identificación Y Tratamiento De Valores Faltantes

scikit-learn

Preprocesamiento De Datos

Escalado De Datos

scikit-learn

Preprocesamiento De Datos

Normalización De Datos

scikit-learn

Preprocesamiento De Datos

Codificación De Variables Categóricas

scikit-learn

Preprocesamiento De Datos

Ingeniería De Características

scikit-learn

Preprocesamiento De Datos

Selección De Características

scikit-learn

Preprocesamiento De Datos

Extracción De Características

scikit-learn

Preprocesamiento De Datos

Particionamiento De Datos

scikit-learn

Preprocesamiento De Datos

Preprocesamiento De Datos Desbalanceados

scikit-learn

Preprocesamiento De Datos

Introducción A La Regresión

scikit-learn

Regresión

Regresión Lineal

scikit-learn

Regresión

Regresión Knn Kneighborsregressor

scikit-learn

Regresión

Regresión Svm Con Svr

scikit-learn

Regresión

Regresión Con Árboles Decisiontreeregressor

scikit-learn

Regresión

Regresión Con Algoritmos De Conjunto

scikit-learn

Regresión

Introducción A La Clasificación

scikit-learn

Clasificación

Clasificación Con Regresión Logística

scikit-learn

Clasificación

Clasificación Knn Kneighborsclassifier

scikit-learn

Clasificación

Clasificación Svm Con Svc

scikit-learn

Clasificación

Clasificación Con Árboles Decisiontreeclassifier

scikit-learn

Clasificación

Clasificación Con Algoritmos De Conjunto

scikit-learn

Clasificación

Reducción De La Dimensionalidad Con Pca

scikit-learn

Aprendizaje No Supervisado

Clustering Con Kmeans

scikit-learn

Aprendizaje No Supervisado

Clustering Jerárquico

scikit-learn

Aprendizaje No Supervisado

Clustering De Densidad Con Dbscan

scikit-learn

Aprendizaje No Supervisado

Preprocesamiento De Textos Para Nlp

scikit-learn

Nlp

Representación De Texto Y Extracción De Características

scikit-learn

Nlp

Clasificación De Texto Con Scikit Learn

scikit-learn

Nlp

Análisis De Sentimiento

scikit-learn

Nlp

Técnicas Avanzadas De Extracción De Características

scikit-learn

Nlp

Introducción Al Análisis De Series Temporales

scikit-learn

Series Temporales

Preprocesamiento De Datos De Series Temporales

scikit-learn

Series Temporales

Ingeniería De Características Para Series Temporales

scikit-learn

Series Temporales

Transformación Y Escalado De Series Temporales

scikit-learn

Series Temporales

Validación Y Evaluación De Modelos En Series Temporales

scikit-learn

Series Temporales

Validación Y Evaluación De Modelos

scikit-learn

Validación De Modelos

Técnicas De Validación Cruzada

scikit-learn

Validación De Modelos

Métricas De Regresión

scikit-learn

Validación De Modelos

Métricas De Clasificación

scikit-learn

Validación De Modelos

Ajuste De Hiperparámetros

scikit-learn

Validación De Modelos

Introducción A Pipelines

scikit-learn

Pipelines Y Despliegue

Creación De Pipelines Básicos

scikit-learn

Pipelines Y Despliegue

Preprocesamiento De Datos Con Pipelines

scikit-learn

Pipelines Y Despliegue

Pipelines Y Validación Cruzada

scikit-learn

Pipelines Y Despliegue

Pipelines Con Columntransformer

scikit-learn

Pipelines Y Despliegue

Exportar E Importar Pipelines

scikit-learn

Pipelines Y Despliegue

Accede GRATIS a ScikitLearn y certifícate

Objetivos de aprendizaje de esta lección

  • Comprender qué es el preprocesamiento de datos y por qué es esencial antes del modelado.
  • Diferenciar entre preprocesamiento y modelado en el flujo de trabajo del aprendizaje automático.
  • Aplicar técnicas habituales de preprocesamiento con pandas y scikit-learn.
  • Manejar valores faltantes, escalado de variables y codificación de variables categóricas.
  • Utilizar pipelines en scikit-learn para integrar preprocesamiento y modelado.