Reshape und Group Array

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

__deets__ hat geschrieben: Montag 25. Februar 2019, 09:53Multi-Class heißt doch “ein sample gehört zu mehr als einer Klasse “.
Nein, Multi-Class heißt, dass das Sample zu einer von mehreren Klassen gehört. Wenn es zu mehreren Klassen gleichzeitig gehören kann, wird das Multi-Label genannt.
So wie ich das im Moment verstehe, liegen die Targets (y_true) in der Form 1, 2 bzw. 3 vor. Für eine Klassifikation macht es mehr Sinn, das in One-Hot Vektoren zu encoden, also [1 0 0], [0 1 0] und [0 0 1]. Dafür lassen sich dann auch einfach Loss-Funktionen schreiben. Die Form [153,] --> [153,3] würde auch dazu passen, also n_samples*n_classes, wie im ersten Post beschrieben.
Lizzy hat geschrieben: Samstag 23. Februar 2019, 10:25Dieser array a1 soll von folgender shape sein: n_classes * n_samples.
Wie das mit dem Encoding funktioniert, habe ich ja weiter oben schon verlinkt.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

@ArtooDetoo: Danke, ich werde das auch mal probieren. Logischerweise muss ich dann aber y_true auch encoden, sonst funktioniert die Subtraktion wieder nicht oder?

Warum es anders nicht geht ist mir immer noch ein Rätsel 😞
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Ja, y_pred und y_true müssen die gleiche Form haben.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Dann versteh ich nur nicht, wieso in der Beschreibung steht:

y_true : array-like of shape = [n_samples] The target values.
y_pred : array-like of shape = [n_samples] or shape = [n_samples * n_classes] (for multi-class task) The predicted values.

Da haben sie ja eben nicht die gleiche Form.

Oder ist das mit der gleichen Form nur die Voraussetzung für die Subtraktion, nicht für die Funktion an sich?
Das mit der Subtraktion habe ich selbst eingefügt, um eben zu berechnen ob ich falsch klassifiziert habe.


Ich habe nun y_pred encoded, und einfach in die Loss Funktionen eingesetzt (statt dem "normalen" y_pred). Am Ende kommt genau der selbe Fehler wie zuvor.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Abur du brauchst doch keine unterschiedliche Form, denn die ist doch dafuer, dass du mehrere Klassen *PRO SAMPLE* hast. Aber ja: dann sind natuerlich die shapes unterschiedlich wenn du so vorgehst, einmal (n,) und einmal (n*anzahl_klassen,), und das beisst sich mit der Subtraktion. Denn wieie willst du nun diese beiden unterschiedlichen Arrays sinnvoll voneinander subtrahieren?

Und was bringt dir die Subtraktion denn ueberhaupt? Was sind denn die Werte, und was kann da sinnvoll bei rumkommen, wenn man davon deren Klassen-Nummer subtrahiert?
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

__deets__ hat geschrieben: Montag 25. Februar 2019, 16:26Abur du brauchst doch keine unterschiedliche Form, denn die ist doch dafuer, dass du mehrere Klassen *PRO SAMPLE* hast.
Theoretisch braucht man das nicht, aber die Algorithmen, die darauf arbeiten brauchen das in der Regel schon. Sie würden nämlich dann implizit annehmen, dass Klasse 1 ähnlicher zu Klasse 2 ist als zu Klasse 3 und das möchte man normalerweise nicht.
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

__deets__ hat geschrieben: Montag 25. Februar 2019, 16:26Und was bringt dir die Subtraktion denn ueberhaupt? Was sind denn die Werte, und was kann da sinnvoll bei rumkommen, wenn man davon deren Klassen-Nummer subtrahiert?
Eine häufig verwendete Kostenfunktion (wenn auch nicht unbedingt bei Klassifikationsproblemen) ist der quadratic loss. Da wird beispielsweise die Differenz von y_pred und y_true gebildet.
Für Klassifikation bietet sich eher der cross entropy loss an.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ahhhh.... ok, das macht's klarer. y_pred sind also nicht die urspruenglichen Daten, sondern die bis dato erreichten Klassifikationsergebnisse, und y_true was ich vorgegeben haben. Verstanden. Wobei ich das trotzdem etwas komisch finde, denn damit wird ja irgendwie impliziert, das zwei Klassen, die numerisch nahe beeinander liegen, auch einen geringen Fehler haetten. Was ja nun ueberhaupt nicht der Wahrheit entsprechen wuerde.

