¿Qué enfoques utilizaron los participantes en Quora ML CodeSprint 2013?

Me concentré en un solo problema: quora-ml-respondida

Idioma utilizado: Python 2 con scikit learn

Mi enfoque fue bastante simple.

Preprocesamiento:

Mi primera idea fue usar una etiqueta anónima de alguna manera. Entonces, agregué una cadena única (como “asdfAnony”) al texto de la pregunta. Pensé que mi Vectorizador y Transfermers convertirían la presencia de esta palabra en una característica. Finalmente agregué temas y seguidores (después del binning) al Texto de la pregunta.

Utilicé Vectorizer simple sin ningún hashing ya que quería pasar por las palabras / tokens principales para mi comprensión.

En mi caso, los unigramas se desempeñaron mejor que 2, 3, 4 y 5 gramos. (¡Los probé todos!)

No convertí datos dispersos a densos. Entonces, tuve que usar métodos que pueden tomar datos en formato disperso.

Selección de modelo:

Luego intenté usar varios modelos con estos datos. Algunos de ellos eran buenos, pero se restringió el tiempo para filtrar algunos de ellos.

Rendimiento de varios algos en el conjunto de datos de muestra:

Basado en esta prueba, elegí 3 mejores.

  • Regresión logística (con penalización L2)
  • Clasificador SGD (con penalización L2)
  • SVC lineal

SGD era mejor que los dos modelos restantes, pero estaba tomando mucho tiempo. La regresión logística funcionó mejor que el SVC lineal (alrededor de un 2% de diferencia en precisión).

Nota: En un momento pensé en usar los 3 y usar los resultados para predecir la respuesta final. ¡Pero eso fue solo un pensamiento!

Decidí usar Regresión logística con penalización L2. Más tarde encontró parámetros óptimos para tolerancia y C, utilizando la búsqueda de cuadrícula. ¡Finalmente llegué al primer lugar en la tabla de posiciones!

Pero quería usar SGD. Entonces, tomé algunas palabras importantes del modelo clasificador SGD y les otorgé un peso adicional antes de suministrarlas a LogRegressor. Resultó en un aumento muy pequeño de 0.2% en precisión y estaba satisfecho de usar SGD de alguna maneraJ. En realidad, tenía mucho miedo de un ajuste excesivo debido a mi último paso. Pero el efecto fue insignificante.

Experimenté todo lo posible en mis límites (> 100 presentaciones en HackerRank y número de pruebas en mi máquina local) y disfruté de todas y cada una de las presentaciones que me llevaron a la clasificación. ¡Cruzar a Ben fue el mejor momento!

Si piensa en alguna sugerencia o corrección (como si algo no tiene sentido), ¡hágamelo saber!

Como estamos limitados a 60 segundos, esto descartó modelos no lineales complejos que utilizan algo más que un puñado de características. Frente a eso, tomé la ruta de lanzar tantas características como sea posible en modelos lineales tontos, pero rápidos (cresta y regresión logística).

Para el texto de la pregunta, utilicé vectores bigram tf-idf, que resultaron ser bastante útiles (+ 1-2 puntos) en el clasificador de respuestas, pero no tanto en comparación con solo tf-idf sin procesar en los demás. Además del vector tf-idf, agregué algunas características heurísticas con el objetivo de capturar algún sentido de calidad o estilo de la pregunta: índice de puntuación, índice de mayúsculas, longitud promedio de palabras y número de palabras si no recuerdo mal.

Para la información del tema, los concatene todos en otra cadena e hice un vectorizador tf-idf / count (no puedo recordar con qué fui al final) para obtener un indicador categórico rápido / hack de los temas. Además de eso, tenía una función de cuántos temas estaban presentes, un indicador binario de si había o no un tema de contexto y cuántos seguidores había para el tema de contexto y seguidores promedio para los otros temas.

Además, dado que esto estaba siendo utilizado por un modelo lineal tonto, introduje combinaciones de segundo orden de las características del vector no tf-idf en él también para darles un poco más de flexibilidad a los modelos lineales.

Luego, todo se convirtió en escala estándar / zmuv excepto los indicadores binarios.

Otra cosa que noté fue que para las preguntas de interés y vistas, las distribuciones objetivo parecían distribuciones exponenciales con muchos agrupados hacia cero con colas largas a cantidades más altas y la transformación por la raíz cúbica funcionó mejor para masajearlo lo más cerca posible en una distribución normal para los modelos lineales.

Son realmente todos los pequeños pasos juntos los que se suman para obtener el segundo lugar en el segmento de 8 horas. Al final, se trataba de probar toneladas de cosas y descubrir cómo hacer que los problemas tengan el mejor formato posible para los modelos lineales. Dejar de lado cualquiera de los pasos probablemente solo habría terminado alrededor del top 10. Lamentablemente, no tuve tiempo de seguir trabajando durante el segmento de la semana.

He tenido alguna experiencia en el pasado con el aprendizaje automático, pero siento que todavía no tengo una metodología adecuada. Me gustaría saber qué piensan ustedes sobre lo que he hecho aquí.

Modelos de regresión / clasificación
Intenté usar el SVC y el SVR con los núcleos RBF, pero, como dijo Alec, debido a la limitación de tiempo, tomó tiempo entrenar, por lo que no se pudo usar. Así que, como él, utilicé modelos lineales, que eran más rápidos de entrenar.

