
* Granja : (de la agricultura inglesa): una repetición larga y aburrida de ciertas acciones del juego para un propósito específico (ganar experiencia, obtener recursos, etc.).
Introduccion
Recientemente (1 de octubre), se lanzó una nueva sesión del excelente curso DS / ML (recomiendo encarecidamente a cualquiera que quiera, como ahora se le llama, "ingresar" DS como curso inicial). Y, como de costumbre, después de completar cualquier curso, los graduados tienen una pregunta: dónde obtener experiencia práctica ahora para consolidar el conocimiento teórico aún crudo. Si haces esta pregunta en cualquier foro de perfil, entonces la respuesta probablemente sea una: ve a resolver Kaggle. Kaggle es sí, pero ¿por dónde empezar y cómo usar esta plataforma de manera más efectiva para habilidades prácticas? En este artículo, el autor intentará dar respuestas a estas preguntas sobre su propia experiencia, así como describir la ubicación del rastrillo principal en el campo del DS competitivo, para acelerar el proceso de bombeo y obtener un ventilador de él.
Algunas palabras sobre el curso de sus creadores:
El curso mlcourse.ai es una de las actividades a gran escala de la comunidad OpenDataScience. @yorko y la compañía (~ 60 personas) demuestran que se pueden obtener habilidades geniales fuera de la universidad, e incluso de forma totalmente gratuita. La idea principal del curso es la combinación óptima de teoría y práctica. Por un lado, la presentación de los conceptos básicos no ocurre sin las matemáticas, por otro lado: una gran cantidad de tareas, concursos y proyectos de Kaggle Inclass proporcionarán, con una cierta inversión de esfuerzo de su parte, excelentes habilidades de aprendizaje automático. Es imposible no notar la naturaleza competitiva del curso: se está llevando a cabo una calificación general de los estudiantes, lo que motiva mucho. El curso también es diferente en que se lleva a cabo en una comunidad verdaderamente vibrante.
El curso incluye dos competiciones de Kaggle Inclass. Ambos son muy interesantes, funcionan bien en la construcción de letreros. El primero es la identificación del usuario por la secuencia de sitios visitados . El segundo es la predicción de la popularidad de un artículo sobre el Medio . El principal beneficio es de dos tareas, donde debes ser inteligente y superar las líneas de base en estas competiciones.
Después de rendir homenaje al curso y a sus creadores, continuamos nuestra historia ...
Me recuerdo a mí mismo hace un año y medio, se completó un curso (aún la primera versión) de Andrew Ng, se completó la especialización del Instituto de Física y Tecnología de Moscú , se leyó una montaña de libros, teóricamente llena, pero cuando intentas resolver cualquier tarea básica de combate, surge un estupor. No, cómo resolver el problema, está claro qué algoritmos aplicar, también es comprensible, pero el código es muy difícil de escribir, con la ayuda de sklearn / pandas accediendo cada minuto, etc. Por qué es así: no hay tuberías acumuladas y la sensación del código "a su alcance".
Esto no funcionará, pensó el autor, y fue a Kaggle. Fue aterrador comenzar de inmediato en una competencia de combate, y la Casa de la Competencia " Precios de la casa: Técnicas de regresión avanzadas " se convirtió en el primer signo, que formó el enfoque para el bombeo efectivo descrito en este artículo.
En lo que se describirá más adelante, no existe un know-how, todas las técnicas, métodos y técnicas son obvias y predecibles, pero esto no resta valor a su efectividad. Al menos, siguiéndolos, el autor logró tomar el dado Kaggle Competition Master durante seis meses y tres competencias en modo individual y, al momento de escribir este artículo, ingresó en el top 200 de la clasificación mundial de Kaggle . Por cierto, esto responde a la pregunta de por qué el autor incluso se permitió el coraje de escribir un artículo de este tipo.
En pocas palabras, ¿qué es Kaggle?

Kaggle es una de las plataformas más conocidas para la realización de concursos en Data Science. En cada competencia, los organizadores cargan una descripción del problema, datos para resolver este problema, una métrica mediante la cual se evaluará la solución, y establecen plazos y premios. Los participantes reciben de 3 a 5 intentos (por voluntad de los organizadores) por día para "enviar" (enviando su propia solución).
Los datos se dividen en una muestra de entrenamiento (entrenamiento) y prueba (prueba). Para la parte de entrenamiento, se conoce el valor de la variable objetivo (objetivo), para la parte de prueba - no. La tarea de los participantes es crear un modelo que, siendo entrenado en la parte de entrenamiento de los datos, produzca el resultado máximo en la prueba.
Cada participante hace predicciones para la muestra de prueba y envía el resultado a Kaggle, luego el robot (que conoce la variable objetivo para la prueba) evalúa el resultado enviado, que se muestra en la tabla de clasificación.
Pero no todo es tan simple: los datos de prueba, a su vez, se dividen en cierta proporción en la parte pública (pública) y privada (privada). Durante la competencia, la decisión enviada se evalúa, de acuerdo con la métrica establecida por los organizadores, en la parte pública de los datos y se presenta en la tabla de clasificación (la llamada tabla de clasificación pública), por la cual los participantes pueden evaluar la calidad de sus modelos. La decisión final (generalmente dos, a elección del participante) se evalúa en la parte privada de los datos de la prueba, y el resultado recae en la tabla de clasificación privada, que está disponible solo después del final de la competencia y por el cual, de hecho, se evalúan los resultados finales, se distribuyen premios, bollos y medallas.
Por lo tanto, durante la competencia, solo la información está disponible para los participantes a medida que su modelo se comportó (qué resultado - o mostró velocidad) en la parte pública de los datos de prueba. Si, en el caso de un caballo esférico en el vacío, la parte privada de los datos coincide en distribución y estadísticas con el público (todo está bien, pero si no), entonces un modelo que ha funcionado bien en público puede no funcionar en la parte privada, es decir, overfix (reentrenar). Y aquí surge lo que se llama "vuelo" en la jerga, cuando las personas del décimo lugar en un público vuelan 1000-2000 lugares en una parte privada debido al hecho de que el modelo que han elegido se ha vuelto a entrenar y no puede dar la precisión necesaria para nuevos datos