So oder so: die Subtraktion kann nur auf gleichfoermigen Arrays passieren. Wenn Lizzy die fuer persoenliche Darstellungszwecke macht, muss darauf geachtet werden.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Das mit der Subtraktion war einfach ein erster Versuch, eine Fehlklassifizierung zu "bestrafen".
Da in meiner Loss Funktion auch noch ein anderer Wert bestraft werden soll (eine nicht-Einhaltung einer Nebenbedingung), habe ich das erstmal so formuliert.

Habt ihr noch eine Idee wie das mit der Gruppierung funktionieren könnte?:
For multi-class task, the y_pred is group by class_id first, then group by row_id.

Denn die Fehlermeldung mit den shapes bei der fit Methode besteht ja immer noch, obwohl y_pred und y_true jetzt die richtigen Shapes haben...
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich weiss nicht. Die Fehlermeldung die ich gesehen habe, da waren die shapes falsch. Wenn du immer noch die gleiche Fehlermeldung hast, dann sind sie das immer noch. Wenn du eine andere hast, dann bitte zeig die uns
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Die Fehlermeldung ist immer noch die mit den shapes...auch wenn ich sowohl y_pred als auch y_true encoded habe (beiden haben dann shape (153,3)

(und sogar die selbe wenn ich nur y_pred encode, y_true aber so lasse, wie es in der Funktion ja gefordert ist)
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Aber 153,3 ist doch nicht richtig. Die Beschreibung sagt doch, dass dann (153 * 3,) das shape sein soll. Also ein 459 Elemente langes, eindimensionales Array.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Achso, ich dachte das muss ein 153 langes dreidimensionales array sein, so wie es eben aussieht wenn ich y_pred encode...wie kann ich das denn dann wieder in ein eindimensionales umwandeln? Hat das was mit der geforderten Gruppierung zu tun? ( For multi-class task, the y_pred is group by class_id first, then group by row_id)
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, das ist doch in dem Link den ich gepostet habe so halbwegs zumindest erklaert. So wie ich das interpretiere ist das dann zB fuer 3 Klassen mit 4 Samples eben 12 Eintraege, in dieser Form:

Code: Alles auswählen

[0 1 1 0    0 0 0 1   1 0 0 1  0 0 0 1]
Wobei ich mir da auch nicht 100%ig sicher bin. Aber *willst* du ueberhaupt multiclass? Schien mir nicht so. Dann nimm doch einfach deine 153 Klassen als (153,)-shaped Array.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Naja wenn ich 3 Klassen habe ist es doch automatisch multiclass oder? Oder "reicht" es das y_pred einfach in der Form:
array([1, 2, 1, 2, 1, 1, 2, 2, 3, 2, 2, 2, 2, 1, 1, 2, 1, 2, 2, 2, 2, 2,
3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 1,
3, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 2, 1, 2, 3, 2, 2, 2, 2, 1, 1, 3,
1, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2,
1, 2, 2, 2, 1, 2, 1, 2, 2, 3, 2, 2, 1, 2, 2, 2, 3, 1, 2, 2, 1, 1,
2, 1, 3, 2, 2, 3, 2, 2, 2, 2, 1, 3, 1, 2, 3, 3, 2, 1, 1, 2, 2, 3,
2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 2, 1, 2, 3, 2, 2, 2, 2])

zu haben? Wenn die Loss Funktion nämlich die Form n_classes*n_samples verlangt sollte es so ja eigentlich nicht gehen?
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Beats me. Ich kenne dieses Lernverfahren nicht. Ich haette gedacht so geht das. Oder eben 153 Eintraege fuer Klasse 1, wo ueberall da, wo ein Sample zu 1 gehoert, eine 1 ist. Dann 153 fuer Klasse zwei, wo dann fuer jedes Sample das dazugehoert auch eine 1 ist. Und so weiter.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Das würde ich gerne noch ausprobieren...ist das quasi das hot encoding? Weil wenn ich das mache kommt ja erstmal ein array mit dem shape (153,3) raus
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nur dass dein Classifier das halt nicht schluckt, sondern *das* musst du dann re-shapen so das daraus eben (153*3, ) werden.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Ok probier ich, danke für die Hilfe!!
Antworten