Scikit-learn: DecisionTreeClassifier unbekannter Labeltyp: 'continuous-multioutput'

Erstellt am 31. Okt. 2016  ·  18Kommentare  ·  Quelle: scikit-learn/scikit-learn

Beschreibung


DecisionTreeClassifier stürzt mit unknown label type: 'continuous-multioutput' ab. Ich habe versucht, die CSV-Datei mit csv.reader, pandas.read_csv und einigen anderen Dingen wie dem zeilenweisen Parsen zu laden.

Schritte/Code zum Reproduzieren

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)

features.txt
ziel.txt

erwartete Ergebnisse


Der ausgegebene Fehler informiert den Benutzer darüber, was WIRKLICH falsch ist, dass z. B. sein Datensatz nicht den Annahmen folgt (und welche sind das)

Tatsächliche Ergebnisse

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'

Versionen

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

Aktualisieren:

Ich habe die Anzahl der Zielvariablen auf eins geändert, nur um die Dinge zu vereinfachen

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

Ausgabe: Unknown label type: 'continuous'

Hilfreichster Kommentar

Sie sollten DecisionTreeRegressor verwenden

Alle 18 Kommentare

Sie sollten DecisionTreeRegressor verwenden

Auch hier fehlen der Dokumentation Informationen darüber, wie viele Klassen die Klassifizierung verarbeiten können. Ich kann sehen, dass mein Datensatz zu viele Klassen hat, aber Ihre Fehlermeldung erwähnte so etwas wie „Labels“, was verwirrend genug war, um zu vergessen, wie der Datensatz tatsächlich aussieht, und sich in Methoden zum Übergeben von Datensätzen einzumischen.
Ich habe das Problem aktualisiert und bitte Sie, es erneut zu öffnen.

Klassifikationsziele sollten als Ganzzahlen oder als Zeichenfolgen dargestellt werden. Sie können Pandas bitten, die Zieldaten als Zeichenfolge einzulesen, und es wird Ihnen gut gehen.

Oder verwenden Sie ein DecisionTreeRegressor

Das ist nicht mein Problem

Siehe Abschnitt „Erwartete Ergebnisse“ meiner Ausgabe

Sie haben Recht, dass die Fehlermeldung nützlicher sein könnte, aber die Dokumentation für fit sagt "Klassenbezeichnungen in der Klassifizierung". Fühlen Sie sich frei, ein klareres Problem bezüglich der Notwendigkeit, den erwarteten Datentyp für die Klassifizierung y s zu dokumentieren, und ein weiteres für das Auslösen entsprechender Fehlermeldungen einzureichen, wenn Float-Daten als y an einen Klassifikator übergeben werden.

Lassen Sie mich den gesamten Abschnitt der Dokumentation zitieren, der den Parameter y der Funktion fit in der Klasse DecisionTreeClassifier dokumentiert

Die Zielwerte (Klassenbezeichnungen in der Klassifizierung, reelle Zahlen in der Regression). Verwenden Sie im Fall der Regression dtype=np.float64 und order='C' für maximale Effizienz.

Das bedeutet nicht, dass Klassen eine Obergrenze haben. Was macht eine als kontinuierlich gekennzeichnete Zielvariable aus? Wie viele Klassen müssen vorhanden sein, um als Zielvariable vom Regressionstyp betrachtet zu werden? Wenn es um Regression geht, kann ich dann eine Regression mit DecisionTreeClassifier durchführen? Warum nicht? Etc...

Zu deinem vorigen Kommentar:

Klassifikationsziele sollten als Ganzzahlen oder als Zeichenfolgen dargestellt werden. Sie können Pandas bitten, die Zieldaten als Zeichenfolge einzulesen, und es wird Ihnen gut gehen.

Bedeutet das, dass Klassen nicht als Floats dargestellt werden können? Oder als Diktat? Listen? Tupel? Sehnsucht? Doppel? Bytes? Ich weiß, dass es logisch ist, Klassen als Ganzzahlen oder Zeichenfolgen darzustellen, da sie nicht viele sein sollten. Aber müssen sie das? Was sind die Einschränkungen?

Und was das Erstellen eines neuen Tickets angeht, ist das nicht nutzlos, da wir hier ziemlich viel geredet haben? Neues Ticket erstellen, nur um anderen dasselbe zu erklären?

Es ist nicht die Anzahl der Klassen. Es ist die Verwendung von Nicht-Ganzzahlen und Nicht-Strings.

Ich mag es, wenn die Problembeschreibungen fokussiert sind. Ihre Bedenken wurden hier geäußert
schien eher ein Nutzungsproblem zu sein.

Und bitte belästigen Sie mich nicht mit dem, was ich vorschlage. Dies ist nicht das einzige Problem
Ich beschäftige mich mit.

Am 2. November 2016 um 00:24 schrieb Piotr Kamoda [email protected] :

Lassen Sie mich den gesamten Abschnitt der Dokumentation zitieren, der den Parameter y von dokumentiert
Funktion passt in die Klasse DecisionTreeClassifier

Die Zielwerte (Klassenbezeichnungen in der Klassifizierung, reelle Zahlen in
Rückfall). Verwenden Sie im Fall der Regression dtype=np.float64 und order='C' for
maximale Effizienz.