¿Cómo evitar esto? Para esto, en primer lugar, es necesario construir el esquema de validación correcto, algo que se enseña en las primeras lecciones en casi todos los cursos de DS. Porque Si su modelo no puede dar el pronóstico correcto sobre los datos que nunca ha visto, entonces no importa qué técnica sofisticada use, no importa cuán complejas sean las redes neuronales que construya, dicho modelo no se puede producir en producción, porque Sus resultados no valen nada.
Para cada competencia en Kaggle, se crea una página separada en la que hay una sección con datos, con una descripción de la métrica, y lo más interesante para nosotros, un foro y núcleos.
Foro él y el foro Kaggle, la gente escribe, discute y comparte ideas. Pero los granos ya son más interesantes. De hecho, esta es la capacidad de ejecutar su propio código que tiene acceso directo a los datos de la competencia en la nube de Kaggle (análogo de Amazon AWS, Google GCE, etc.) Se asignan recursos limitados para cada núcleo, por lo que si no hay muchos datos, trabaje con con ellos puede directamente desde el navegador en el sitio web de Kaggle: escribir código, ejecutarlo para su ejecución, enviar el resultado. Hace dos años, Kaggle fue adquirida por Google, por lo que no es sorprendente que esta funcionalidad utilice Google Cloud Engine "bajo el capó".
Además, hubo varios concursos (recientes - Mercari ), donde se podía trabajar con datos en general solo a través de núcleos. Un formato muy interesante, que nivela la diferencia de hardware entre los participantes y obliga al cerebro a encenderse para optimizar el código y los enfoques, ya que, naturalmente, los núcleos tenían un límite estricto de recursos, en ese momento: 4 núcleos / 16 GB de RAM / 60 minutos de tiempo de ejecución / 1 GB de scratch y salida de espacio en disco. Mientras trabajaba en esta competencia, el autor aprendió más sobre la optimización de la red neuronal que de cualquier curso teórico. Un poco no fue suficiente para el oro, terminó solo el 23, pero recibió experiencia y placer más o menos ...
Aprovechando esta oportunidad, quiero agradecer nuevamente a mis colegas de ods.ai : Arthur Stepanenko (arthur) , Konstantin Lopukhin (kostia) , Sergey Fironov (sergeif) por sus consejos y apoyo en esta competencia. En general, hubo muchos puntos interesantes, Konstantin Lopukhin (kostia) , quien ocupó el primer lugar con Paweł Jankiewicz , luego presentó lo que se llamó " humillación de referencia de 75 líneas " en la sala de chat, un núcleo en 75 líneas de código que da el resultado a la zona dorada de la tabla de clasificación. Esto, por supuesto, debe ser visto :)
Bien, distraído, y así, la gente escribe el código y diseña los núcleos con soluciones, ideas interesantes y más. Por lo general, en cada competencia, después de un par de semanas, aparece uno o dos excelentes EDA de kernel (análisis exploratorio de datos), con una descripción detallada del conjunto de datos, estadísticas, características, etc. Y un par de líneas de base (soluciones básicas) que, por supuesto, no muestran el mejor resultado en la tabla de clasificación, pero pueden usarse como punto de partida para crear su propia solución.
¿Por qué kaggle?

De hecho, no importa en qué plataforma juegues, solo Kaggle es uno de los primeros y más promocionados, con una excelente comunidad y un entorno bastante cómodo (espero que refinen los núcleos para la estabilidad y el rendimiento, de lo contrario, muchos recuerdan el infierno que estaba sucediendo en Mercari ) Pero, en general, la plataforma es muy conveniente y autosuficiente, y sus dados aún son apreciados.
Una pequeña digresión en general sobre el tema de la DS competitiva. Muy a menudo, en artículos, conversaciones y otras comunicaciones, el pensamiento parece que todo esto es una mierda, la experiencia en las competiciones no tiene nada que ver con tareas reales, y las personas allí se dedican a ajustar el quinto decimal, que es una locura y divorciada de realidad Veamos este problema con un poco más de detalle:
Como especialistas en DS, a diferencia de la academia y la ciencia, nosotros, en nuestro trabajo, debemos y resolveremos los problemas comerciales. Es decir (aquí hay una referencia a CRISP-DM ) para resolver la tarea que es necesaria:
- entender el desafío empresarial
- evaluar los datos sobre el tema si la respuesta a esta tarea empresarial puede estar oculta en ellos
- recopilar datos adicionales si los existentes no son suficientes para obtener una respuesta
- elija la métrica que más se aproxime al objetivo comercial
- y solo después de eso, seleccione el modelo, convierta los datos al modelo seleccionado y "drene hgbusta". (C)
Los primeros cuatro puntos de esta lista no se enseñan en ninguna parte (corríjame, si tales cursos han aparecido, me inscribiré sin dudarlo), aquí solo podemos aprender de la experiencia de colegas que trabajan en esta industria. Y aquí está el último punto: a partir de la elección del modelo y más allá, es posible y necesario bombear en las competiciones.
En cualquier competencia, la mayoría del trabajo para nosotros fue realizado por los organizadores. Tenemos el objetivo comercial descrito, se seleccionó la métrica aproximada, se recopilaron los datos y nuestra tarea es construir una tubería de trabajo a partir de todo este lego. Y aquí se aumentan las habilidades: cómo trabajar con pases, cómo preparar datos para redes neuronales y árboles (y por qué las redes neuronales requieren un enfoque especial), cómo construir correctamente la validación, cómo no volver a entrenar, cómo elegir hiperparámetros, cómo ....... una docena o dos de "cómo", cuyo desempeño competente distingue a un buen especialista de las personas que pasan por nuestra profesión.
Lo que puedes "cultivar" en Kaggle

