J'ai un problème de classification avec les données catégorielles et numériques. Le problème auquel je suis confronté est que mes données catégorielles ne sont pas fixes, cela signifie que le nouveau candidat dont je veux prédire l'étiquette peut avoir une nouvelle catégorie qui n'a pas été observée au préalable.
Par exemple, si mes données catégoriques était sex
, les seules étiquettes possibles seraient female
, male
et other
, peu importe quoi. Cependant, ma variable catégorielle est city
telle qu'il pourrait arriver que la personne que j'essaie de prédire ait une nouvelle ville que mon classificateur n'a jamais vue.
Je me demande s'il y a moyen de faire le classement en ces termes ou si je devrais refaire la formation en considérant ces nouvelles données catégoriques.
city
en un nombre basé sur une fonction? Commecity' = f(latitude, longitude)
ça, vous pouvez créer une nouvelle valeur pour n'importe quelle villeRéponses:
C'est une très bonne question; en fait, ce problème existe depuis un certain temps et je n'ai pas encore trouvé la solution parfaite. Encore plus qu'heureux de partager mon expérience:
Utilisez d'autres méthodes d'encodage . Essayez peut-être d'en savoir plus sur d'autres méthodes qui sont robustes à ce problème, au moins pour le moment, comme le codage basé sur les cibles, le hachage (voir quelques références ci-dessous). Si vous êtes avec Python, il y a un bon paquet offrant des options d'encodage mant. Vous serez peut-être surpris de voir que d'autres méthodes simples fonctionnent souvent très bien.
Recycler votre modèle . Théoriquement, lorsque vous apprenez que votre train / ensemble aurait dû avoir la même distribution (principalement cela est considéré comme une distribution cible, mais peut aussi être vrai pour les variables). Maintenant que de nouveaux éléments entrent en jeu, votre distribution de données de test (invisible) a changé. Ensuite, il est préférable de recycler à nouveau le modèle afin que ces nouvelles villes soient prises en compte.
Mettez les sous-catégories nouvellement ajoutées (et les moins fréquentes) à d' autres . Bien que le point précédent soit vrai en théorie, il est très probable que la distribution des tests (de cette catégorie particulière) ne changera pas de façon aussi radicale dans la plupart des cas, par exemple très peu d'éléments vont en haut des catégories de l'ensemble de formation. Peut-être que dans votre cas, vous pouvez avoir 100 villes dans la fonction ville, et très peu de nouvelles arrivent au fil du temps. Ce que je considérerais serait d'examiner le quantile X de cette catégorie particulière, et de mettre les moins fréquents dans la sous-catégorie Autres . En supposant que votre point de données nouvellement ajouté n'est que peu, il ira beaucoup dans les autresgroupe. Vous perdrez certainement un niveau de granularité en faisant celui-ci, mais encore une fois, le point d'apprentissage est que non seulement votre modèle apprend les données de formation, mais surtout pour pouvoir très bien généraliser sur les données invisibles et si ces nouvelles catégories ajoutées sont des points de données très, les regrouper dans le groupe Autres ne fera pas de mal.
Autres solutions récentes non encore matures comme Cat2Vec (emprunté à Word2Vec de NLP) ou Similarity Encoding . Ceux-ci sont très récents, consultez le papier pour le premier et son github et un exemple (basé sur Word2Vec) dans Kaggle, et ce papier pour le second et sa mise en œuvre . L'idée de la première est de convertir les catégories en vecteurs. Autant que je dois dire, cela a vraiment du sens de fonctionner, mais je n'ai aucune expérience de son utilisation. Ce dernier, appelé dirty_cat , semble assez prometteur et facile à utiliser. Il n'est pas clair pour moi qu'il soit robuste d'avoir une catégorie cardinale invisible dans vos données de test!
PS: Je voudrais ajouter que l'idée de ville à un emplacement géographique donnée dans le premier commentaire est vraiment sympa et ce n'est en fait pas compliqué car ce sont de nombreuses API Python par exemple par Google ou ICI qui vous permettent de faire ça. Mais il est à noter que ce n'est qu'un moyen de concevoir de nouvelles fonctionnalités et certainement pas d'être remplacé par la fonctionnalité de la ville elle-même.
Références intéressantes à vérifier en premier , deuxième , troisième , quatrième (pas de commande particulière!)
Tous les points mentionnés ci-dessus sont des solutions pratiques assez théoriquement correctes et sûrement soumises à de nouvelles discussions. Et je suis plus qu'heureux d'en savoir plus.
la source
La chose la plus simple à faire (qui est généralement un bon point de départ) est de coder à chaud vos villes où chaque ville devient une entité unique et a des valeurs de 1 (la personne est de cette ville) ou de 0 (pas de cette ville). Si une nouvelle ville apparaît dans un ensemble de tests qui n'est pas présent dans l'ensemble d'entraînement, cette personne aura juste un 0 pour toutes les villes de l'ensemble d'entraînement. Cela peut sembler étrange, mais si cette ville ne fait pas partie de l'ensemble d'entraînement, il ne devrait y avoir aucun poids pour une personne originaire de cette ville.
La prochaine étape serait quelque chose dans le sens de ce que Mohammad Athar a suggéré et vous donnerait une idée de la proximité géographique avec d'autres villes dans votre ensemble de formation. Cela va être beaucoup plus compliqué, je vais donc laisser quelqu'un d'autre en parler.
la source
Vous devriez vérifier Vowpal Wabbit , qui gère très bien les nouvelles fonctionnalités à l'aide d'un truc de hachage et de taux d'apprentissage adaptatifs.
Non seulement il ne plantera pas lorsque de nouvelles fonctionnalités apparaissent (au moment du train ou du test), il commencera également à mettre à jour ses poids dessus. En plus de cela, c'est méchant rapide. Cependant, il n'implémente que des variantes du modèle linéaire, vous êtes donc limité de ce côté. Un outil très puissant à connaître
la source