Encodage pour les classificateurs
J'ai quelques doutes sur l'encodage (je ne suis pas familier avec des tâches comme celles-ci) des variables catégorielles pour les utiliser comme paramètres dans un modèle comme la régression logistique ou SVM. Mon ensemble de données ressemble à ce qui suit
Text Symbol Note Account Age Label
There is a red car ! red John 24 1
My bag was very expensive ? orange Luke 36 0
Where are my keys? @ red Red 58 1
I promise: I will never let you go! ... green Aoife 28 0
Dans le texte, les commentaires des utilisateurs d'une communauté sont enregistrés; symbole inclut le symbole le plus utilisé par un utilisateur; La note représente son niveau: le vert est plus expérimenté, le rouge est un nouveau menuisier; Le compte est le nom d'utilisateur. L'étiquette me donne des informations sur la confiance de l'utilisateur: si 0 l'utilisateur n'est pas faux; si un utilisateur pourrait être un bot possible.
Je souhaite classer les nouveaux utilisateurs en fonction des informations actuelles (voir les colonnes ci-dessus). Mon ensemble de données comprend plus de 1000 lignes et 400 utilisateurs. Puisque pour utiliser des classificateurs, j'ai besoin d'encoder des champs catégoriels, j'ai essayé de faire comme suit, en utilisant MultiColumnLabelEncoderdans sklearn:
MultiColumnLabelEncoder(columns = ['Text', 'Symbol', 'Note', 'Account']).fit_transform(df)
où df est mon dataframe. Cependant, j'ai compris que le onehotencoder devrait également être préférable. J'ai également inclus Account car il pourrait y avoir plus de commentaires du même compte, donc si je classais un compte comme faux et que je reçois un nouveau commentaire du même compte, alors ce compte pourrait être facilement détecté comme faux. Le but, comme je l'ai mentionné précédemment, serait de classer, avec une certaine précision, les nouveaux éléments d'un jeu de test, en fonction des informations données (symbole, note, âge, textes), c'est-à-dire rechercher d'éventuelles corrélations entre ces variables qui peut me permettre de dire qu'un nouveau compte est faux (1) ou non (0).
Le problème, comme vous pouvez le voir, est lié aux classificateurs où les paramètres ne sont pas seulement numériques, mais aussi catégoriques.
Pour le prétraitement des données (suppression des mots vides et nettoyage des données), j'ai utilisé les packages Python de nltk; concernant l'extraction de caractéristiques (cela devrait être un point clé car il est lié à l'étape suivante, c'est-à-dire en utilisant un classificateur pour prédire la classe - 1 ou 0), j'ai trouvé des difficultés à comprendre quelle sortie je dois attendre de l'encodage pour être capable d'utiliser les informations ci-dessus comme entrées dans mon modèle (où la cible est appelée étiquette et c'est une valeur binaire). J'utilise comme classifieur la régression logistique, mais aussi SVM.
Ma sortie attendue, dans le cas de l'utilisateur X âgé de 16 ans, le symbole #, la note Wonderful et la note rouge (nouveau menuisier) serait une classification comme faux avec un certain pourcentage.
J'apprécierais que quelqu'un puisse m'expliquer, étape par étape, la manière de transformer mon jeu de données en un jeu de données dont je peux utiliser les variables dans une régression logistique afin de déterminer l'étiquette (fausse ou non fausse) des nouveaux utilisateurs.
Réponses
Vous devrez utiliser un mélange de traitement de texte et un encodage à chaud. La colonne de texte ne doit pas être traitée comme encodée à chaud car elle essaiera de créer une nouvelle variable pour chaque phrase unique dans l'ensemble de données, ce qui sera beaucoup (et pas très utile pour l'apprentissage). Le vectoriseur de texte résumera la colonne de texte en fonction du type de mots / jetons qui y apparaissent.
Vous devez donc utiliser un vectoriseur de texte pour traiter uniquement la colonne de texte en premier. Cela vous donnera une trame de données (disons A). Cette base de données aura des colonnes correspondant aux jetons / mots dans l'ensemble de données. Donc, si le vectoriseur de texte prend 100 mots uniques, vous aurez un cadre de données de taille 1000x100. Notez que ces 100 colonnes ont été générées uniquement par le vectoriseur de texte.
Pour les symboles et les notes, vous pouvez utiliser un encodage à chaud, qui vous donnera une autre trame de données (disons B). Ensuite, vous devez joindre A & B sur la clé commune pour obtenir votre trame de données finale si entrée. La clé commune ici sera l'ID de ligne (bien que lisez le commentaire suivant sur l'agrégation des données au niveau de l'utilisateur).
Il n'est pas clair si la colonne du nom d'utilisateur (compte) est unique dans les données? S'il y a 1000 lignes mais seulement 400 utilisateurs, cela signifie qu'il peut y avoir plus d'une ligne par utilisateur. Dans ce cas, vous pouvez envisager d'agréger les données au niveau de l'utilisateur (pour la colonne de texte, vous pouvez simplement concater toutes les chaînes pour le même utilisateur).