Básicamente, y esto es razonable, todos los recién llegados vienen a Kaggle para obtener y aumentar su experiencia práctica, pero no olviden que además de esto hay al menos dos objetivos más:
- Medallas y dados de granja
- Reputación agrícola en la comunidad de Kaggle
Lo más importante para recordar es que estos tres objetivos son completamente diferentes, se requieren diferentes enfoques para lograrlos, ¡y no debes mezclarlos, especialmente en la etapa inicial!
No es por nada que se enfatiza "en la etapa inicial" cuando está bombeando: estos tres objetivos se fusionarán en uno y se resolverán en paralelo, pero mientras recién comienza, ¡no los mezcle ! De esta forma evitarás el dolor, la decepción y el resentimiento en este mundo injusto.
Veamos brevemente los objetivos de abajo hacia arriba:
- Reputación : impulsado escribiendo buenas publicaciones (y comentarios) en el foro y creando núcleos útiles. Por ejemplo, núcleos EDA (ver arriba), publicaciones que describen técnicas no estándar, etc.
- Las medallas son un tema muy controvertido y de odio, pero bueno. Se impulsa combinando los núcleos públicos (*), la participación en un equipo con un sesgo en la experiencia y la creación de su propia tubería superior.
- Experiencia : bombeada a través del análisis de decisiones y el trabajo sobre errores.
(*) la combinación de núcleos públicos es una técnica de medalla de granja en la que se seleccionan los núcleos establecidos con la máxima velocidad en una tabla de clasificación pública, se promedian (combinan) sus predicciones y se presenta el resultado. Por lo general, este método conduce a un sobreajuste duro (reentrenamiento para entrenar) y a volar en privet, pero a veces le permite obtener una presentación casi en plata. El autor, en la etapa inicial, no recomienda un enfoque similar (lea a continuación sobre el cinturón y los pantalones).
Recomiendo el primer objetivo para elegir "experiencia" y mantenerlo hasta el momento en que sienta que está listo para trabajar en dos / tres objetivos al mismo tiempo.
Hay dos puntos más que vale la pena mencionar (Vladimir Iglovikov (ternaus) - gracias por el recordatorio).
El primero es la conversión de los esfuerzos invertidos en Kaggle en un lugar de trabajo nuevo, más interesante y / o mejor remunerado. No importa cómo se nivelen los dados de Kaggle ahora, para comprender a las personas, la línea en el resumen del Maestro de Competencia de Kaggle y otros logros todavía valen algo.
Para ilustrar este punto, podemos citar dos entrevistas ( una , dos ) con nuestros colegas Sergey Mushinsky (cepera_ang) y Alexander Buslaev (albu)
Y también la opinión de Valery Babushkin ( venheads) :
Valery Babushkin - Jefe de Ciencia de Datos en X5 Retail Group (el número actual de personal es de 30 personas + 20 vacantes desde 2019)
Jefe del grupo de análisis Yandex Advisor
Kaggle Competition Master es una excelente métrica de proxy para evaluar a un futuro miembro del equipo. Por supuesto, en relación con los últimos eventos en forma de equipos de 30 personas y locomotoras no disfrazadas, se requiere un estudio un poco más exhaustivo del perfil que antes, pero esto todavía es cuestión de varios minutos. Una persona que ha alcanzado el título de maestro, con un alto grado de probabilidad, sabe cómo escribir código de al menos una calidad promedio, es bastante versado en aprendizaje automático, sabe cómo limpiar datos y construir soluciones estables. Si aún no puede jactarse de la lengua de un maestro, el hecho de participar también es una ventaja, al menos el candidato sabe acerca de la existencia de Kagl y no era demasiado vago y pasó tiempo dominándolo. Y si se lanzó algo más que un núcleo público y la solución resultante excedió sus resultados (lo cual es bastante fácil de verificar), entonces esta es una ocasión para una discusión detallada sobre los detalles técnicos, que es mucho mejor y más interesante que las preguntas de teoría clásica, las respuestas a las que dan menos comprensión de cómo una persona hará el trabajo en el futuro. De lo único que debería temer y con lo que me encontré es que algunas personas piensan que el trabajo de DS es algo así como Kagl, que es fundamentalmente incorrecto. Muchos más piensan que DS = ML, que también es un error
El segundo punto es que la solución a muchos problemas puede enmarcarse en forma de preimpresos o artículos, lo que, por un lado, permite que la mente colectiva que dio a luz durante la competencia no muera en la naturaleza del foro, pero por otro lado agrega una línea más a la cartera de autores. y +1 a la visibilidad, que en cualquier caso tiene un efecto positivo tanto en el índice de carrera como en el índice de citas.
Por ejemplo, la lista de trabajos de nuestros colegas siguiendo los resultados de varios concursos.Autores (en orden alfabético):
Andrei O., Ilya, albu, aleksart, alex.radionov, almln, alxndrkalinin, cepera_ang, dautovri, davydov, fartuk, golovanov, ikibardin, kes, mpavlov, mvakhrushev, n01z3, rakhlin, rauf, resolut, scut, scut snikolenko, ternaus, twoleggedeye, versus, vicident, zfturbo
Cómo evitar el dolor de perder una medalla

