web-dev-qa-db-fra.com

Pipeline Ordalencoder ValueRorror a trouvé des catégories inconnues

S'il vous plaît, prenez-le facilement sur moi. Je chante des carrières en sciences de la technologie et je n'ai pas de CS ou de plan de programmation - je pourrais donc faire quelque chose de profondément stupide. J'ai étudié pendant quelques heures sans succès.

Objectif: Obtenez un pipeline à fonctionner avec l'ordinalencodeur.

Problème: Le code ne fonctionne pas avec l'appel d'ordinalencoder. Il gère W/O ordinalencoder. Au mieux que je peux dire, je peux passer deux arguments, c.-à-d. catégories et DTYPE . Ni l'aide.

Je passe le public Diabetes Data défini sur le modèle. Est-ce le problème? Iow, c'est le passage des fonctionnalités de cardinalité élevées à l'ordinalencodeur, ce qui est construit un problème entre les données de train/test après la construction de modèles, c'est-à-dire une valeur de test qui ne fait pas de valeur que l'ensemble de train n'est pas?

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OrdinalEncoder
from sklearn.ensemble import RandomForestClassifier

pipe = Pipeline([
    ('imputer', SimpleImputer()),
    ('ordinal_encoder', OrdinalEncoder()),
    ('classifier', RandomForestClassifier(criterion='gini', n_estimators=100))])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# Construct model
model = pipe.fit(X_train, y_train)

# Show results
print("Hold-out AUC score: %.3f" %roc_auc_score(model.predict_proba(X_test),y_test))

Voici l'erreur que je reçois:

ValueError: Found unknown categories [17.0] in column 0 during transform

Qu'est-ce que je fais mal?

Installer:

The scikit-learn version is 0.20.2.
3.7.2 (v3.7.2:9a3ffc0492, Dec 24 2018, 02:44:43) 
[Clang 6.0 (clang-600.0.57)]
sys.version_info(major=3, minor=7, micro=2, releaselevel='final', serial=0)
6
Pablo Honey

Votre problème est que le modèle a rencontré une valeur dans les données de test qu'elle n'avait pas vue dans les données de formation. C'est bon. Vous devez juste ajouter l'argument 'gueufs_unknown' à votre encodeur.

Vous devriez fit codeurs et scopers aux données de formation (mais pas les données de test), puis utilisez-les sur transform des données de formation et de test. Ainsi, vous devez planifier la possibilité de valeurs inattendues dans les données de test.

2
Sam

Je ne pense pas que l'ordinalencoder est le bon choix dans cette situation. L'ensemble de données sur le diabète est composé de fonctionnalités continues, non de caractéristiques catégoriques. Comme indiqué dans la documentation pour OrdinalEncoder :

L'entrée de ce transformateur doit être une matrice d'entiers ou de chaînes, indiquant les valeurs prises par des fonctionnalités catégoriques (discrètes).

Cela étant dit sans une sortie supplémentaire de la traçabilité ou de votre configuration, je ne peux pas dire définitivement pourquoi vous obtenez l'erreur que vous avez faite. J'ai pu réussir à scinder et exécuter le code ci-dessus à l'aide des données chargées avec le load_diabetes fonction. À mon avis, je suppose que, dans votre cas, vous avez manqué d'ajuster l'encodeur avec la catégorie "17.0", mais je ne recommanderais à nouveau l'utilisation d'un codeur catégorique dans ce cas.

1
Grr

Je envisagerais de stocker les valeurs ordinales en tant que fichier JSON lors de la formation et de lire le même encodage lors du test. Toute nouvelle valeur entrant dans le jeu de données de test qui n'est pas observée doit être traitée avant de tester ou d'évaluer.

0
data_hacker

J'ai eu la même erreur lors d'une opération ColumnTransformer() Opération avec un "OneHoteenCoder ()" Je suppose que c'est parce que le codeur nécessite un tableau 2D pour être entré dans le codeur.

Vous pouvez essayer .apply(lambda x: [x]) ou une fonction similaire à vos valeurs ordinales pour augmenter leur conditionnalité.

0
Salt_from_the_Sea