J'ai une base de données de mon application Facebook et j'essaie d'utiliser l'apprentissage automatique pour estimer l'âge des utilisateurs en fonction des sites Facebook qu'ils aiment.
Il y a trois caractéristiques cruciales de ma base de données:
la répartition par âge dans mon ensemble de formation (12k d'utilisateurs en somme) est biaisée vers les utilisateurs plus jeunes (c'est-à-dire que j'ai 1157 utilisateurs âgés de 27 ans et 23 utilisateurs âgés de 65 ans);
de nombreux sites n'ont pas plus de 5 likers (j'ai filtré les sites FB avec moins de 5 likers).
il y a beaucoup plus de fonctionnalités que d'échantillons.
Alors, mes questions sont: quelle stratégie proposeriez-vous pour préparer les données pour une analyse plus approfondie? Dois-je effectuer une sorte de réduction de la dimensionnalité? Quelle méthode ML serait la plus appropriée à utiliser dans ce cas?
J'utilise principalement Python, donc des conseils spécifiques à Python seraient grandement appréciés.
la source
Réponses:
Une chose pour commencer serait k-NN. L'idée ici est que vous avez une matrice utilisateur / article et pour certains des utilisateurs, vous avez un âge déclaré. L'âge d'une personne dans la matrice d'élément utilisateur peut être bien déterminé par quelque chose comme l'âge moyen ou médian de certains voisins les plus proches dans l'espace d'élément.
Vous avez donc chaque utilisateur exprimé sous forme de vecteur dans l'espace des objets, trouvez les k voisins les plus proches et attribuez au vecteur en question une statistique récapitulative des âges des voisins les plus proches. Vous pouvez choisir k sur une coupure de distance ou de manière plus réaliste en affectant de manière itérative des âges à un train retenu et en choisissant le k qui minimise l'erreur dans cette affectation.
Si la dimensionnalité est un problème, vous pouvez facilement réduire cette configuration en décomposant une seule valeur en choisissant les m vecteurs qui captent le plus de variance dans le groupe.
Dans tous les cas, puisque chaque fonctionnalité est binaire, il semble que la similitude en cosinus serait votre mesure de distance.
J'ai besoin de réfléchir un peu plus aux autres approches (régression, rf, etc ...) étant donné la focalisation étroite de votre espace de fonctionnalités (toutes les variantes de la même action, j'aime), je pense que l'approche utilisateur / élément pourrait être la meilleure.
Une note de prudence, si les âges que vous avez pour le train sont auto-déclarés, vous devrez peut-être en corriger certains. Les gens sur Facebook ont tendance à déclarer l'âge dans la décennie où ils sont nés. Tracez un histogramme des dates de naissance (dérivées des âges) et voyez si vous avez des pointes à des décennies comme les années 70, 80, 90.
la source
sklearn.neighbors.KNeighborsRegressor
la métrique cosinus sur un espace réduit en SVD (après application de SVD, l'erreur d'estimation moyenne est passée de ~ 6 ans à ~ 4). Les utilisateurs de ma base de données sont âgés de 18 à 65 ans (les utilisateurs plus âgés ont été exclus), il y a donc 48 classes possibles. Je me demande si ce n'est pas trop de classes pour kNN, et si je dois le traiter comme une régression ou un problème de classification (je pense que les deux sont applicables).J'ai récemment fait un projet similaire en Python (prédire les opinions en utilisant des données FB) et j'ai obtenu de bons résultats avec le processus de base suivant:
Dans votre cas, vous devrez remplacer le classifieur par un régresseur (alors voir ici: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html ) mais sinon le même processus devrait fonctionner sans trop de problèmes.
En outre, vous devez être conscient de la caractéristique la plus étonnante des forêts aléatoires en Python: la parallélisation instantanée! Ceux d'entre nous qui ont commencé à faire cela dans R et qui sont ensuite passés sont toujours étonnés, surtout lorsque vous travaillez sur une machine avec quelques dizaines de cœurs (voir ici: http://blog.yhathq.com/posts/comparing- forêts-aléatoires-en-python-et-r.html ).
Enfin, notez que ce serait une application parfaite pour l'analyse de réseau si vous disposez des données sur les amis ainsi que sur les individus eux-mêmes. Si vous pouvez analyser l'âge des amis d'un utilisateur, l'âge de l'utilisateur sera presque certainement dans un an ou deux de la médiane de ses amis, en particulier si les utilisateurs sont assez jeunes pour avoir construit leurs réseaux d'amis tout en étant l'école (puisque la plupart seront des camarades de classe). Cette prédiction l'emporterait probablement sur tout ce que vous obtiendriez de la modélisation --- c'est un exemple classique d'un problème où les bonnes données> le bon modèle à chaque fois.
Bonne chance!
la source
Une autre suggestion est de tester la régression logistique . En prime, les poids (coefficients) du modèle vous donneront une idée des sites qui ne sont pas liés à l'âge.
Sklearn propose le package sklearn.linear_model.LogisticRegression qui est également conçu pour gérer des données éparses.
Comme mentionné dans les commentaires, dans le cas présent, avec plus de variables d'entrée que d'échantillons, vous devez régulariser le modèle (avec sklearn.linear_model.LogisticRegression utiliser l'
penalty='l1'
argument).la source
Certaines recherches de D. Nguyen et al. essayez de prédire l'âge des utilisateurs de twitter en fonction de leurs tweets. Vous les trouvez peut-être utiles. Ils utilisent une régression logistique et linéaire.
la source
Outre les méthodes plus sophistiquées, vous pouvez essayer la formule Bayes
P (I | p1 ... pn) = P (p1 ... pn | I) P (I) / sum_i (P (p1 ... pn | i) P (i))
P (I | p1 ... pn) est la probabilité qu'un utilisateur appartienne au groupe d'âge I s'il a aimé p1, .., pn
P (i) est la probabilité qu'un utilisateur appartienne au groupe d'âge i
P (p1 .. pn | i) est la probabilité qu'un utilisateur aime p1, .., pn s'il appartient au groupe d'âge i.
Pour estimer P (p1 ... pn | i), pour chaque tranche d'âge i estimer la probabilité (fréquence) p_ij d'aimer une page j. Pour avoir p_ij non nul pour tout j, vous pouvez mélanger la fréquence pour l'ensemble de la population avec un petit poids.
Ensuite, log P (p1 ... pn | i) = sum (log p_ij, i = p1, .., pn), la somme sur toutes les pages qu'un nouvel utilisateur aime. Cette formule serait approximativement vraie en supposant qu'un utilisateur aime les pages de son groupe d'âge indépendamment.
Si vous ou quelqu'un d'autre avez essayé, veuillez commenter le résultat.
la source
C'est un problème très intéressant.
J'ai fait face à un problème similaire en analysant les photos que les utilisateurs téléchargent sur le réseau social. J'ai fait l'approche suivante:
Cette approche est un apprentissage semi-supervisé et je l'ai recommandé au cas où vous n'auriez que quelques données étiquetées.
Veuillez noter que sur un réseau social, les gens mentent généralement sur l'âge (juste pour le plaisir, ou parfois parce qu'ils veulent se camoufler sur le réseau social).
la source