Para anotar!
Te lo explicaré. En casi todas las competiciones, más cerca de su final, se presenta un núcleo al público con una solución que eleva la tabla de clasificación completa, pero para usted, con su decisión, baja en consecuencia. ¡Y cada vez que comienza el foro DOLOR! ¿Cómo es que tomé una decisión sobre la plata y ahora ni siquiera uso el bronce? ¿Qué pasa? Devuélvelo.
Recuerde: Kaggle es un DS competitivo. El lugar en la tabla de clasificación en el que se encuentre depende de usted. No del tipo que diseñó el núcleo, no de si las estrellas se unieron o no, sino solo de cuánto esfuerzo pusiste en la solución y si usaste todas las formas posibles para mejorarla.
Si el núcleo público lo saca de su lugar en la tabla de clasificación, este no es su lugar.
En lugar de derramar dolor por la injusticia del mundo, gracias a este tipo. En serio, un núcleo público con una solución mejor que la tuya significa que te perdiste algo en tus tuberías. Encuentra qué exactamente, mejora tu canalización y recorre toda la multitud de hámsters con la misma velocidad. Recuerde, para regresar a su lugar solo necesita ser un poco mejor que este público.
, , — … . , , — — .
, . — . ( Talking Data , 8- ) , (ppleskov) : " , , — ". , .
— :
" "()
, .

— python 3.6 jupyter notebook ubuntu . Python - DS, , jupyter , jupyter_contrib_nbextensions , , ubuntu — , bash :)
jupyter_contrib_nbextensions :
- Collapsible headings ( )
- Code folding ( )
- Split cells (, - )
.
- , . — . — .
, jupyter notebook , , . ( , , ( (ternaus) )
, jupyter - IDE, pycharm .
, , " ". , .
/OOF (.) .
(*) OOF — out of folds , -. . .
Como? :
- , , , ..
- , , ( , , ..)
- Se utiliza un sistema de control de versiones afilado específicamente para DS / ML. Por ejemplo https://dvc.org .
En general, en la comunidad hay una tendencia a cambiar gradualmente a la tercera opción, porque y el primero y el segundo tienen sus inconvenientes, pero son simples, confiables y, francamente, para Kaggle son suficientes.

Sí, más sobre python para aquellos que no son programadores, no le tengan miedo. Su tarea es comprender la estructura básica del código y la esencia básica del lenguaje para comprender los núcleos de otras personas y escribir sus bibliotecas. Hay muchos cursos buenos para principiantes en la Web, tal vez en los comentarios te dirán exactamente dónde. Lamentablemente (o afortunadamente) no puedo evaluar la calidad de dichos cursos, por lo que no proporciono enlaces en el artículo.
Entonces, pasemos al marco.

Nota
Toda la descripción adicional se basará en el trabajo con datos tabulares y de texto. Las imágenes, que ahora están muy en Kaggle, son un tema separado con marcos separados. En un nivel básico, es bueno poder procesarlos, aunque solo sea para manejar algo como ResNet / VGG y extraer características, pero un trabajo más profundo y sutil con ellos es un tema separado y muy extenso que no se considera en el marco de este artículo.
El autor admite honestamente que no es muy bueno en las imágenes. El único intento de involucrarse en lo bello fue en la competencia de Identificación de la cámara , en la que, por cierto, nuestros equipos con la etiqueta [ ods.ai ] volaron toda la tabla de clasificación hasta el punto de que los administradores de Kaggle tuvieron que visitarnos para asegurarse de que todo estuviera dentro reglas - y tranquilizar a la comunidad. Entonces, en esta competencia obtuve plata honoraria con el puesto 46, y cuando leí la descripción de las mejores soluciones de nuestros colegas, me di cuenta de que no podía subir más, realmente usan magia negra con aumento, bondad de 300 GB de datos, sacrificios, etc.
En general, si desea comenzar con imágenes, necesita otros marcos y otras guías.
Objetivo principal
Su tarea es escribir tuberías (diseñadas como cuadernos jupyter + módulos) para las siguientes tareas:
- EDA (análisis exploratorio de datos) . Aquí tenemos que hacer un comentario: hay personas especialmente capacitadas en Kaggle :) que vieron impresionantes núcleos de EDA en cada competencia. Difícilmente tendrá éxito en superarlos, pero aún debe comprender cómo puede ver los datos, porque En misiones de combate, esta persona especialmente entrenada serás tú. Por lo tanto, estudiamos enfoques, ampliamos nuestras bibliotecas.
- Limpieza de datos : todo sobre la limpieza de datos. Emisiones, omisiones, etc.
- Preparación de datos : todo lo relacionado con la preparación de datos para el modelo. Unas pocas cuadras:
- Modelos
- Modelos lineales
- Modelos de árboles
- Redes neuronales
- Exótico (FM / FFM)
- Selección de funciones
- Búsqueda de hiperparámetros
- Conjunto
En los núcleos, generalmente todas estas tareas se recopilan en un solo código, lo cual es comprensible, pero recomiendo encarecidamente que para cada una de estas subtareas se cree una computadora portátil y un módulo separados (un conjunto de módulos). Entonces será más fácil para ti más tarde.
Advierta el posible holivar: la estructura de este marco no es la verdad definitiva, hay muchas otras formas de estructurar sus tuberías, esta es solo una de ellas.
Los datos se transmiten entre los módulos en forma de CSV, o feather / pickle / hdf , que es más conveniente para usted y para lo que está acostumbrado o para el alma.
En realidad, mucho depende de la cantidad de datos, en TalkingData, por ejemplo, tuve que pasar por memmap para evitar la falta de memoria al crear un conjunto de datos para lgb.
En otros casos, los datos principales se almacenan en hdf / feather, algo pequeño (como un conjunto de atributos seleccionados) está en CSV . Repito: no hay plantillas, quién está acostumbrado a qué, funciona con eso.
Etapa inicial

