Scikit-learn: Type d'étiquette inconnu de DecisionTreeClassifier : 'continuous-multioutput'

Créé le 31 oct. 2016  ·  18Commentaires  ·  Source: scikit-learn/scikit-learn

La description


DecisionTreeClassifier plante avec unknown label type: 'continuous-multioutput' . J'ai essayé de charger le fichier csv en utilisant csv.reader, pandas.read_csv et d'autres choses comme l'analyse ligne par ligne.

Étapes/Code à reproduire

from sklearn import tree
feature_df = pd.read_csv(os.path.join(_PATH, 'features.txt'))
target_df = pd.read_csv(os.path.join(_PATH, 'target.txt'))
feature_df = feature_df._get_numeric_data()
target_df = target_df._get_numeric_data()
feature_df = feature_df.fillna(0)
target_df = target_df.fillna(0)
clf = tree.DecisionTreeClassifier()
clf_o = clf.fit(feature_df, target_df)

fonctionnalités.txt
cible.txt

Résultats attendus


L'erreur lancée informe l'utilisateur de ce qui ne va VRAIMENT pas, que son ensemble de données ne suit pas les hypothèses (et quelles sont-elles)

Résultats actuels

Traceback (most recent call last):
  File "D:\Piotr\Documents\uni\bap\BAPFingerprintLocalisation\main.py", line 19,
 in <module>
    decision_tree.treeClassification()
  File "D:\Piotr\Documents\uni\bap\BAPFingerprintLocalisation\code\decision_tree
.py", line 56, in treeClassification
    clf_o = clf.fit(feature_df, target_df)
  File "C:\Python35\lib\site-packages\sklearn\tree\tree.py", line 182, in fit
    check_classification_targets(y)
  File "C:\Python35\lib\site-packages\sklearn\utils\multiclass.py", line 172, in
 check_classification_targets
    raise ValueError("Unknown label type: %r" % y_type)
ValueError: Unknown label type: 'continuous-multioutput'

Versions

Windows-10-10.0.14393-SP0
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)]
NumPy 1.11.0
SciPy 0.17.1
Scikit-Learn 0.18

Mettre à jour:

J'ai changé le nombre de variables cibles en une, juste pour simplifier les choses

clf_o = clf.fit(feature_df, target_df.ix[:,1])

Sortie : Unknown label type: 'continuous'

Commentaire le plus utile

Vous devriez utiliser DecisionTreeRegressor

Tous les 18 commentaires

Vous devriez utiliser DecisionTreeRegressor

Encore une fois, la documentation manque d'informations sur le nombre de classes que la classification peut gérer. Je peux voir que mon ensemble de données contient trop de classes, mais votre message d'erreur mentionnait quelque chose comme "étiquettes", ce qui était suffisamment déroutant pour oublier à quoi ressemblait réellement l'ensemble de données et se mêler des méthodes de transmission des ensembles de données.
J'ai mis à jour le problème et vous demande de le rouvrir.

Les cibles de classification doivent être représentées sous forme de nombres entiers ou de chaînes. Vous pouvez demander à Pandas de lire les données cibles sous forme de chaîne et tout ira bien.

Ou utilisez un DecisionTreeRegressor

Ce n'est pas mon problème

Voir la section "Résultats attendus" de mon problème

Vous avez raison de dire que le message d'erreur pourrait être plus utile, mais la documentation pour fit dit "étiquettes de classe dans la classification". N'hésitez pas à soumettre un problème plus clair sur la nécessité de documenter le type de données attendu pour la classification y s, et un autre pour générer des messages d'erreur appropriés lorsque des données flottantes sont transmises en tant que y à un classificateur.

Permettez-moi de citer toute la section de la documentation documentant le paramètre y de la fonction fit dans la classe DecisionTreeClassifier

Les valeurs cibles (étiquettes de classe en classification, nombres réels en régression). Dans le cas de la régression, utilisez dtype=np.float64 et order='C' pour une efficacité maximale.

Cela ne veut pas dire que les classes ont un plafond. Qu'est-ce qui rend une variable cible étiquetée continue ? Combien de classes doit-il y avoir pour être considéré comme une variable cible de type régression ? S'il parle de régression, puis-je faire une régression en utilisant DecisionTreeClassifier? Pourquoi pas? Etc...

Quant à votre commentaire précédent :

Les cibles de classification doivent être représentées sous forme de nombres entiers ou de chaînes. Vous pouvez demander à Pandas de lire les données cibles sous forme de chaîne et tout ira bien.

Cela signifie-t-il que les classes ne peuvent pas être représentées sous forme de flottants ? Ou en tant que dict? Listes? Tuples ? Long ? Double? octets ? Je sais qu'il est logique de représenter les classes sous forme d'entiers ou de chaînes, car elles ne devraient pas être nombreuses. Mais le doivent-ils ? Quelles sont les limites ?

Et pour ce qui est de créer un nouveau ticket, n'est-ce pas inutile puisqu'on a pas mal parlé ici ? Créer un nouveau ticket juste pour expliquer la même chose à un autre gars ?

Ce n'est pas le nombre de classes. C'est l'utilisation de non-entiers et de non-chaînes.

J'aime que les descriptions des problèmes soient ciblées. Votre préoccupation telle que soulevée ici
semblait être plus un problème d'utilisation.

Et s'il vous plait, ne me harcelez pas avec ce que je propose. Ce n'est pas le seul problème
j'ai affaire à.

