Comment puis-je faire une classification avec des données catégorielles qui ne sont pas fixes?

10

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, maleet other, peu importe quoi. Cependant, ma variable catégorielle est citytelle 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.

Marisa
la source
1
pouvez-vous convertir cityen un nombre basé sur une fonction? Comme city' = f(latitude, longitude)ça, vous pouvez créer une nouvelle valeur pour n'importe quelle ville
Mohammad Athar
@MohammadAthar ici a donné la solution parfaite, espérons que OP la verra!
Francesco Pegoraro

Réponses:

11

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:

  • Évitez autant que possible le codage à chaud (contrairement à ce qui a été suggéré ci-dessus). Le raisonnement est que cela ne fonctionnera pas. Un modèle avec des fonctionnalités d'encodage à chaud ne fonctionne que lorsque tous ces sous-niveaux existaient dans les données d'entraînement. Le modèle ne pourra pas faire de prédiction, sauf s'il est en quelque sorte modifié manuellement. Si vous effectuez une recherche, vous constaterez que de nombreuses personnes ont rencontré ce problème lors de la division de leurs données en train / test et ont rencontré le problème de certains sous-niveaux d'une fonctionnalité particulière n'étaient pas présents dans la division de formation et n'ont pas réussi à faire de prédiction sur le test. Dit à part, si vous avez des caractéristiques cardinales très élevées (peut-être comme votre ville avec disons 200 noms de villes), cela augmentera inutilement la dimensionnalité de vos données! Si, pour certaines raisons, vous devrez peut-être effectuer un codage à chaud, gardez-les à l'esprit.
  • 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.

TwinPenguins
la source
1
Qu'en est-il de la création de regroupements de villes similaires? Comme même si nous avons une nouvelle ville, ce n'est pas différent de tout ce que nous avons déjà, nous pouvons recouper avec la ville correspondante la plus proche?
Aditya
Plaisir Aditya. C'est également une autre excellente idée. Je ne connais pas le nouveau "Similarity Encoding", il se pourrait qu'ils fassent exactement la même chose. Consultez leur tutoriel. Notez également qu'il faut faire attention au clustering à utiliser pour les données catégorielles comme les modes k, car toutes leurs distances n'ont pas la même signification que les valeurs numériques.
TwinPenguins
Merci pour votre excellente réponse. Comment pourrais-je faire le recyclage? Je veux dire, imaginez que j'ai un nouveau candidat et je veux prédire s'il est bon ou mauvais, comment pourrais-je recycler mon modèle si je n'ai pas son vrai label indiquant s'il est bon ou non? Je ne vois pas le moyen d'inclure ces nouvelles données pour faire le recyclage et il me manquera le point de prédiction. Ai-je tort?
Marisa
Je vous en prie. À propos de la reconversion: cela signifie littéralement recommencer, mélanger toutes vos données en vous assurant d'avoir de nouvelles données et recommencer à apprendre. L'autre point que vous avez mentionné, c'est que vous n'avez pas la véritable étiquette pour ce nouveau point de données particulier: c'est une histoire très différente pour elle-même. Ce que vous pourriez faire pour étiqueter ce point de données, c'est chercher le point de données le plus similaire et en prendre l'étiquette comme l'algorithme KNN très simple.
TwinPenguins
4

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.

DJBunk
la source
Commencer simplement et grandir à partir de là est un excellent conseil!
Escachator
0

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

slymore
la source