Asistimos a cualquier competencia de Primeros pasos (como ya se mencionó, el autor comenzó con Precios de la vivienda: Técnicas de regresión avanzadas ) y comenzamos a crear nuestras computadoras portátiles. Leemos núcleos públicos, copiamos fragmentos de código, procedimientos, enfoques, etc. etc. Ejecutamos los datos a través de la canalización, los enviamos: observamos el resultado, mejoramos y así sucesivamente en un círculo.
La tarea en esta etapa es recopilar una tubería de ciclo completo que funcione eficientemente, desde la carga y la limpieza de datos hasta el envío final.
Una lista de muestra de lo que debería estar listo y funcionando al 100% antes de pasar al siguiente paso:
- EDA (estadísticas sobre dataset, boxplots, rango de categorías, ...)
- Limpieza de datos. (pasa a través de fillna, categorías de limpieza, categorías combinadas)
- Preparación de datos
- General (categorías de procesamiento - etiqueta / ohe / frecuencia, proyección de números en categorías, transformación de números, binning)
- Para regresiones (varias escalas)
- Modelos
- Modelos lineales (varias regresiones - cresta / logística)
- Modelos de árboles (lgb)
- Selección de funciones
- cuadrícula / búsqueda aleatoria
- Conjunto
Ir a la batalla

Elige cualquier competencia que te guste y ... comienza :)
Si bien no existe un esquema de validación que funcione, ¡no hay pasos adicionales!
- Ejecute los datos a través de nuestra canalización generada y envíe el resultado
- Nos agarramos de nuestras cabezas, locos, nos calmamos ... y continuamos ...
- Leemos todos los núcleos con respecto a las técnicas y enfoques utilizados.
- Leer todas las discusiones del foro
- Remodelamos / complementamos tuberías con nuevas técnicas
- Pasamos al paso 1
Recuerde: nuestro objetivo en esta etapa es ganar experiencia . Llene nuestras tuberías con enfoques y métodos de trabajo, llene nuestros módulos con código de trabajo. No nos molestamos con las medallas, o mejor dicho, es genial si puedes tomar tu lugar de inmediato en la clasificación, pero si no, no te preocupes. No vinimos aquí durante cinco minutos, las medallas y los troqueles no irán a ninguna parte.
Aquí la competencia ha terminado, ¿estás en algún lugar, parece que todo el mundo está agarrando el siguiente?
NO!
¿Qué haces después?
- Esperando cinco días. No leas el foro, olvídate de Kaggle en este momento. Deja que tu cerebro se relaje y desenfoque tus ojos.
- Regresa a la competencia. Durante estos cinco días, según las reglas del buen gusto, todas las partes superiores publicarán una descripción de sus decisiones, en publicaciones en el foro, en forma de núcleos, en forma de repositorios de github.
¡Y aquí comienza tu INFIERNO personal!
- Toma varias hojas de formato A4, en cada una escribe el nombre del módulo del marco anterior (EDA / Preparación / Modelo / Conjunto / Selección de características / Búsqueda de hiperparámetros / ...)
- Lea constantemente todas las soluciones, escriba nuevas técnicas, métodos y enfoques que sean nuevos para usted en los folletos correspondientes.
Y lo peor:
- Consistentemente para cada módulo, escriba (espíe) la implementación de estos enfoques y métodos, ampliando su cartera y bibliotecas.
- En el modo de envío posterior, ejecute los datos a través de su tubería actualizada hasta que tenga una solución en la zona dorada o hasta que se agote la paciencia y los nervios.
Y solo después de eso procedemos a la próxima competencia.
No, no estoy jodido. Sí, es posible y más fácil. Tu decides
¿Por qué esperar 5 días y no leer de inmediato, porque en el foro puedes hacer preguntas? En esta etapa (en mi opinión) es mejor leer los hilos ya formados con discusiones de soluciones, preguntas que pueda tener, ya sea que alguien ya pregunte, o es mejor no preguntarlas, sino buscar la respuesta usted mismo)
¿Por qué todo esto lo hace? Bueno, una vez más, la tarea de esta etapa es desarrollar una base de datos de soluciones, métodos y enfoques. Base de trabajo de combate. Para que en la próxima competencia no pierdas el tiempo, pero inmediatamente dices: sí, puede llegar la codificación de destino , y por cierto, tengo el código correcto para esto a través de los pliegues en los pliegues. O oh! Recuerdo que el conjunto pasó por scipy.optimize y, por cierto, el código ya está listo para mí.
Algo asi ...
Ir al modo de trabajo

