12 KiB
Construye un modelo de regresión usando Scikit-learn: prepara y visualiza los datos
Infografía por Dasani Madipalli
Examen previo a la lección
Esta lección se encuentra disponible en R!
Introducción
Ahora que has configurado las herramientas necesarias para iniciar el trabajo con la construcción de modelo de aprendizaje automático con Scikit-learn, estás listo para comenzar a realizar preguntas a tus datos. Mientras trabajas con los datos y aplicas soluciones de ML, es muy importante entender cómo realizar las preguntas correctas para desbloquear el potencial de tu conunto de datos.
En esta lección, aprenderás:
- Cómo preparar tus datos para la construcción de modelos.
- Cómo usar Matplotlib para visualización de datos.
🎥 Da clic en la imagen superior para ver un video de los aspectos clave de esta lección
Realizando la pregunta correcta a tus datos
La pregunta para la cual necesitas respuesta determinará qué tipo de algoritmos de ML requerirás. Y la calidad de la respuesta que obtendas será altamente dependiente de la naturaleza de tus datos.
Echa un vistazo a los datos provistos para esta lección. Puedes abrir este archivo .csv en VS Code. Un vistazo rápido muestra inmediatamente que existen campos en blanco y una mezcla de datos numéricos y de cadena. También hay una columna extraña llamada 'Package' donde los datos están mezclados entre los valores 'sacks', 'bins' y otros. Los datos de hecho, son un pequeño desastre.
De hecho, no es muy común obtener un conjunto de datos que esté totalmente listo para su uso en un modelo de ML. En esta lección, aprenderás cómo preparar un conjunto de datos en crudo usando librerías estándares de Python. También aprenderás varias técnicas para visualizar los datos.
Caso de estudio: 'El mercado de calabazas'
En este directorio encontrarás un archivo .cvs in la raíz del directorio data
llamado US-pumpkins.csv, el cual incluye 1757 líneas de datos acerca del mercado de calabazas, ordenados en agrupaciones por ciudad. Estos son loas datos extraídos de Reportes estándar de mercados terminales de cultivos especializados distribuido por el Departamento de Agricultura de los Estados Unidos.
Preparando los datos
Estos datos son de dominio público. Puede ser descargado en varios archivos por separado, por ciudad, desde el sitio web de USDA. para evitar demasiados archivos por separado, hemos concatenado todos los datos de ciudad en una hoja de cálculo, así ya hemos preparado los datos un poco. Lo siguiente es dar un vistazo más a fondo a los datos.
Los datos de las calabazas - conclusiones iniciales
¿Qué notas acerca de los datos? Ya has visto que hay una mezcla de cadenas, números, blancos y valores extraños a los cuales debes encontrarle sentido.
¿Qué preguntas puedes hacerle a los datos usando una técnica de regresión? Qué tal el "predecir el precio de la venta de calabaza durante un mes dado". Viendo nuevamente los datos, hay algunos cambios que necesitas hacer para crear las estructuras de datos necesarias para la tarea.
Ejercicio - Analiza los datos de la calabaza
Usemos Pandas, (el nombre es un acrónimo de Python Data Analysis
) a tool very useful for shaping data, to analyze and prepare this pumpkin data.
Primero, revisa las fechas faltantes
Necesitarás realizar algunos pasos para revisar las fechas faltantes:
- Convertir las fechas a formato de mes (las fechas están en formato de EE.UU., por lo que el formato es
MM/DD/YYYY
). - Extrae el mes en una nueva columna.
Abre el archivo notebook.ipynb en Visual Studio Code e importa la hoja de cálculo en un nuevo dataframe de Pandas.
-
Usa la función
head()
para visualizar las primeras cinco filas.import pandas as pd pumpkins = pd.read_csv('../data/US-pumpkins.csv') pumpkins.head()
✅ ¿Qué función usarías para ver las últimas cinco filas?
-
Revisa si existen datos faltantes en el dataframe actual:
pumpkins.isnull().sum()
Hay datos faltabtes, pero quizá no importen para la tarea en cuestión.
-
Para facilitar el trabajo con tu dataframe, elimina varias de sus columnas usando
drop()
, manteniendo sólo las columnas que necesitas:new_columns = ['Package', 'Month', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1)
Segundo, determina el precio promedio de la calabaza
Piensa en cómo determinar el precio promedio de la calabaza en un mes dado. ¿Qué columnas eligirás para esa tarea? Pista: necesitarás 3 columnas.
Solución: toma el promedio de las columnas Low Price
y High Price
para poblar la nueva columna Price
y convierte la columna Date
para mostrar únicamente el mes, Afortunadamente, de acuerdo a la revisión de arriba, no hay datos faltantes para las fechas o precios.
-
Para calcular el promedio, agrega el siguiente código:
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 month = pd.DatetimeIndex(pumpkins['Date']).month
✅ Siéntete libre de imprimir cualquier dato que desees verificar, usando
print(month)
. -
Ahora, copia tus datos convertidos en un nuevo dataframe de Pandas:
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
Imprimir tu dataframe te mostrará un conjunto de datos limpio y ordenado, en el cual puedes construir tu nuevo modelo de regresión.
¡Pero espera!, Hay algo raro aquí
Si observas la columna Package
, las calabazas se venden en distintas configuraciones. Algunas son vendidas en medidas de '1 1/9 bushel', y otras en '1/2 bushel', algunas por pieza, algunas por libra y otras en grandes cajas de ancho variable.
Las calabazas parecen muy difíciles de pesar consistentemente.
Indagando en los datos originales, es interesante que cualquiera con el valor Unit of Sale
igualado a 'EACH' o 'PER BIN' también tiene el tipo de Package
por pulgada, por cesto, o 'each'. Las calabazas parecen muy difíciles de pesar consistentemente, por lo que las filtraremos seleccionando solo aquellas calabazas con el string 'bushel' en su columna Package
.
-
Agrega un filtro al inicio del archivo, debajo de la importación inicial del .csv:
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
Si imprimes los datos ahora, puedes ver que solo estás obteniendo alrededor de 415 filas de datos que contienen calabazas por fanegas.
¡Pero espera! Aún hay algo más que hacer
¿Notaste que la cantidad de fanegas varían por fila? Necesitas normalizar el precio para así mostrar el precio por fanega, así que haz los cálculos para estandarizarlo.
-
Agrega estas líneas después del bloque para así crear el dataframe new_pumpkins:
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
✅ De acuerdo a The Spruce Eats, el peso de una fanega depende del tipo de producto, ya que es una medida de volumen. "Una fanega de tomates, por ejemplo, se supone pese 56 libras... Las hojas y verduras usan más espacio con menos peso, por lo que una fanega de espinaca es de sólo 20 libras." ¡Todo es tan complicado! No nos molestemos en realizar una conversión fanega-a-libra, y en su lugar hagámosla por precio de fanega. ¡Todo este estudio de las fanegas de calabazas nos mostrará cuán importante es comprender la naturaleza de tus datos!
Ahora, puedes analizar el precio por unidad basándote en su medida de fanega. Si imprimes los datos una vez más, verás que ya están estandarizados.
✅ ¿Notaste que las calabazas vendidas por media fanega son más caras? ¿Puedes descubrir la razón? Ayuda: Las calabazas pequeñas son mucho más caras que las grandes, probablemente porque hay muchas más de ellas por fanega, dado el espacio sin usar dejado por una calabaza grande.
Estrategias de visualización
parte del rol de un científico de datos es el demostrar la calidad y naturaleza de los dato con los que está trabajando. Para hacerlo, usualmente crean visualizaciones interesantes, o gráficos, grafos, y gráficas, mostrando distintos aspectos de los datos. De esta forma, son capaces de mostrar visualmente las relaciones y brechas de que otra forma son difíciles de descubrir.
Las visualizaciones también ayudan a determinar la técnica de aprendizaje automático más apropiada para los datos. Por ejemplo, un gráfico de dispersión que parece seguir una línea, indica que los datos son un buen candidato para un ejercicio de regresión lineal.
Una librería de visualización de datos que funciona bien en los notebooks de Jupyter es Matplotlib (la cual también viste en la lección anterior).
Obtén más experiencia con la visualización de datos en estos tutoriales.
Ejercicio - experimenta con Matplotlib
Intenta crear algunas gráficas básicas para mostrar el nuevo dataframe que acabas de crear. ¿Qué mostraría una gráfica de línea básica?
-
Importa Matplotlib al inicio del archivo, debajo de la importación de Pandas:
import matplotlib.pyplot as plt
-
Vuelve a correr todo el notebook para refrescarlo.
-
Al final del notebook, agrega una celda para graficar los datos como una caja:
price = new_pumpkins.Price month = new_pumpkins.Month plt.scatter(price, month) plt.show()
¿La gráfica es útil? ¿Hay algo acerca de ésta que te sorprenda?
No es particularmente útil ya que todo lo que hace es mostrar tus datos como puntos dispersos en un mes dado.
Hacerlo útil
Para obtener gráficas para mostrar datos útiles, necesitas agrupar los datos de alguna forma. Probemos creando un gráfico donde el eje y muestre los meses y los datos demuestren la distribución de los datos.
-
Agrega una celda para crear una gráfica de barras agrupadas:
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') plt.ylabel("Pumpkin Price")
¡Esta es una visualización de datos más útil! Parece indicar que el precio más alto para las calabazas ocurre en Septiembre y Octubre. ¿Cumple esto con tus expectativas? ¿por qué sí o por qué no?
🚀Desafío
Explora los distintos tipos de visualización que ofrece Matplotlib. ¿Qué tipos son los más apropiados para problemas de regresión?
Examen posterior a la lección
Revisión y autoestudio
Dale un vistazo a las distintas forma de visualizar los datos. Haz un lista de las distintas librerías disponibles y nota cuales son mejores para cierto tipo de tareas, por ejemplo visualizaciones 2D vs visualizaciones 3D. ¿Qué descubriste?