No solo lea sobre aprendizaje automático: ¡practíquelo!
Después de invertir mucho tiempo y dinero en cursos, libros y videos, he llegado a una conclusión: la forma más efectiva de aprender ciencia de datos es mediante haciendo proyectos de ciencia de datos. Leer, escuchar y tomar notas es valioso, pero no es hasta que resuelves un problema que los conceptos se solidifican a partir de abstracciones en herramientas con las que te sientes seguro.
En este artículo, presentaré otro recorrido de aprendizaje automático en Python y también te dejan con un desafío: intenta desarrollar una mejor solución (¡algunos consejos útiles están incluidos)! El completo Jupyter Notebook para este proyecto se puede ejecutar en Kaggle – no se requiere descarga – o se accedió en GitHub .
Declaración del problema
El Taxi de la ciudad de Nueva York El desafío de predicción de tarifas que actualmente se ejecuta en Kaggle, es una tarea de aprendizaje automático de regresión supervisada . Dadas las ubicaciones de recogida y entrega, la marca de tiempo de recolección y el conteo de pasajeros, el objetivo es predecir la tarifa del viaje en taxi. Al igual que la mayoría Kaggle competitions este problema no refleja al 100% a los de la industria, pero sí presenta un conjunto de datos real y una tarea en la que podemos perfeccionar nuestras habilidades de aprendizaje automático.
Para resolver este problema , seguiremos un plan de ataque estándar de ciencia de datos:
- Comprender el problema y los datos
- Exploración de datos / limpieza de datos
- Selección de características / ingeniería de características
- Evaluación y selección de modelos
- Optimización de modelos
- Interpretación de resultados y predicciones
Este esquema puede parecer una ruta lineal de principio a fin, pero la ciencia de datos es un proceso altamente no lineal donde los pasos se repiten o se completan fuera de orden. A medida que nos familiarizamos con los datos, a menudo queremos volver y revisar nuestras decisiones pasadas o adoptar un nuevo enfoque.
Si bien el cuaderno Jupyter final puede presentar una historia cohesiva, el proceso de desarrollo es muy desordenado, involucrando la reescritura de códigos y cambiar decisiones anteriores.
A lo largo del artículo, señalaré una serie de áreas en las que creo que un científico de datos emprendedor podría mejorar mi solución. He etiquetado estas mejoras potenciales porque como un campo en gran parte empírico, no hay garantías en el aprendizaje automático.
Obteniendo Comenzado
El conjunto de datos de la tarifa de taxi es relativamente grande con 55 millones de filas de entrenamiento, pero es simple de entender, con solo 6 características. El fare_amount es el objetivo, el valor continuo que entrenaremos para predecir un modelo:
A lo largo del cuaderno, utilicé solo una muestra de 5,000,000 filas para hacer los cálculos más rápido. Mi primera recomendación es:
- Mejora potencial 1: utilizar más datos para la formación del modelo
No está garantizado que cantidades mayores de datos ayuden, pero los estudios empíricos han encontrado que en general como cantidad de datos utilizados para el entrenamiento de un modelo aumenta, el rendimiento aumenta. Un modelo entrenado en más datos puede aprender mejor las señales reales, especialmente en un problema de grandes dimensiones con una gran cantidad de características (este no es un conjunto de datos de gran dimensión, por lo que podría haber rendimientos limitados para utilizar más datos).
Si bien el tamaño del conjunto de datos puede ser intimidante, los marcos como Dask le permiten manejar incluso conjuntos de datos masivos en una computadora portátil personal. Además, aprender cómo configurar y usar la computación en la nube, como Amazon ECS, es una habilidad vital una vez que los datos exceden la capacidad de su máquina.
Afortunadamente, no hace falta mucha investigación para comprender esta información: la mayoría Hemos tomado taxis antes y sabemos que los taxis cobran en función de las millas recorridas. Por lo tanto, para la ingeniería de características, querremos encontrar una manera de representar la distancia recorrida en función de la información que recibimos. También podemos leer cuadernos de otros científicos de datos o leer la discusión de la competencia para obtener ideas sobre cómo resolver el problema.
Exploración y limpieza de datos
Aunque los datos de Kaggle son generalmente más limpio que los datos del mundo real, este conjunto de datos todavía tiene algunos problemas, a saber, anomalías en varias de las características. Me gusta llevar a cabo la limpieza de datos como parte del proceso de exploración, corrigiendo anomalías o errores de datos a medida que los encuentro. Para este problema, podemos detectar valores atípicos mirando las estadísticas de los datos usando df.describe ().
Descripción estadística de los datos de entrenamiento
Las anomalías en la cuenta de pasajeros, las coordenadas y la cantidad de la tarifa se abordaron mediante una combinación de conocimiento del dominio y mirando la distribución de los datos. Por ejemplo, al leer sobre tarifas de taxi en Nueva York vemos que el monto mínimo de la tarifa es de $ 2.50, lo que significa que debemos excluir algunas de las atracciones basadas en la tarifa. Para las coordenadas, podemos ver la distribución y excluir los valores que están fuera de la norma. Una vez que hemos identificado valores atípicos, podemos eliminarlos usando un código como el siguiente:
# Eliminar valores atípicos de latitud y longitud data = data.loc [data['pickup_latitude'] .between (40, 42)] data = data.loc [data['pickup_longitude'] .between (-75, -72)] data = data.loc [data['dropoff_latitude'] .between (40, 42)] data = data.loc [data['dropoff_longitude'] .between (- 75, -72)]
Una vez que limpiamos los datos, podemos acceder a la parte divertida: visualización. A continuación se muestra un diagrama de los lugares de recogida y entrega en la parte superior de NYC coloreados por la tarifa binned (binning es una forma de convertir una variable continua en una discreta).
Recogidas y bajas trazadas en la ciudad de Nueva York
También quiero echar un vistazo a la variable objetivo. A continuación se muestra una representación de la variable de destino Función de distribución acumulada empírica (ECDF) la cantidad de la tarifa. El ECDF puede ser una mejor opción de visualización que un histograma para una variable porque no tiene artefactos de la agrupación.
ECDF de Target
Además de ser interesante de ver, las tramas nos pueden ayudar identificar anomalías, relaciones o ideas para nuevas características. En los mapas, el color representa la tarifa, y podemos ver que las tarifas que comienzan o terminan en el aeropuerto (abajo a la derecha) tienden a ser de las más caras. Volviendo al conocimiento del dominio, leemos que la tarifa estándar para los viajes al aeropuerto JFK es de $ 45, así que si pudiéramos encontrar una manera de identificar los viajes al aeropuerto, entonces sabríamos la tarifa con precisión.
Mientras yo no fui tan lejos en este cuaderno, el uso del conocimiento de dominio para la limpieza de datos y la ingeniería de características es extremadamente valioso. Mi segunda recomendación para mejorar es:
- Potential Improvement 2: Experimente con diferentes métodos para la eliminación de valores atípicos y la limpieza de datos.
Esto se puede hacer con conocimiento de dominio (como un mapa) o métodos estadísticos (como z- puntuaciones). Un enfoque interesante para este problema es en este cuaderno donde el autor eliminó las atracciones que comenzaron o terminaron en el agua.
La inclusión / exclusión de valores atípicos puede tener un efecto significativo en el rendimiento del modelo. Sin embargo, como la mayoría de los problemas en el aprendizaje automático, no hay un enfoque estándar (aquí hay un método estadístico en Python que puede probar).
Ingeniería de características
La ingeniería de funciones es el proceso de creación de nuevas características – predictor variables – fuera de un conjunto de datos existente. Debido a que un modelo de aprendizaje automático solo puede aprender de las funciones que se le proporcionan, este es el paso más importante de la línea de aprendizaje de máquinas .
Para conjuntos de datos con múltiples tablas y relaciones entre las tablas, lo haremos probablemente desee utilizar ingeniería de características automatizada pero debido a que este problema tiene un número relativamente pequeño de columnas y una sola tabla, podemos construir a mano algunas características de alto valor.
Por ejemplo, ya que sepa que el costo de un viaje en taxi es proporcional a la distancia, querremos utilizar los puntos de inicio y parada para tratar de encontrar la distancia recorrida. Una aproximación aproximada de distancia es el valor absoluto de la diferencia entre las latitudes y longitudes iniciales y finales.
# Diferencia absoluta en datos de latitud y longitud ['abs_lat_diff'] = (datos ['dropoff_latitude'] - datos ['pickup_latitude']) .abs ()
datos ['abs_lon_diff'] = (datos ['dropoff_longitude'] - datos ['pickup_longitude']). abs ()
¡Las funciones no tienen que ser complejas para ser útiles! A continuación se muestra una representación de estas nuevas características coloreadas por la tarifa agrupada.
Longitud absoluta frente a latitud absoluta
Lo que estas características nos dan es una medida relativa de distancia porque se calculan en términos de latitud y longitud y no una métrica real. Estas características son útiles para la comparación, pero si queremos una medición en kilómetros, podemos aplicar la fórmula Haversine entre el inicio y el final del viaje, que calcula la distancia del Gran Círculo. Esto sigue siendo una aproximación porque da distancia a lo largo de una línea dibujada en la superficie esférica de la Tierra (me dicen que la Tierra es una esfera) que conecta los dos puntos, y claramente, los taxis no viajan en línea recta. (Consulte el cuaderno para obtener más información).
Distancia considerable por tarifa (agrupada)
La otra fuente principal de funciones para este problema se basa en el tiempo. Dada una fecha y hora, existen numerosas variables nuevas que podemos extraer. Construir funciones de tiempo es una tarea común, y en el cuaderno he incluido una función útil que crea una docena de características de una sola marca de tiempo.
Cantidad de tarifas coloreada por la hora del día
Aunque construí casi 20 características en este proyecto, todavía hay más que se encuentran. La parte difícil de la ingeniería de características es que nunca se sabe cuándo se han agotado todas las opciones. Mi siguiente recomendación es:
- Potential Improvement 3: Construya más características o aplique la selección de características a las características existentes para encontrar un conjunto óptimo.
La ingeniería de funciones también involucra conocimientos sobre problemas o la aplicación de algoritmos que automáticamente crean características para usted . Después de crear funciones, a menudo tendrá que aplicar la selección de características para encontrar las más relevantes.
Una vez que tenga datos limpios y un conjunto de características, comenzará la prueba de modelos. Aunque la ingeniería de características viene antes de modelar en el esquema, a menudo vuelvo a este paso una y otra vez en el transcurso de un proyecto.
Evaluación y selección de modelos
Una buena primera opción de modelo para establecer una línea de base en una regresión tarea es una regresión lineal simple. Además, si miramos la correlación de Pearson de las características con la cantidad de tarifa para este problema, encontramos varias relaciones lineales muy fuertes, como se muestra a continuación.
Correlaciones de Pearson de las Características con el Objetivo
Basado en la fuerza del lineal relaciones entre algunas de las características y el objetivo, podemos esperar que un modelo lineal lo haga razonablemente bien.
Si bien los modelos de conjuntos y las redes neuronales profundas captan toda la atención, no hay razón para utilizar un modelo excesivamente complejo si un modelo simple e interpretable puede lograr casi el mismo rendimiento.
Sin embargo, todavía tiene sentido probar diferentes modelos, especialmente porque son fáciles de construir con Scikit-Learn.
El modelo inicial, una regresión lineal entrenada en solo tres características (las diferencias de ubicación de abs y la cuenta de pasajero) logró una validación error cuadrático medio (RMSE) de $ 5.32 y un error porcentual absoluto medio de 28.6%.
El beneficio de una regresión lineal simple es que podemos inspeccionar los coeficientes y encontrar, por ejemplo, que un aumento en un pasajero aumenta la tarifa en $ 0.02 según el modelo.
# Parámetros aprendidos de Regresión lineal
Intercepción 5.0819 abs_lat_diff coef: 113.6661 abs_lon_diff coef: 163.8758 passenger_count coef: 0.0204
Para las competencias de Kaggle, podemos evaluar un modelo usando un conjunto de validación – aquí utilicé 1,000,000 de ejemplos – y enviando predicciones de prueba a la competencia .
Esto nos permite comparar nuestro modelo con otros científicos de datos: la regresión lineal sitúa alrededor de 600/800.
Idealmente, queremos utilizar el conjunto de pruebas solo una vez para obtener una estimación de qué tan bien nuestro modelo funcionará con los nuevos datos y realizar cualquier optimización utilizando un conjunto de validación (o validación cruzada).
El problema con Kaggle es que la tabla de clasificación puede alentar a los competidores a construir modelos complejos sobre-optimizados para los datos de prueba.
También queremos comparar nuestro modelo con una línea base ingenua que no utiliza aprendizaje automático, que en el caso de la regresión puede adivinar el valor medio del objetivo en el conjunto de entrenamiento. Esto da como resultado un RMSE de $ 9.35 que nos da confianza. El aprendizaje automático es aplicable al problema.
Incluso entrenar la regresión lineal en características adicionales no resulta en una gran puntuación de la tabla de clasificación y el siguiente paso es probar un modelo más complejo. Mi siguiente elección suele ser el bosque aleatorio, que es donde me volví en este problema.
El bosque aleatorio es un modelo más flexible que la regresión lineal, lo que significa que tiene un sesgo reducido: puede ajustarse mejor a los datos de entrenamiento. El bosque aleatorio también generalmente tiene baja varianza, lo que significa que puede generalizarse a nuevos datos. Para este problema, el bosque aleatorio supera la regresión lineal, logrando un RMSE de validación de $ 4.20 en el mismo conjunto de características.
Distribuciones de predicción del conjunto de prueba
La razón por la cual un bosque aleatorio generalmente supera una regresión lineal es porque tiene más flexibilidad, menor sesgo, y tiene una varianza reducida porque combina las predicciones de muchos árboles de decisión. Una regresión lineal es un método simple y, como tal, tiene un alto sesgo: supone que los datos son lineales. Una regresión lineal también puede ser altamente influenciada por valores atípicos porque resuelve el ajuste con la suma más baja de errores al cuadrado.
La elección del modelo (e hiperparámetros) representa la compensación sesgo-varianza en aprendizaje automático: un modelo con alto sesgo no puede aprender incluso los datos de entrenamiento con precisión, mientras que un modelo con alta varianza esencialmente memoriza los datos de entrenamiento y no se puede generalizar a nuevos ejemplos. Debido a que el objetivo del aprendizaje automático es generalizar a nuevos datos, queremos un modelo con baja polarización y baja varianza.
El mejor modelo de un problema no será necesariamente el mejor modelo en todos los problemas, por lo que es importante investigar varios modelos que abarcan el rango de complejidad. Todos los modelos se deben evaluar utilizando los datos de validación y luego se puede optimizar el modelo de mejor rendimiento en el ajuste del modelo. Seleccioné el bosque aleatorio debido a los resultados de la validación, y le animo a probar algunos otros modelos (o incluso combinar modelos en un conjunto ).
Optimización del modelo
En una problema de aprendizaje de máquina, tenemos algunos enfoques para mejorar el rendimiento:
- Obtenga más datos
- Construya más características / realice selección de características
- Optimice el modelo seleccionado
- Pruebe un modelo más complejo
Todavía hay ganancias estar hecho de 1. y 2. (eso es parte del desafío), pero también quería proporcionar un marco para optimizar el modelo seleccionado.
La optimización del modelo es el proceso de encontrar los mejores hiperparámetros para un modelo en un determinado conjunto de datos. Debido a que los mejores valores de los hiperparámetros dependen de los datos, esto tiene que hacerse nuevamente para cada nuevo problema.
Me gusta pensar en la optimización del modelo, también llamada ajuste del modelo, como encontrar la configuración ideal de un modelo de aprendizaje automático.
Hay una serie de métodos para la optimización, que van desde el ajuste manual al ajuste automático de hiperpares pero en la práctica, la búsqueda aleatoria funciona bien y es fácil de implementar. En el cuaderno, proporciono el código para ejecutar la búsqueda aleatoria para la optimización del modelo. Para hacer los tiempos de cálculo razonables, volví a muestrear los datos y solo ejecuté 50 iteraciones. Incluso esto lleva mucho tiempo porque los hiperparámetros se evalúan utilizando una validación cruzada de 3 veces. Esto significa que en cada iteración, el modelo se entrena con una combinación seleccionada de hiperparámetros 3 veces.
Los mejores parámetros fueron
{'n_estimators': 41,'min_samples_split': 2,'max_leaf_nodes': 49,'max_features': 0.5,'max_depth': 22,'bootstrap': True}
con una mae negativa de -2.0216735083205952
También probé una serie de características diferentes y encontré que el mejor modelo solo usaba 12 de las 27 características. Esto tiene sentido porque muchas de las características están altamente correlacionadas y por lo tanto no son necesarias.
Mapa de calor de la correlación del subconjunto de características
Después de ejecutar la búsqueda aleatoria y elegir las características, el modelo de bosque aleatorio final alcanzó un RMSE de 3,38 que representa un porcentaje de error de 19.0%. Esto es una reducción del 66% en el error de la línea base ingenua, y una reducción del 30% en el error del primer modelo lineal. Este rendimiento ilustra un punto crítico en el aprendizaje automático:
Los rendimientos de la ingeniería de características son mucho mayores que los de la optimización del modelo. Por lo tanto, es crucial asegurarse de tener un buen conjunto de características antes de comenzar a preocuparse por tener los mejores hiperparámetros.
Aunque ejecuté 50 iteraciones de búsqueda aleatoria, los valores de hiperparámetro probablemente no se hayan optimizado del todo. Mi siguiente recomendación es:
- Potential Improvement 4: ejecutar la sintonización del modelo para más iteraciones en más datos.
Los rendimientos de esto probablemente serán menores que los de la ingeniería de características, pero es posible que todavía haya ganancias de rendimiento. Si te sientes a la altura de la tarea, también puedes probar el ajuste automatizado de modelos usando una herramienta como Hyperopt.
Interpretar modelo y hacer Predicciones
Si bien el bosque aleatorio es más complejo que la regresión lineal, no es una caja negra completa. Un bosque al azar se compone de un conjunto de árboles de decisión que, por sí mismos, son modelos de diagrama de flujo muy intuitivos. Incluso podemos inspeccionar árboles individuales en el bosque para tener una idea de cómo toman decisiones. Otro método para mirar dentro de la caja negra del bosque aleatorio es mediante el examen de las características importantes. Los detalles técnicos no son tan importantes en este momento, pero podemos usar los valores relativos para determinar qué características se consideran relevantes para el modelo.
Importancias de la característica del entrenamiento en todas las características
La característica más importante por el momento es la distancia euclidiana del viaje en taxi, seguida de la pickup_Elapsed, una de las variables de tiempo. Dado que hicimos ambas funciones, ¡debemos estar seguros de que nuestra ingeniería de funciones fue de gran utilidad! También podríamos incluir importancias para la ingeniería o selección de características, ya que no necesitamos mantener todas las variables.
Finalmente, podemos echar un vistazo a las predicciones del modelo tanto en los datos de validación como en los datos de prueba. Debido a que tenemos las respuestas de validación, podemos calcular el error de las predicciones, y podemos examinar las predicciones de prueba para valores extremos (hubo varios en la regresión lineal). A continuación se muestra un gráfico de las predicciones de validación para el modelo final.
Predicciones de validación de bosques aleatorios y valores verdaderos.
La interpretación de modelos sigue siendo un campo relativamente nuevo, pero hay algunos métodos prometedores para examinar un modelo. Si bien el objetivo principal del aprendizaje automático es hacer predicciones precisas sobre nuevos datos, también es igualmente importante saber por qué el modelo es preciso y si puede enseñarnos algo sobre el problema.
Próximos pasos
Aunque probamos varias técnicas diferentes e implementamos una solución completa, todavía hay pasos por tomar que pueden mejorar el modelo.
Mi próximo enfoque sería probar un modelo aún más complejo, como una red neuronal profunda o una máquina de aumento de gradiente. No los he implementado en el cuaderno, pero estoy trabajando en ellos.
Te dejaré probar primero (no puedo dar todas las respuestas!).
- Potential Improvement 5: prueba con modelos más complejos como
- gradient boosting machine
Con una máquina de aprendizaje proyecto, siempre hay más enfoques para probar, ¡e incluso puede llegar a su propio método si no está satisfecho con las opciones existentes! El aprendizaje automático es un campo en gran parte empírico, sin reglas estandarizadas, y la única forma de saber si algo funciona es ponerlo a prueba.
En este punto, te dejaré en tus propios dispositivos para mejorar el modelo. Te di cinco recomendaciones diferentes que te permitirán superar el mejor puntaje de validación cruzada que obtuve en el cuaderno.
Resultados del modelo final
Este es sin duda un desafío amistoso, así que no te frustres, y no te pongas nervioso. ‘dude en comunicarse si necesita ayuda. Todas estas recomendaciones son posibles mejoras porque no puedo garantizar que mejoren el puntaje. Sin embargo, sí sé que es posible construir un mejor modelo, ¡y trabajaré por mi cuenta para tratar de construirlo!
Conclusiones
En este artículo y en el Jupyter Notebook presenté un recorrido completo de aprendizaje automático en un conjunto de datos realista. Implementamos la solución en código Python, y tocamos muchos conceptos clave en el aprendizaje automático. El aprendizaje automático no es un arte mágico, sino más bien un arte que se puede perfeccionar mediante la repetición . No hay nada que impida que alguien aprenda a resolver problemas del mundo real utilizando el aprendizaje automático, y el método más efectivo para convertirse en adepto es trabajar en proyectos.
En el espíritu de aprender haciendo, mi desafío para ti es mejorar sobre mi mejor modelo en el cuaderno y te dejo unas recomendaciones que creo que mejorarán el rendimiento. ¡No hay una respuesta correcta en ciencia de datos, y espero ver lo que todos pueden encontrar! Si acepta el desafío, deje un enlace a su cuaderno en los comentarios. Esperemos que este artículo y el cuaderno le hayan dado el inicio necesario para salir y resolver este problema u otros. Y, cuando necesites ayuda, no dudes en preguntar porque la comunidad de ciencia de datos es siempre solidaria.