En este modo, resolvemos varias competiciones. Cada vez notamos que hay cada vez menos registros en las hojas y más y más código en los módulos. Gradualmente, la tarea de análisis se reduce al hecho de que acaba de leer la descripción de la solución, diga sí, vaya, ¡oh, ahí está! Y agregue uno o dos nuevos hechizos o enfoques a su alcancía.
Después de eso, el modo cambia al modo de manejo de errores. La base está lista para usted, ahora solo debe aplicarse correctamente. Después de cada competencia, mientras lee la descripción de las soluciones, vea lo que no hizo, lo que podría hacerse mejor, lo que se perdió o dónde entró, como lo hice en Toxic . Caminaba bastante bien, en el vientre del oro, y en privado voló 1.500 posiciones. Es una pena para las lágrimas ... pero se calmó, encontró un error, escribió una publicación en una holgura y aprendió una lección.
Una señal de la salida final al modo operativo puede ser el hecho de que una de las descripciones de la solución principal se escribirá a partir de su apodo.
Lo que debería estar aproximadamente en las tuberías al final de esta etapa:
- Todo tipo de opciones para preprocesar y crear funciones numéricas: proyecciones, relaciones,
- Diversos métodos de trabajo con categorías: codificación de destino media en la versión correcta, frecuencia, etiqueta / ohe,
- Varios esquemas de incrustación sobre texto (Glove, Word2Vec, Fasttext)
- Varios esquemas de vectorización de texto (Count, TF-IDF, Hash)
- Varios esquemas de validación (N * M para validación cruzada estándar, basada en tiempo, por grupo)
- Optimización bayesiana / hiperopt / algo más para seleccionar hiperparámetros
- Aleatorio / Permutación de destino / Boruta / RFE: para seleccionar funciones
- Modelos lineales: en el mismo estilo sobre un conjunto de datos
- LGB / XGB / Catboost: en el mismo estilo sobre un conjunto de datos
El autor creó metaclases por separado para modelos lineales y basados en árboles, con una única interfaz externa para nivelar las diferencias en la API para diferentes modelos. Pero ahora puede ejecutar una sola línea clave, por ejemplo, LGB o XGB en un solo conjunto de datos procesados.
- Varias redes neuronales para todas las ocasiones (no tomamos fotos por ahora): incrustaciones / CNN / RNN para texto, RNN para secuencias, Feed-Forward para todo lo demás. Es bueno comprender y poder autocodificar .
- Conjunto basado en lgb / regression / scipy - para tareas de regresión y clasificación
- Es bueno poder usar algoritmos genéticos , a veces van bien
Para resumir
Cualquier deporte, y el DS competitivo también es un deporte, es mucho sudor y mucho trabajo. Esto no es ni bueno ni malo, es un hecho. La participación en competiciones (si aborda correctamente el proceso) impulsa muy bien las habilidades técnicas, además de sacudir más o menos el espíritu deportivo cuando realmente no quiere hacer algo, lo rompe todo directamente, pero se levanta a su computadora portátil, rehace el modelo, comienza el cálculo, de modo que roer este desafortunado quinto decimal.
Así que decide Kaggle: ¡experiencia agrícola, medallas y fanático!
Algunas palabras sobre las líneas del autor.