Das bedeutet nicht, dass Klassen eine Obergrenze haben. Was macht eine Zielvariable aus
fortlaufend gekennzeichnet? Wie viele Klassen müssen vorhanden sein, um berücksichtigt zu werden
Regressionstyp Zielvariable? Wenn es um Regression geht, kann ich das tun
Regression mit DecisionTreeClassifier? Warum nicht? Etc...

Und was das Erstellen eines neuen Tickets betrifft, ist das nicht nutzlos, da wir ziemlich viel hatten
hier reinreden? Neues Ticket erstellen, nur um anderen dasselbe zu erklären?


Sie erhalten dies, weil Sie den Öffnungs-/Schließstatus geändert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/7801#issuecomment -257565248,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAEz63zNA0Qc4lzgHttXx-4VFkJFwFaDks5q5z16gaJpZM4KlSFw
.

Sie müssen es nicht heute lösen, ich versuche nur, das Problem der schlechten Fehlerbeschreibungen und der schlechten Dokumentation zu Baumklassifikatoren und Regressoren aktiv zu machen und zu einer Aufgabe für zukünftige Versionen zu machen.

Für die Fehlermeldung wäre "Nicht unterstützter Ausgabetyp: 'continuous-multioutput'" besser? Das ist das _eigentliche_ Problem. Siehe auch #7809 für den Docstring.

Das ist besser. Aber ich verstehe immer noch nicht, warum du es nicht so benennst, wie es ist. Weil die Literatur das meistens 'Ziel'-Variablen nennt und die Ausgabe mit der Funktionsausgabe verwechselt werden könnte. Die Ausnahme wurde von der Funktion „check_classification_targets“ ausgelöst, also sagen Sie sogar, dass dies die Variable „target“ ist, und Sie möchten sie dennoch „label“ oder „output“ nennen. Ich bin kein Mitglied von scikit-learn, also tun Sie, was Sie wollen, aber ich würde empfehlen, die Wörter „Zielvariable“ in doscstring und Fehlermeldung zu verwenden. Und ich bitte Sie, überall Regeln zu beschreiben, denen Eingabedaten (oder Ziel) folgen sollten. Ein kurzer Satz – „Zielvariable (Parameter y) muss int oder str sein“.

Vielleicht erwähnenswert in/neben dem neuen Abschnitt (45cb11d / #7519)
zu Multiclass- und Multilabel-Anpassung im Tutorial. Oder vielleicht das alles
gehört in einen Abschnitt des Benutzerhandbuchs zu Datendarstellungskonventionen,
Beschreibung von Ein-/Ausgabeformaten für alle Standardmethoden ...?

Am 2. November 2016 um 20:56 schrieb Piotr Kamoda [email protected] :

Das ist besser. Aber ich verstehe immer noch nicht, warum du es nicht so benennst
ist. Weil die Literatur das meistens 'Ziel'-Variablen und Ausgabe nennt
könnte mit Funktionsausgabe verwechselt werden. Eine Ausnahme wurde von der Funktion ausgelöst
'check_classification_targets', also sagen Sie sogar, das sei die 'target'-Variable,
und trotzdem wollen Sie es 'Label' oder 'Output' nennen. Ich bin kein Mitglied von
scikit-learn-Mitglied, Sie werden also tun, was Sie wollen, aber ich würde es empfehlen
Verwenden Sie die Wörter 'Zielvariable' in doscstring und Fehlermeldung. Und ich frage dich
um überall Regeln zu beschreiben, denen Eingabedaten (oder Ziel) folgen sollten. EIN
kurzer Satz - 'Zielvariable (Parameter y) muss int oder str sein'.


Sie erhalten dies, weil Sie den Öffnungs-/Schließstatus geändert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/7801#issuecomment -257820087,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAEz68AqYGWrP1C-BinLXGGHNt0VtV_qks5q6F5rgaJpZM4KlSFw
.

Ich habe das Dokument gescannt und es scheint ein guter Ort zu sein, um diese Konventionen zu erwähnen. Auch wenn Sie die Fehlermeldungen nicht zu sehr verschleiern möchten, ist die Idee, diese Informationen in das Benutzerhandbuch aufzunehmen, auch nicht schlecht.
Nun, die endgültige Lösung (falls vorhanden) wird so sein, wie Sie es wünschen. Ich sage nur, dass die Idee in Ordnung zu sein scheint, aber Sie haben Ihre Konventionen. Ich werde dich nicht zwingen, etwas zu tun.

'Zielvariable (Parameter y) muss int oder str sein'. ist nicht richtig, weil wir Multi-Label und Multi-Output-Multi-Target unterstützen

Außerdem werden beliebige Objekte, die keine Floats sind, als Klassenlabels unterstützt, sie müssen keine Integer oder Strings sein.

Wenn wir training_data_X, training_scores_Y als Input eingeben, um die Methode anzupassen, verursacht dies einen Fehler. Um dies zu vermeiden, konvertieren und codieren wir Labels

aus der sklearn-Importvorverarbeitung
von sklearn import utils
lab_enc = Vorverarbeitung.LabelEncoder()
y_train = lab_enc.fit_transform(y_train)
print(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))

Ich habe das gleiche Problem, gibt es eine Lösung dafür?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen