Tengo una base de datos de mi aplicación de Facebook y estoy tratando de usar el aprendizaje automático para estimar la edad de los usuarios en función de los sitios de Facebook que les gustan.
Hay tres características cruciales de mi base de datos:
la distribución de edad en mi conjunto de entrenamiento (12k de usuarios en total) está sesgada hacia los usuarios más jóvenes (es decir, tengo 1157 usuarios de 27 años y 23 usuarios de 65 años);
muchos sitios no tienen más de 5 me gusta (he filtrado los sitios de FB con menos de 5 me gusta).
Hay muchas más características que muestras.
Entonces, mis preguntas son: ¿qué estrategia sugeriría para preparar los datos para un análisis posterior? ¿Debo realizar algún tipo de reducción de dimensionalidad? ¿Qué método de ML sería el más apropiado para usar en este caso?
Principalmente uso Python, por lo que las sugerencias específicas de Python serían muy apreciadas.
fuente
Respuestas:
Una cosa para comenzar sería k-NN. La idea aquí es que tiene una matriz de usuario / elemento y para algunos de los usuarios tiene una edad reportada. La edad de una persona en la matriz de elementos de usuario puede estar bien determinada por algo como la edad media o mediana de algunos vecinos más cercanos en el espacio de elementos.
Entonces, tiene cada usuario expresado como un vector en el espacio del elemento, encuentre los k vecinos más cercanos y asigne al vector en cuestión algunas estadísticas resumidas de las edades de los vecinos más cercanos. Puede elegir k en un límite de distancia o de manera más realista asignando iterativamente edades a una bodega de tren y eligiendo la k que minimiza el error en esa asignación.
Si la dimensionalidad es un problema, puede realizar fácilmente la reducción en esta configuración mediante la descomposición de un solo valor eligiendo los m vectores que capturan la mayor variación en todo el grupo.
En todos los casos, dado que cada característica es binaria, parece que la similitud del coseno sería su métrica de distancia.
Necesito pensar un poco más sobre otros enfoques (regresión, rf, etc.) dado el enfoque limitado de su espacio de características (todas las variantes de la misma acción, gusto) Creo que el enfoque de usuario / elemento podría ser el mejor.
Una nota de precaución, si las edades que tiene para el tren son autoinformadas, es posible que deba corregir algunas de ellas. Las personas en Facebook tienden a informar edades en la década en que nacieron. Trace un histograma de las fechas de nacimiento (derivadas de las edades) y vea si tiene picos en décadas como 70, 80, 90.
fuente
sklearn.neighbors.KNeighborsRegressor
con la métrica del coseno en el espacio reducido SVD (después de aplicar SVD, el error de estimación promedio bajó de ~ 6 años a ~ 4). Los usuarios de mi base de datos tienen entre 18 y 65 años (los usuarios mayores fueron filtrados), por lo que hay 48 clases posibles. Me pregunto si no son demasiadas clases para kNN y si debería tratarlo como una regresión o un problema de clasificación (creo que ambos son aplicables).Recientemente hice un proyecto similar en Python (prediciendo opiniones usando datos similares a FB), y obtuve buenos resultados con el siguiente proceso básico:
En su caso, necesitaría cambiar el clasificador por un regresor (así que vea aquí: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html ) pero de lo contrario el mismo proceso debería funcionar sin muchos problemas.
Además, debe tener en cuenta la característica más sorprendente de los bosques aleatorios en Python: la paralelización instantánea. Aquellos de nosotros que comenzamos a hacer esto en R y luego nos mudamos siempre estamos asombrados, especialmente cuando trabajas en una máquina con unas pocas docenas de núcleos (ver aquí: http://blog.yhathq.com/posts/comparing- random-forest-in-python-and-r.html ).
Finalmente, tenga en cuenta que esta sería una aplicación perfecta para el análisis de red si tiene los datos de amigos y de los propios individuos. Si puede analizar las edades de los amigos de un usuario, la edad del usuario seguramente será dentro de un año o dos de la mediana entre sus amigos, particularmente si los usuarios son lo suficientemente jóvenes como para haber construido sus redes de amigos mientras todavía están en escuela (ya que la mayoría serán compañeros de clase). Es probable que esa predicción supere a cualquiera que obtenga del modelado: este es un ejemplo de libro de texto de un problema en el que los datos correctos> el modelo correcto cada vez.
¡Buena suerte!
fuente
Otra sugerencia es probar la regresión logística . Como una ventaja adicional, los pesos (coeficientes) del modelo le darán una idea de qué sitios son distributivos por edad.
Sklearn ofrece el paquete sklearn.linear_model.LogisticRegression que también está diseñado para manejar datos dispersos.
Como se menciona en los comentarios, en el presente caso, con más variables de entrada que muestras, debe regularizar el modelo (con sklearn.linear_model.LogisticRegression use el
penalty='l1'
argumento).fuente
Algunas investigaciones de D. Nguyen et al. intente predecir la edad del usuario de Twitter en función de sus tweets. Quizás los encuentres útiles. Utilizan regresión logística y lineal.
fuente
Además de los métodos más sofisticados, puedes probar la fórmula de Bayes
P (I | p1 ... pn) = P (p1 ... pn | I) P (I) / sum_i (P (p1 ... pn | i) P (i))
P (I | p1 ... pn) es la probabilidad de que un usuario pertenezca al grupo de edad I si le gustó p1, .., pn
P (i) es la probabilidad de que un usuario pertenezca al grupo de edad i
P (p1 .. pn | i) es la probabilidad de que a un usuario le haya gustado p1, .., pn si pertenece al grupo de edad i.
Para estimar P (p1 ... pn | i), para cada grupo de edad calculo la probabilidad (frecuencia) p_ij de que le guste una página j. Para que p_ij no sea cero para todos los j, puede mezclar la frecuencia para toda la población con un peso pequeño.
Luego, log P (p1 ... pn | i) = sum (log p_ij, i = p1, .., pn), la suma de todas las páginas que le gusta a un nuevo usuario. Esta fórmula sería aproximadamente cierta suponiendo que a un usuario le gusten las páginas de su grupo de edad de forma independiente.
Si usted u otra persona ha intentado esto, comente sobre el resultado.
fuente
Este es un problema muy interesante.
Me enfrenté a uno similar al analizar las imágenes que los usuarios suben a la red social. Hice el siguiente enfoque:
Este enfoque es el aprendizaje semi-supervisado y lo recomendé en caso de que solo tenga algunos datos etiquetados.
Tenga en cuenta que en una red social, las personas generalmente mienten sobre la edad (solo por diversión o, a veces, porque quieren camuflarse en la red social).
fuente