Le 2 novembre 2016 à 00h24, Piotr Kamoda [email protected] a écrit :

Permettez-moi de citer toute la section de la documentation documentant le paramètre y de
fonction adaptée à la classe DecisionTreeClassifier

Les valeurs cibles (étiquettes de classe en classification, nombres réels en
régression). Dans le cas de la régression, utilisez dtype=np.float64 et order='C' pour
efficacité maximale.

Cela ne veut pas dire que les classes ont un plafond. Qu'est-ce qui fait qu'une variable cible
étiqueté continu? Combien de classes doivent être là pour être pris en compte
variable cible de type régression ? S'il parle de régression, puis-je faire
régression à l'aide de DecisionTreeClassifier ? Pourquoi pas? Etc...

Et pour ce qui est de créer un nouveau ticket, n'est-ce pas inutile puisque nous avons eu pas mal de
parler ici? Créer un nouveau ticket juste pour expliquer la même chose à un autre gars ?


Vous recevez ceci parce que vous avez modifié l'état d'ouverture/fermeture.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/scikit-learn/scikit-learn/issues/7801#issuecomment -257565248,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AAEz63zNA0Qc4lzgHttXx-4VFkJFwFaDks5q5z16gaJpZM4KlSFw
.

Vous n'avez pas à le résoudre aujourd'hui, j'essaie seulement de faire en sorte que le problème des mauvaises descriptions d'erreurs et de la mauvaise documentation sur le classificateur d'arbre et le régresseur devienne actif et une tâche pour les futures versions.

Pour le message d'erreur, "Type de sortie non pris en charge : 'continuous-multioutput'" serait-il préférable ? C'est le _vrai_ problème. Voir aussi #7809 pour la docstring.

C'est mieux. Mais je ne comprends toujours pas pourquoi vous ne le nommez pas comme il est. Parce que la littérature appelle principalement cela des variables «cibles», et la sortie peut être confondue avec la sortie de la fonction. Une exception a été levée à partir de la fonction 'check_classification_targets', donc même vous dites que c'est la variable 'target', et vous voulez toujours l'appeler 'label' ou 'output'. Je ne suis pas membre du membre scikit-learn, vous ferez donc comme bon vous semble, mais je vous recommande d'utiliser les mots "Variable cible" dans le doscstring et le message d'erreur. Et je vous demande de décrire n'importe où les règles que les données d'entrée (ou la cible) doivent suivre. Une courte phrase - 'La variable cible (paramètre y) doit être int ou str'.

Peut-être que cela vaut la peine de le mentionner dans/à côté de la nouvelle section (45cb11d / #7519)
sur l'ajustement multiclasse et multiétiquette dans le didacticiel. Ou peut-être tout cela
appartient à une section du guide de l'utilisateur sur les conventions de représentation des données,
décrivant les formats d'entrée/sortie pour toutes les méthodes standard... ?

Le 2 novembre 2016 à 20h56, Piotr Kamoda [email protected] a écrit :

C'est mieux. Mais je ne comprends toujours pas pourquoi tu ne le nommeras pas comme ça
est. Parce que la littérature appelle principalement cela des variables "cibles", et la sortie
pourrait être confondu avec la sortie de la fonction. Une exception a été levée à partir de la fonction
'check_classification_targets', donc même vous dites que c'est la variable 'target',
et vous voulez toujours l'appeler 'label' ou 'output'. je ne suis pas membre de
membre scikit-learn, vous ferez donc ce que bon vous semble, mais je recommanderais de
utilisez les mots 'Variable cible' dans le doscstring et le message d'erreur. Et je te demande
pour décrire n'importe où les règles que les données d'entrée (ou la cible) doivent suivre. UNE
phrase courte - 'La variable cible (paramètre y) doit être int ou str'.


Vous recevez ceci parce que vous avez modifié l'état d'ouverture/fermeture.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/scikit-learn/scikit-learn/issues/7801#issuecomment -257820087,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AAEz68AqYGWrP1C-BinLXGGHNt0VtV_qks5q6F5rgaJpZM4KlSFw
.

J'ai scanné le document et cela semble être un bon endroit pour mentionner ces conventions. De plus, si vous ne voulez pas trop obscurcir les messages d'erreur, l'idée de mettre ces informations dans le guide de l'utilisateur n'est pas mauvaise non plus.
Eh bien, la solution finale (le cas échéant) sera comme vous le souhaitez, je dis simplement que l'idée semble correcte, mais vous avez vos conventions. Je ne te ferai rien faire.

'La variable cible (paramètre y) doit être int ou str'. n'est pas correct, car nous prenons en charge les multi-étiquettes et multi-sorties multi-cibles

De plus, les objets arbitraires qui ne sont pas des flottants sont pris en charge en tant qu'étiquettes de classe, ils ne doivent pas nécessairement être des entiers ou des chaînes.

Si nous mettons comme imput training_data_X, training_scores_Y pour ajuster la méthode, cela provoque une erreur. Pour l'éviter, nous allons convertir et encoder les étiquettes

du prétraitement d'importation sklearn
à partir des utilitaires d'importation sklearn
lab_enc = preprocessing.LabelEncoder()
y_train = lab_enc.fit_transform(y_train)
imprimer(y_train)
print(utils.multiclass.type_of_target(y_train))
print(utils.multiclass.type_of_target(y_train.astype('int')))
print(utils.multiclass.type_of_target(y_train))

J'ai le même problème, y a-t-il un correctif ?

Cette page vous a été utile?
0 / 5 - 0 notes