Obtenir ValueError: y contient de nouvelles étiquettes lors de l'utilisation de scikit learn LabelEncoder
J'ai une série comme:
df['ID'] = ['ABC123', 'IDF345', ...]
Je suis en utilisant scikit de LabelEncoder
pour le convertir en valeurs numériques sont alimentés dans le RandomForestClassifier
.
Au cours de la formation, je suis en train de faire comme suit:
le_id = LabelEncoder()
df['ID'] = le_id.fit_transform(df.ID)
Mais, maintenant à l'essai/de prédiction, lorsque je passe dans de nouvelles données, je veux transformer le 'ID' partir de ces données, basées sur le_id
c'est à dire, même si les valeurs sont présentes, puis de les transformer selon les au-dessus de l'étiquette de l'encodeur, autrement affecter une nouvelle valeur numérique.
Dans le fichier de test, je faisais comme suit:
new_df['ID'] = le_dpid.transform(new_df.ID)
Mais, j'obtiens l'erreur suivante: ValueError: y contains new labels
Comment puis-je résoudre ce problème?? Merci!
Mise à JOUR:
Donc, la tâche que j'ai est d'utiliser le ci-dessous (par exemple) que les données d'entraînement et de prédire le 'High', 'Mod', 'Low'
de valeurs pour les nouvelles BankNum, ID combinaisons. Le modèle doit apprendre les caractéristiques, où une "Haute" est donné, où un "Faible" est donné à partir de l'ensemble de données d'apprentissage. Par exemple, ci-dessous un "Haut" est donnée lorsqu'il y a plusieurs entrées avec le même BankNum et des Identifiants différents.
df =
BankNum | ID | Labels
0098-7772 | AB123 | High
0098-7772 | ED245 | High
0098-7772 | ED343 | High
0870-7771 | ED200 | Mod
0870-7771 | ED100 | Mod
0098-2123 | GH564 | Low
Et puis prévoir sur quelque chose comme:
BankNum | ID |
00982222 | AB999 |
00982222 | AB999 |
00981111 | AB890 |
Je suis en train de faire quelque chose comme ceci:
df['BankNum'] = df.BankNum.astype(np.float128)
le_id = LabelEncoder()
df['ID'] = le_id.fit_transform(df.ID)
X_train, X_test, y_train, y_test = train_test_split(df[['BankNum', 'ID'], df.Labels, test_size=0.25, random_state=42)
clf = RandomForestClassifier(random_state=42, n_estimators=140)
clf.fit(X_train, y_train)
- Si vous voulez faire la
fit_transform()
dans un programme et de faire letransform()
dans un autre programme, veuillez cocher cette réponse, stackoverflow.com/questions/28656736/...
Vous devez vous connecter pour publier un commentaire.
Je pense que le message d'erreur est très clair: Votre ensemble de données de test contient
ID
étiquettes qui n'ont pas été inclus dans votre ensemble de données de formation. Pour ces éléments, leLabelEncoder
ne pouvez pas trouver une valeur numérique pour le représenter. Il ya quelques façons de résoudre ce problème. Vous pouvez soit essayer d'équilibrer votre ensemble de données, de sorte que vous êtes sûr que chaque étiquette n'est pas seulement présente dans votre test, mais aussi dans vos données d'entraînement. Sinon, vous pouvez essayer de suivre l'une des idées présentées ici.L'une des solutions possibles est, que vous pouvez rechercher par le biais de votre jeu de données au début, obtenir une liste de tous unique
ID
valeurs, de former leLabelEncoder
sur cette liste, et de garder le reste de votre code, tout comme il est pour le moment.Une autre solution possible est de vérifier que les données de test ont uniquement des étiquettes qui ont été observées dans le processus de formation. Si il y a une nouvelle étiquette, vous devez vous affectez-lui une valeur de repli comme
unknown_id
(ou quelque chose comme ça). Doin cela, vous mettez toutes les nouvelles, inconnuesID
s dans une classe; pour cela, les éléments de la prédiction va échouer, mais vous pouvez utiliser le reste de votre code comme il est maintenant.ID
valeurs sont (plus ou moins) unique, alors vous ne pouvez pas utiliser leLabelEncoder
à résoudre votre tâche.ID
s sont plus ou moins aléatoires, il n'y a aucun moyen de résoudre ce problème. S'il est utile à l'interprétation de ces valeurs, vous pouvez essayer de coder leID
caractère par caractère dans un nouveau multi-dimensionnelle vecteur d'entrée et d'utiliser cette. La pureLabelEncoder
technique n'est pas utile pour cette tâche. Est uniquement destinée à remplacer la même chaîne plus et plus avec un entier.vous pouvez essayer la solution de "sklearn.LabelEncoder avec du jamais vu "valeurs" https://stackoverflow.com/a/48169252/9043549
Le truc, c'est de créer le dictionnaire avec des classes, que la carte de la colonne et de remplir de nouvelles classes avec une certaine "valeur"