En esta sección trataré de describir la idea principal de las tuberías y módulos recopilados durante un año y medio. Una vez más, este enfoque no pretende ser universal o único, pero de repente alguien ayudará.
- Todo el código de ingeniería de características, excepto la codificación de destino media, se extrae en un módulo separado en forma de funciones. Traté de recolectar objetos, resultó ser engorroso, y en este caso tampoco es necesario.
- Todas las características de la ingeniería de características están hechas en el mismo estilo y tienen una sola llamada y firma de devolución:
def do_cat_dummy(data, attrs, prefix_sep='_ohe_', params=None): # do something return _data, new_attrs
Pasamos el conjunto de datos, atributos para el trabajo, un prefijo para nuevos atributos y parámetros adicionales a la entrada. En la salida, obtenemos un nuevo conjunto de datos con nuevos atributos y una lista de estos atributos. Además, este nuevo conjunto de datos se guarda en un encurtido / pluma separado.
Lo que esto brinda es que tenemos la oportunidad de ensamblar rápidamente un conjunto de datos para capacitación de cubos pregenerados. Por ejemplo, para las categorías hacemos tres procesamientos a la vez: codificación de etiquetas / OHE / frecuencia, guárdelo en tres plumas separadas y luego, en la etapa de modelado, simplemente jugamos con estos bloques, creando varios conjuntos de datos de entrenamiento en un movimiento elegante.
pickle_list = [ 'attrs_base', 'cat67_ohe', # 'cat67_freq', ] short_prefix = 'base_ohe' _attrs, use_columns, data = load_attrs_from_pickle(pickle_list) cat_columns = []
Si necesita crear otro conjunto de datos, cambie pickle_list
, reinicie y trabaje con el nuevo conjunto de datos.
El conjunto principal de funciones sobre datos tabulares (reales y categóricos) incluye varias codificaciones de categorías, la proyección de atributos numéricos en categóricos, así como diversas transformaciones.
def do_cat_le(data, attrs, params=None, prefix='le_'): def do_cat_dummy(data, attrs, prefix_sep='_ohe_', params=None): def do_cat_cnt(data, attrs, params=None, prefix='cnt_'): def do_cat_fact(data, attrs, params=None, prefix='bin_'): def do_cat_comb(data, attrs_op, params=None, prefix='cat_'): def do_proj_num_2cat(data, attrs_op, params=None, prefix='prj_'):
Un cuchillo suizo universal para combinar atributos, en el que transferimos una lista de atributos de origen y una lista de funciones de conversión, en la salida obtenemos, como de costumbre, un conjunto de datos y una lista de nuevos atributos.
def do_iter_num(data, attrs_op, params=None, prefix='comb_'):
Además de varios convertidores específicos adicionales.
Para procesar datos de texto, se utiliza un módulo separado, que incluye varios métodos de preprocesamiento, tokenización, lematización / derivación, traducción a una tabla de frecuencias, etc. etc. Todo es estándar usando sklearn , nltk y keras .
Las series de tiempo también son procesadas por un módulo separado, con funciones para convertir el conjunto de datos original para tareas ordinarias (regresión / clasificación) y secuencia a secuencia. Gracias a François Chollet por terminar keras para que la construcción de modelos seq-2-seq no se parezca a un ritual vudú de llamar demonios.
En el mismo módulo, por cierto, también hay funciones del análisis estadístico habitual de series: comprobar la estacionariedad, la descomposición de STL, etc. ... Ayuda mucho en la etapa inicial del análisis "sentir" la serie y ver cómo es.
Las funciones que no se pueden aplicar inmediatamente a todo el conjunto de datos, pero que se deben usar dentro de los pliegues durante la validación cruzada, se colocan en un módulo separado:
- Significado de codificación de destino
- Upsampling / downsampling
Se pasan dentro de la clase de modelo (lea sobre los modelos a continuación) en la etapa de entrenamiento.
_fpreproc = fpr_target_enc _fpreproc_params = fpr_target_enc_params _fpreproc_params.update(**{ 'use_columns' : cat_columns, })
- Para el modelado, se creó una metaclase que generaliza el concepto de un modelo con métodos abstractos: fit / predict / set_params / etc. Para cada biblioteca específica (LGB, XGB, Catboost, SKLearn, RGF, ...) se crea una implementación de esta metaclase.
Es decir, para trabajar con LGB creamos un modelo
model_to_use = 'lgb' model = KudsonLGB(task='classification')
Para XGB:
model_to_use = 'xgb' metric_name= 'auc' task='classification' model = KudsonXGB(task=task, metric_name=metric_name)
Y todas las funciones funcionan aún más con el model
.
Para la validación, se han creado varias funciones que calculan inmediatamente tanto la predicción como el OOF para varias semillas durante la validación cruzada, así como una función separada para la validación regular a través de train_test_split. Todas las funciones de validación se operan utilizando métodos de metamodelo, lo que proporciona un código independiente del modelo y facilita la conexión a la tubería de cualquier otra biblioteca.
res = cv_make_oof( model, model_params, fit_params, dataset_params, XX_train[use_columns], yy_train, XX_Kaggle[use_columns], folds, scorer=scorer, metric_name=metric_name, fpreproc=_fpreproc, fpreproc_params=_fpreproc_params, model_seed=model_seed, silence=True ) score = res['score']
XX_train [use_columns], yy_train, XX_Kaggle [use_columns], pliegues, anotador = anotador, METRIC_NAME = METRIC_NAME, fpreproc = _fpreproc, fpreproc_params = _fpreproc_params, model_seed = model_seed, silencio = True res = cv_make_oof( model, model_params, fit_params, dataset_params, XX_train[use_columns], yy_train, XX_Kaggle[use_columns], folds, scorer=scorer, metric_name=metric_name, fpreproc=_fpreproc, fpreproc_params=_fpreproc_params, model_seed=model_seed, silence=True ) score = res['score']
Para la selección de funciones: nada interesante, RFE estándar y mi permutación aleatoria favorita en todas las formas posibles.
Para buscar hiperparámetros, la optimización bayesiana se utiliza principalmente, nuevamente en forma unificada, de modo que pueda ejecutar una búsqueda de cualquier modelo (a través del módulo de validación cruzada). Esta unidad vive en la misma computadora portátil que la simulación.
Se realizaron varias funciones para conjuntos, unificadas para tareas de regresión y clasificación basadas en Ridge / Logreg, LGB, Neural network y mi scipy.optimize favorito.
Una pequeña explicación: cada modelo de la tubería proporciona dos archivos como resultado: sub_xxx y oof_xxx , que son la predicción para la prueba y la predicción OOF para el tren. Luego, en el módulo de conjunto del directorio especificado, cargamos pares de predicciones de todos los modelos en dos marcos de datos: df_sub / df_oof . Bueno, luego miramos las correlaciones, seleccionamos las mejores, luego construimos modelos de nivel 2 sobre df_oof y aplicamos a df_sub .
A veces, para buscar el mejor subconjunto de modelos, la búsqueda por algoritmos genéticos es buena (el autor usa esta biblioteca ), a veces el método de Caruana . En los casos más simples, las regresiones estándar y scipy.optimize funcionan bien.
Las redes neuronales viven en un módulo separado, el autor usa keras en un estilo funcional , sí, no tan flexible como pytorch , pero suficiente por ahora. Nuevamente, se escriben funciones de entrenamiento universales que son invariables para el tipo de red.
Esta tubería se probó una vez más en una competencia reciente de Home Credit , el uso cuidadoso y preciso de todos los bloques y módulos trajo el puesto 94 y plata.
El autor generalmente está listo para expresar una idea sediciosa de que para los datos tabulares y una tubería normalmente hecha, la presentación final para cualquier competencia debe volar a la tabla de clasificación de los 100 mejores. Naturalmente, hay excepciones, pero en general esta afirmación parece ser cierta.
Sobre el trabajo en equipo

No es tan simple si decidir Kaggle en un equipo o en solitario depende mucho de la persona (y del equipo), pero mi consejo para aquellos que recién comienzan es intentar comenzar un solo. Por qué Trataré de explicar mi punto de vista:
- En primer lugar, comprenderá sus fortalezas, verá debilidades y, en general, podrá evaluar su potencial como práctica de DS.
- En segundo lugar, incluso cuando se trabaja en un equipo (a menos que sea un equipo establecido con separación de roles), todavía estarán esperando una solución completa de usted, es decir, ya debería tener tuberías de trabajo. (" Enviar o no ") (C)
- Y en tercer lugar, es óptimo cuando el nivel de jugadores en el equipo es casi el mismo (y bastante alto), entonces puedes aprender algo realmente útil de alto nivel) En equipos débiles (no hay nada despectivo, estoy hablando del nivel de entrenamiento y experiencia en Kaggle) es muy difícil aprender algo, es mejor morder el foro y los núcleos. Sí, puedes cultivar medallas, pero mira arriba para ver los objetivos y un cinturón para mantener los pantalones)
Consejos útiles del capitán para evidencia y la tarjeta de rastrillo prometida :)