Algo de lo que me di cuenta un poco más tarde fue que realizar una transformación logarítmica en algunas de las variables arrojó mejores resultados. Por ejemplo, eche un vistazo a la distribución del número de seguidores por intereses (segundo desafío):
Después de una transformación de registro:

Los valores de r están bastante cerca, pero hice una regresión usando solo el número de seguidores y los valores de interés, antes y después del registro, y usé el puntaje RMSLE. Antes del registro: 47.864%, después: 51.822%.
Naturalmente, me volví loco y comencé a transformar todo lo que pude encontrar. Pero eso obviamente no ayudó tanto.

(Me gustaría saber si esto de la transformación del registro es lo que hay que hacer aquí, o si es así, por qué. He visto algunos artículos que dicen que los datos de conteo no deberían transformarse en el registro … pero ¿por qué no si ayuda? ? Heh.)

Caracteristicas
Obviamente fui con seguidores totales como una de mis características. Para los datos textuales, experimenté usando solo los recuentos, TF-IDF y solo un valor binario para cada palabra. En la mayoría de los casos, solo los recuentos funcionan bien.

También utilicé los temas (no las palabras de los temas) en los que se encuentran. Sin embargo, el tema de contexto no fue útil para todos los escenarios. Cuando utilicé el tema de contexto, se utilizó la codificación de uno en caliente.

Hacer todo lo anterior hizo que mi vector de características fuera increíblemente enorme y escaso, y también creó mucho ruido en la predicción. Luego usé la clase SelectKBest de sklearn, y usé el puntaje f_regression para la selección de características sobre el tema y las características textuales.

También agregué características basadas en el formato de la pregunta: ¿Hubo un por qué, quién, qué, cuándo, etc. al principio y un signo de interrogación al final de esas oraciones? ¿Hay palabras del diccionario todas en mayúsculas?
Todos estos fueron creados a partir de la búsqueda de preguntas de puntaje alto y preguntas de puntaje bajo.

Ejemplos de preguntas de baja puntuación:

¿Chicos que aman ser mariquitas? <- Whut.

BORRADO

¿POR QUÉ LA INDIA JUVENTUD NO ES DE INTERÉS POLÍTICO?

Harry Potter, ¿qué debería leer a continuación?

Ejemplos de preguntas de alta puntuación:

¿Cuáles son algunas de las conversaciones de Facebook verdaderamente épicas que has encontrado?
¿Cómo podemos evitar que las inteligencias artificiales se nos opongan?
¿Cómo es ser discretamente rico?
¿Cuáles son algunos de los hechos más alucinantes que suenan como “BS” pero son realmente ciertos?
¿Por qué no hay una sola universidad india en la lista de los 100 mejores índices del mundo?

Una cosa interesante que encontré mientras trabajaba en “Interés” fue que, al pensar en cómo podría incorporar la posición de las palabras, decidí puntuar las palabras más arriba en la pregunta. Tenía sentido para mí, ya que la gente podría no molestarse en leer después de las primeras palabras. Entonces se me ocurrió:

puntuación (w_i) = 1 / (i + 1)

Donde w_i es la i-ésima palabra (después de descartar las palabras detenidas y las palabras de longitud <3, no las uso). Tuve un aumento en la precisión, pero luego me di cuenta de que, como había olvidado lanzar el denominador como flotante, ¡todo lo que estaba haciendo era anotar solo la primera palabra! Y arreglar esto en realidad causó una caída en la precisión. Así que decidí extraer solo la primera palabra de las preguntas.

Optimización para precisión
Lo que quedaba para mí era ajustar la cantidad de funciones cuidadosamente para un rendimiento óptimo. Inicialmente para la velocidad, simplemente entrené contra los datos de entrenamiento y ejecuté el modelo contra los datos de la prueba. Esto me llevó bastante lejos, pero después de un tiempo, sentí que estaba sobreajustando, y utilicé la validación cruzada 10 veces y una búsqueda de cuadrícula a través de diferentes valores de K para la selección de características. Creo que esto ayudó más tarde cuando el conjunto de pruebas ocultas se usó contra mis modelos de mejor rendimiento.

En resumen, lo que más me ayudó finalmente fue agregar buenas características y eliminar las malas. Ajustar hiperparámetros o elegir mejores algoritmos de regresión puede ayudar, pero solo puede llegar hasta allí. También es muy importante asegurarse de no obtener un resultado sobreajustado mediante la validación cruzada.

No tengo ninguna experiencia en ML, no conozco ninguna técnica, algoritmo, etc. sobre ML. Vi el concurso y solo quiero probar un poco. Por supuesto, el resultado fue un desastre 🙂

Usé la idea más simple que se me ocurrió cuando leí la pregunta. Generalmente solo cuento / sumo / calculo la media de los valores __ans__ dados y hago nuevos valores __ans__.

Con este enfoque;
En la primera pregunta obtuve ~ 54 puntos, lo cual es un poco mejor que decir verdadero a todas las consultas. Decir fiel a todas las consultas da ~ 50. La primera persona tiene ~ 66.
En la segunda pregunta obtuve ~ 50. La primera persona tiene ~ 67.
En la tercera pregunta obtuve ~ 41. La primera persona tiene ~ 60.

Fue buena experiencia. Decidí trabajar en ML más.