Estos consejos reflejan la experiencia del autor, no son dogmas y pueden (y deberían) verificarse mediante nuestros propios experimentos.
Siempre comience construyendo una validación competente : no habrá ninguna; todos los demás esfuerzos volarán al horno. Mire nuevamente la tabla de clasificación de Mercedes .
El autor está realmente satisfecho de que en esta competencia haya construido un esquema estable de validación cruzada (3x10 pliegues), que mantuvo la velocidad y obtuvo el lugar 42 legítimo)
Si se crea una validación competente, confíe siempre en los resultados de su validación . Si la velocidad de sus modelos mejora con la validación, pero empeora con el público, es más razonable confiar en las validaciones. Al analizar, simplemente lea ese dato en el que la tabla de clasificación pública se considera otro pliegue. ¿No quieres sobrecargar tu modelo una sola vez?
Si el modelo y el esquema lo permiten, siempre haga predicciones OOF y manténgalas cerca del modelo. En la etapa de conjunto, nunca se sabe qué disparará.
Mantenga siempre el código / OOF al lado del resultado para recibirlo . No importa en Github, localmente, en cualquier lugar. Dos veces, resultó que en el conjunto, el mejor modelo era el que se hizo hace dos semanas fuera de la caja, y para el que no se guardó el código. Dolor
Martillo sobre la selección del lado "correcto" para la validación cruzada , él mismo pecó al principio. Mejor elija cualquiera de los tres y haga una validación cruzada 3xN. El resultado será más estable y más fácil.
No persiga el número de modelos en el conjunto : es mejor menos, pero más diverso, más diverso en modelos, en preprocesamiento, en conjuntos de datos. En el peor de los casos, según los parámetros, por ejemplo, un árbol profundo con regularización rígida, uno poco profundo.
Use shuffle / boruta / RFE para seleccionar características , recuerde que la importancia de las características en varios modelos basados en árboles es una métrica en loros en una bolsa de aserrín.
Opinión personal del autor (puede no coincidir con la opinión del lector) Optimización bayesiana > búsqueda aleatoria> hiperopt para seleccionar hiperparámetros. (">" == mejor)
La tabla de clasificación de desgarro presentada en un núcleo público se maneja mejor de la siguiente manera:
- Hay tiempo: miramos las novedades y construimos en nosotros mismos
- Menos tiempo - rehaga para nuestra validación, haga OOF - y fíjelo al conjunto
- No hay tiempo en absoluto: nos mezclamos estúpidamente con nuestra mejor solución y buscamos rápido.
Cómo elegir dos presentaciones finales , por intuición, por supuesto. Pero en serio, por lo general, todos practican los siguientes enfoques:
- Presentación conservadora (sobre modelos sostenibles) / presentación riesgosa.
- Lo mejor en OOF / Tabla de clasificación pública
Recuerde: todo es un dígito y las posibilidades de su procesamiento dependen solo de su imaginación. Use la clasificación en lugar de la regresión, trate las secuencias como una imagen, etc.
Y finalmente:
Enlaces utiles

General
http://ods.ai/ - para aquellos que desean unirse a la mejor comunidad de DS :)
https://mlcourse.ai/ - sitio web del curso ods.ai
https://www.Kaggle.com/general/68205 - publica sobre el curso en Kaggle
En general, recomiendo encarecidamente que, en el mismo modo que se describe en el artículo, vea el ciclo de video mltrainings : hay muchos enfoques y técnicas interesantes.
Video
Cursos
Puede aprender más sobre los métodos y enfoques para resolver problemas en Kaggle desde el segundo año de especialización , " Cómo ganar un concurso de ciencia de datos: aprender de los mejores Kagglers"
Lectura extracurricular:
Conclusión

El tema de la ciencia de datos en general y la ciencia de datos competitiva en particular es tan inagotable como el átomo (C). En este artículo, el autor solo reveló ligeramente el tema de bombear habilidades prácticas utilizando plataformas competitivas. Si se volvió interesante, conéctese, mire a su alrededor, acumule experiencia y escriba sus artículos. ¡Cuanto más buen contenido, mejor para todos nosotros!
Anticipando las preguntas: no, las canalizaciones y bibliotecas del autor aún no se han puesto a disposición de forma gratuita.
Muchas gracias a los colegas de ods.ai: Vladimir Iglovikov (ternaus) , Yuri Kashnitsky (yorko) , Valery Babushkin ( venheads) , Alexei Pronkin (pronkin_alexey) , Dmitry Petrov (dmitry_petrov) , Arthur Kuzin (n01z3) , y también todos los que te leen artículo antes de la publicación, para ediciones y reseñas.
Un agradecimiento especial a Nikita Zavgorodnoy (njz) por la revisión final.
Gracias por su atención, espero que este artículo sea útil para alguien.
Mi apodo en Kaggle / ods.ai : kruegger