Prognose von schulischen Leistungen

Sie haben ein bestimmtes Projekt zu bearbeiten und wissen nicht, wie Sie an die Aufgabe heran gehen sollen? Sie sind sich nicht sicher, ob Ihr Netzentwurf zu Ihrem Problem passt oder ob es da Optimierungsmöglichkeiten gibt? Ist es überhaupt sinnvoll an Ihre Daten mit einem NN basierten Ansatz heranzugehen? Ist MemBrain das richtige Werkzeug für Ihr Problem und Ihre Infrastruktur?

Hier ist der richtige Platz für diese Art von Fragen.
Joe
Posts: 8
Joined: Fri 24. Feb 2017, 12:36

Prognose von schulischen Leistungen

Post by Joe »

Hallo zusammen und lieber Herr Jetter,
mit großer Freude haben wir Ihr Programm gefunden, dass uns einen wirklich schnellen Einstieg und erste Erfolge ermöglicht hat. In unserem Projekt wollen wir das Ergebnis einer Ausbildung prognositizieren. Hierfür stehen uns demografische Variablen - Alter, Geschlecht, Staatsbürgerschaft, Schulausbildung etc - sowie Leistungsdaten zur Verfügung. Manche Variablen sind nominal skaliert - Geschlecht, besuchte schule, etc - und andere ordinal - bisherige Noten, Menge der nicht bestandenen Tests, etc. Je nach Variablenauswahl können wir ziwschen 10 und 28 Inputvariablen einwerfen. Das Ergebnis ist mit 0 oder 1 für Bestehen oder Abbruch angegeben. Uns liegen etwa 6.500 Fälle vor, die wir in 5000/1500 in Lern- und Testdaten unterteilt haben. Auf Basis der demografischen Kriterien erreichen wir eine Genauigkeit von etwa 66% und unter Einbezug der Leistungsdaten etwa 83% zum ersten und 95% zum letzten Zeitpunkt. Letzteres ist aber ohne praktischen Belang, da hier der Abbruch/Abschluss bereits stattgefunden hat.

Frage 1 Netzaufbau:
Getestet wurden 1 hidden Layerschicht mit neuronen in gleicher Anzahl wie Inputneuronen, ein Netz mit 10 HL-Neuronen und ein 2 HL-Netz mit 10 in der ersten und 5 in der zweiten Schicht. Alle Netze sind nur mit der darunter liegenden Schicht verknüpft. Das 10x5 Netz war den anderen in der Genauigkeit schwach überlegen. Gibt es hier noch weitere sinnhafte Strukturen?

Frage 2 Variablenauswahl:
Ist es sinnvoll die Menge an Variablen um die nicht signifikanten zu reduzieren oder regelt das Netz das?

Frage 3 normalisieren:
Der Output ist mit 0 und 1 bereits normalisiert. Die Inputvariablen sind es nicht. Eine Fehlermeldung erhalten wir nicht. Auch ein Test, in dem wir einmal händisch normalisierten ergab keine Interschiede. Ist das richtig so?

Frage 4 Einstellunge
Alles weitere steht auf Voreinstellung. Die Neuronen auf logistik, der teacher auf Prob (cascade haben wir such mal ausprobiert, taugt auch). Gibt es hier noch Optimierungspotential?

Frage 5
Netzgenauigkeit: hierzu laden wir die Testdatei - in der keine Ergebnisse stehen - zeichnen "think on lesson" auf, exportieren den output und ermitteln die genauigkeit durch gegenüberstellung in excel. Geht das uU einfacher?

Liebe Grüße und guten Karneval
Jo
User avatar
TJetter
Posts: 341
Joined: Sat 13. Oct 2012, 12:04

Re: Prognose von schulischen Leistungen

Post by TJetter »

Hallo und herzlich WIllkommen im Forum!
Joe wrote:Gibt es hier noch weitere sinnhafte Strukturen?
Das allerwichtigste ist die Qualität der Daten und dass den Daten tatsächlich Zusammenhangsregeln zu Grunde liegen. Man erreicht dann mit vielen verschiedenen Netzstrukturen recht schnell recht gute Ergebnisse. Es gibt jedoch schon meist eine Struktur, die am besten funktioniert. Sehr gut bewährt sich meist eine Struktur von zwei Hidden-Schichten, typischerweise ein Viertel bis die Hälfte der Input-Neuronenzahl in der ersten Hidden-Schicht, noch ein mal etwas weniger Neuronen in der zweiten Hidden-Schicht. Dann von der ersten Hidden-Schicht auf das Output-Neuron Links ziehen, die die zweite Hidden-Schicht überspringen. Ich kann nicht sagen warum, aber ich erreiche damit meist die besten Ergebnisse. Dabei auf die Validierungsergebnisse achten (Pattern, die nicht zum Trainingsdatensatz gehören). Wenn der Fehler bzgl. der Trainingslesson besser wird, die Validierung aber schlechter, dann 'lernt das Netz auswendig'. Das liegt dann i.d.R. an einer zu höhen Mächtigkeit des Netzes. Also Links bzw. Neuronen entfernen. Wird schon der Trainingsdatensatz nicht gut erlernt, dann ist etweder das Netz nicht komplex genug, oder aber die Daten sind aus Sicht des Netzes widersprüchlich und dadurch schlecht erlernbar. Triviales Beispiel: Ein NN kann nicht gleichzeitig "1+1 = 2" und "1+1 = 0" erlernen. Es wird sich 'in die Mitte setzen', um den geringsten Fehler zu machen und 1+1=1 erlernen.
Joe wrote:Ist es sinnvoll die Menge an Variablen um die nicht signifikanten zu reduzieren oder regelt das Netz das?
Wenn ausreichend viele Muster zur sinnvollen Abdeckung des Datenraums zur Verfügung stehen, dann stören zusätzliche Inputs nicht. Das Netz wird sie ignorieren, wenn sie nicht zum Lernen beitragen. Bei zu wenigen Mustern wird bei vielen Inputs der mögliche Eingangsdatenraum allerdings nicht ausreichend abgedeckt. Dann kann es sein, dass das Netz sich an unwichtigen Inputs festmacht, weil diese gerade dabei helfen, die Trainingsdaten gut zu erlernen. Wenn diese Inputs aber keinen inhaltlichen Bezug zum Output haben, dann wird sich in der Validierung zeigen, dass das Netz die falschen Regeln erlernt hat.
Ein typisches Beispiel ist so etwas wie eine Seriennummer oder Aktikelnummer oder Bestellnummer oder Datenbank-ID o.ä. Ein solcher Input ist für jedes Pattern unterschiedlich und erlaubt somit dem Netz sehr schön 'auswendig zu lernen'. Bei der Validierung mit untrainierten Pattern geht das dann natürlich in die Hose. Solche Inputs sollte man also grundsätzlich nicht verwenden.
Dazu muss man diese Inputs übrigens nicht aus den Daten entfernen, i.d.R. möchte man eine solche ID ja bei den Daten behalten. Es genügt, den Output-Port des zugehörigen Input-Neurons nicht anzuschließen, also keine Links von dort zu anderen Neuronen zu verlegen. Damit wird der Input beim Training automatsisch ignoriert.
Joe wrote:Der Output ist mit 0 und 1 bereits normalisiert. Die Inputvariablen sind es nicht. Eine Fehlermeldung erhalten wir nicht. Auch ein Test, in dem wir einmal händisch normalisierten ergab keine Interschiede. Ist das richtig so?
Ja, das ist richtig so. Seit Version 07.00.00.00 hat die Aktivierungsfunktion 'IDENTICAL' einen unlimitierten Wertebereich. Diese wird standardmäßig für Input-Neuronen verwendet. Man kann die Normalisierung trotzdem verwenden, wenn man erzwingen möchte, dass das Neuron am Output entsprechend anders skalierte Werte in das Netz einspeist. I.d.R. ist das aber nicht notwendig bzw. sinnvoll. Andere Aktivierungsfunktionen limitieren die Aktivität der Neuronen, z.B. IDENT -1 TO 1.
Vor Version 07.00.00.00 war das anders, man musste immer darauf achten, dass die Inputs innerhalb der Normalisierungsgrenzen lagen bzw. MemBrain hat gewarnt, wenn sie das nicht taten.
Joe wrote:Alles weitere steht auf Voreinstellung. Die Neuronen auf logistik, der teacher auf Prob (cascade haben wir such mal ausprobiert, taugt auch). Gibt es hier noch Optimierungspotential?
Nein, für die hier beschriebene Aufgabe ist das genau das Richtige, vor allem auf jeden Fall bei RPROP als Teacher bleiben, da kommt i.d.R. kein anderer Algorithmus ran. Man kann mit einem handgetunten Beckprop-Algorithmus vielleicht noch ein Quentchen raus holen, aber die Parameterwahl ist hier nicht ganz einfach. Eine Testoption ist noch mit (teilweise) auf TAN-HYP eingestellten Neuronen in den Hidden-Schichten oder der Output-Schicht zu arbeiten. Hier kommt es meiner Erfahrung nach sehr auf die Daten an, welche Aktivierungsfunktion besser funktioniert, LOGISTIC oder TAN-HYP.
Joe wrote:Netzgenauigkeit: hierzu laden wir die Testdatei - in der keine Ergebnisse stehen - zeichnen "think on lesson" auf, exportieren den output und ermitteln die genauigkeit durch gegenüberstellung in excel. Geht das uU einfacher?
Die ideale Vorgehensweise ist bestimmt ein Skript, das die Vorgänge automatisiert, siehe hier:
viewtopic.php?f=13&t=232
Händisch geht es am besten so:

- Netz laden und ggf. Randomize ausführen (wenn das Netz vor dem Trainieren alles vergessen soll)
Im Lesson Editor:
- die Trainingslesson als Lesson Nummer 1 laden
- Die Validierungs- bzw. Test-Lesson als Lesson Nummer 2 laden
- Das Häkchen bei 'Set Manually' unterhalb der Pfeiltasten für 'Net Error Lesson' setzen (rechts oben im LE)
- Die Net Error Lesson auf 2 einstellen
- Die 'Currently Edited (Training) Lesson auf 1 einstellen
- Training starten
- Net Error Viewer und Pattern Error Viewer öffnen
- Der Net Error Viewer zeigt jetzt gleichzeitig den Trainings- und den Validierungsfehler
- Im Pattern Error Viewer kann man umschalten, welche Daten man aktuell sehen möchte (Trainings- oder Validierungslesson)
- Training stoppen, wenn der Netzfehler stagniert
- Im Lesson Editor den Button 'Export Validation...' verwenden, um die gerade sichtbare Lesson zu exportieren. Dabei werden sowohl Soll- als auch Istdaten exportiert, so dass sich in Excel o.ä. direkt damit arbeiten lässt. Diesen Button gibt es erst seit MemBrain 07.03.00.00, also ggf. vorher aktualisieren.

Viel Erfolg weiterhin und Grüße
Thomas Jetter
Joe
Posts: 8
Joined: Fri 24. Feb 2017, 12:36

Re: Prognose von schulischen Leistungen

Post by Joe »

Lieber Herr Jetter,
Ganz herzlichen Dank für Ihren wahnsinnig engagierten Support! Und wenn man sich durch das Forum liest, ist das offenbar schon seit Jahren so! Hut ab!
Uns haben Sie mit Sicherheit drei Monate Einarbeitung in R gespart. Vor allem mussten wir aufgrund der schnellen Erfolge nie auf Verdacht arbeiten und mussten nie befürchten Projektzeit zu verbrennen.

Ich verknüpfe einmal in meinem Voll-Variablen-Set im 10x5 Layout die Inputneuronen zusätzlich direkt mit der zweiten Schicht und teste das... mit dem Skript. Dannach spiele ich einmal mit tan-hyp. Ich werde berichten!

Liebe Grüße und Alaaf
Jo
User avatar
TJetter
Posts: 341
Joined: Sat 13. Oct 2012, 12:04

Re: Prognose von schulischen Leistungen

Post by TJetter »

Und ein dreifach donnerndes Helau! ;)

Viel Erfolg!
Thomas Jetter
Joe
Posts: 8
Joined: Fri 24. Feb 2017, 12:36

Re: Prognose von schulischen Leistungen

Post by Joe »

ach ja... Helau... es gab neben dem Karneval ja auch Fasching ;-)

Wasserstandsmeldung:
Membrain geupdatet. Skript funktioniert wunderbar, verkürzt das Testen stark. Toller Tipp, danke!
Ich habe verschiedene Layouts im Vollsetting (29 Variablen) mit 5.000 Fällen angelernt und mit 1.300 Fällen getestet. Die Genauigkeit über alles schwankt je nach Layout zwischen zwischen 82% und 84,7%. Getestet wurden einschichtige mit 5-20 Hidden-layer-Neuronen und zwischichtige mit 10x5 und 13x3. Am Besten hat ein einschichtiges Layout mit 12 bzw. 13 Neuronen funktioniert. Eine Reduktion der Variablen bei gleichem Layout hat die Genauigkeit verringert (evtl. bedarf es dann eines anderen Layouts).

Wichtig ist, dass wir nicht nur die Genauigkeit über alles im Blick haben - Abschluss/Abbruch - sondern insbesondere die Abbrecher. In allen Tests wurden bisher die Absolventen besser erkannt, als die Abbrecher. Oder anders, trotz akzeptabler Genauigkeit über alles (80-85), wurden von 414 Abbrecher von 1.300 Testfällen nur so 60-70% richtig erkannt. Da aber gerade diese unterstützt werden sollen, ist das eigentlich der wichtigere Wert. Insbesondere bei der Genauigkeit der Abbrecher, zeigten sich relativ starke Unterschiede in der Genauigkeit je nach Layout. Während ein 10x5 nur 266 Abbrecher identifiziert, findet ein 12x0 von 414 Abbrechern 294.

Wir spielen einmal weiter und berichten.
User avatar
TJetter
Posts: 341
Joined: Sat 13. Oct 2012, 12:04

Re: Prognose von schulischen Leistungen

Post by TJetter »

Danke für das tolle Feedback und schön, dass hier weiter berichtet wird!

Wenn der Datensatz deutlich mehr Erfolge als Abbrüche enthält, dann tendiert das Netz im Zweifelsfall mehr zum Erfolg (was ja auch der Statistik entspricht). Es versucht eben, insgesamt den geringsten Fehler zu machen. Es weiß ja nicht, dass die Abbrecher wichtiger sind. Dem kann man auf zwei Arten begegnen:
1.) In etwa gleich viele Abbrecher und Erfolge zum Training verwenden
2.) Die Entscheidungsschwelle in der Auswertung entsprechend der Statistik verschieben, also im Zweifelsfall eher für 'Abbrecher' entscheiden, als für Abschluss. Das halte ich eigentlich für den besseren Ansatz, da keine Daten willkürlich ausgeschlossen werden.

Wird es damit besser?
Thomas Jetter
Joe
Posts: 8
Joined: Fri 24. Feb 2017, 12:36

Re: Prognose von schulischen Leistungen

Post by Joe »

Mit der Option zwei habe ich ein wenig experimentiert. Ja, durch verschieben der Schwelle - bspw. zu 0,65 - lässt sich die Abbrecheridentifikation (erkannte Abbrecher / alle Abbrecher) zulasten der Genauigkeit [korrekte Prognose / (Abbrecher + Absolventen)] verbessern. Hier gilt es die Schwelle zu finden, die das "Überwarnen" in akzeptablem Rahmen hält und gleichzeitig eine schöne Abbrecheridentifikation ermöglich. Das Verhältnis zwischen den zu unrecht identifizierten und der Abbrecheridentifikation ist dabei nicht linear. So weit so gut. Dummerweise verändert sich das alles mit jedem einzelnem Layout. So ist die Genauigkeit bei einem 13x0 höher als bei einem 10x0, dafür aber auch bestimmter. Es existieren im 13x0 deutlich weniger Fälle zwischen 0,1 und 0,9. Damit reagiert ein 13x0 weit weniger schön auf eine Verschiebung der Schwelle als ein 10x0 oder ein 15x5. Das macht die Layouts schwer vergleichbar, ist mir ein wenig testen aber ganz gut in den Griff zu bekommen.

zu der veränderung der Daten: ja, da hatte ich auch schon drüber nachgedacht. Das Überpräsentieren der Abbrecher könnten wir dadurch erreichen, dass wir laufende Kurse, die in den letzten drei Jahren begonnen haben, mit in die Daten aufnehmen. Die Absolventen können noch nicht fertig sein, aber es sind Abbrecher enthalten. Das würde gleichzeitig die Lern/Testdaten vermehren, wäre aber eigentlich eine mutwillige Verzerrung.

Wir testen weiter und berichten.

By the way: tan hyp ist der Neuronen-Einstellung "logistic" in unserem Fall deutlich unterlegen.

Liebe Grüße und guten Start in die Woche
Jo
User avatar
TJetter
Posts: 341
Joined: Sat 13. Oct 2012, 12:04

Re: Prognose von schulischen Leistungen

Post by TJetter »

Joe wrote:Das Überpräsentieren der Abbrecher könnten wir dadurch erreichen, dass wir laufende Kurse, die in den letzten drei Jahren begonnen haben, mit in die Daten aufnehmen. Die Absolventen können noch nicht fertig sein, aber es sind Abbrecher enthalten. Das würde gleichzeitig die Lern/Testdaten vermehren, wäre aber eigentlich eine mutwillige Verzerrung.
Das erscheint mir keine gute Option, nein. Und zwar deshalb, weil dem Netz dann alle, die noch im Kurs sind als Absolventen vorgegaukelt werden, obwohl gar nicht sicher ist, dass sie das auch sein werden.

Mit ist noch ein anderer Gedanke gekommen, weiß aber nicht, ob der wirklich taugt, wäre interessant zu sehen, wie es sich auswirkt: Alle Abbrecher mehrmals in die Lesson aufnehmen. Aber nur in die Trainingslesson, aufpassen, dass keine Dubletten in die Validierung geraten, dort dürfen ja nur untrainierte enthalten sein.
Damit würde man keine Daten verfälschen, aber das Netz dazu nötigen, die Abbrecher besser zu erlernen.
Joe wrote:By the way: tan hyp ist der Neuronen-Einstellung "logistic" in unserem Fall deutlich unterlegen.
Ja, das beobachte ich auch oft, aber nicht immer. Auch hier habe ich keine Erklärung. Haben Sie auch einmal mit unterschiedlicher Steilheit der Aktivierungsfunktionen gearbeitet? Lässt sich pro Neuron auf dem Karteireiter 'Customize Activation Functions' der Neuroneneigenschaften einstellen.

Viele Grüße,
Thomas Jetter
Joe
Posts: 8
Joined: Fri 24. Feb 2017, 12:36

Re: Prognose von schulischen Leistungen

Post by Joe »

Nur auf alle Schnelle:
Das mit der Aktivierungsfunktion werde ich mir ansehen! Klingt vielversprechend!

Zu dem Gedanken des Überpräsentierens: wir wollten das Netz nur mit Daten derer füttern, die die Ausbildung verlassen haben. Laufende Auszubildene aufzunehmen - iSv wer noch nicht abgebrochen hat, wirds schaffen - hatten wir erwogen, aber verworfen. Wir wollten jetzt die Begrenzung der Jahrgängen auf Zeiträume vor 2014 aufheben. Damit werden aus den Jahrgängen nach 2014 ausschließlich Abbrecher aufgenommen, da deren Kohorte noch laufen. Damit werden nur reale Fälle aufgenommen, aber das Verhältnis aus Absolventen und Abbrecher verfälscht. Hier mag ich mal testen, ob es sich dergestalt verfälscht, dass es schlussendlich richtiger wird. In diesem Zusammenhang hab ich auch über das nachgedacht, was Sie schrieben "im zweifel für die absolventen". Ja, das erscheint mir sehr logisch. Es wird einige Cluster geben, deren Variablen überwiegend gleich sind und deren Outcome etwa dem durschnittlichem Abbruchniveau entspricht. Und hier überwiegen (glücklicherweise) die Absolventen. Wenn nun ein Probant mit diese Variablen aufläuft, wird das Netz einen hohwahrscheinlichen Abschluss prognostizieren. Die in dem Fall eigentlich erklärenden Variablen - bspw Elternhaus, Motivation, Identifikation mit den Ausbildungsinhalten, etc - liegen nicht vor.

Ich hoffe morgen wieder ein bisschen testen zu können. Dann gibts auch ein Update.

Liebe Grüße und danke!
Joe
Posts: 8
Joined: Fri 24. Feb 2017, 12:36

Re: Prognose von schulischen Leistungen

Post by Joe »

So, guten Morgen zusammen,
wie versprochen hier die frischesten Ergebnisse. Spannenderweise habe ich unterwegs noch ein besser funktionierendes Layout gefunden: Doppellayer mit 28 Inputneuronen, 15x8 hiddenlayer, 1 Output, ohne überspringende Verbindungen. Im Vergleich zu meinem bisherigen Favoriten 13x0 (also keine zweite Hiddenlayer) ergibt sich:

Genauigkeit über alles (richtige Fälle/n) im 13x0 von 83,07% und 15x8 von 83,85%
Erreichungsgrad Abbrecher (identifizierteAbbrecher/alleAbbrecher) im 13x0 von 65,22% und 15x8 von 67,45%
Warneffizienz (richtige Identifikation/alle Identifikationen) im 13x0 von 78,72% und 15x8 von 80,56%

Das klingt jetzt erstmal gar nicht sooo viel, aber im Vergleich werden hierdurch von 414 Abbrechern im Testdatensatz 10 Abbrecher mehr erreicht und gleichzeitig 6 falsche Warnungen weniger ausgesprochen.

Weiterhin habe ich die Idee des Überpräsentierens durch Hinzunahme der Abbrecher aus laufenden Kohorten getestet. Eine Überpräsentation ist das insofern, als dass hierdurch die Abbrecherquote sich nun aus Absolventen aus bspw 5 Jahrgängen, zu Abbrecher aus bspw 8 Jahrgängen zusammensetzt. Teilnehmer im laufenden Betrieb werden nicht betrachtet. Beabsichtigt war, dass bei gleichen Clustereigenschaften, die Identifikation im Zweifel ein wenig gen Abbruch verschoben wird. Gleichwohl sind es reale Fälle die eingespielt werden und die Datengrundlage hat sich bedeutend erhöht. Der Lerndatensatz hat sich von 5.130 auf 6.864 und der Testdatensatz von 1283 auf 1.717 erhöht. Im Vergleich zwischen einem 15x8 mit "fertigen" Kohorten und einem 15x8 mit allen Kohorten:

Genauigkeit über alles (richtige Fälle/n) "fertige" von 83,85% und "alle" von 83,68
Erreichungsgrad Abbrecher (identifizierteAbbrecher/alleAbbrecher) "fertige" von 67,45% und "alle" von 75,00%
Warneffizienz (richtige Identifikation/alle Identifikationen) "fertige" von 80,56% und "alle"von 81,37%

Insbesondere der Erreichungsgrad hat einen tollen Sprung gemacht. Von 414 Abbrecher (zur Vergleichbarkeit umgerechnet) wurden zuvor 279 identifiziert, jetzt sind 311. Und das bei einer besseren Warneffizienz. (Die mit betrachtet werden muss, da ansonsten ein Setting, dass alle warnt, mit einen Erreichungsgrad von 100% das attraktivste Setting wäre).

Wenn im 15x8 aller Kohorten jetzt noch bei 0,6 oder 0,65 die Identifikation in der Auswertung verschoben wird, so können von 664 Abbrechern (vorher 414, jetzt größerer Datensatz) mit 656 Warnungen 507 Abbrecher korrekt erreicht werden. Es sind also etwa 150 "Fehl"warnungen in Kauf zu nehmen.

Was wurde noch getestet:
Das verschieben der Aktivierungsfunktion der Outputneurone hatte keinen positiven Effekt. Standard ist 3, getestet wurden 0,1; 0,5; 1; 2 und 4.

Für den Datensatz aller Kohorten wurden noch verschiedene Layouts - mit schlechterem Ergebnis - getestet: 17x11; 17x8, 15x11, 13x8, 13x0, Verbindungen zwischen Inputneuronen und zweiter hiddenlayer, Verbindungen zwischen Input und zweiter HL sowie erster HL und Outcome und Wegnahme verschiedener Variablen. (danke für den Tipp mit der Wegnahme der Verbindung, so trivial, so zeitsparend).

Ich denke, damit schließe ich die Testerei der Netze erstmal und wir überlegen einmal, wie wir den Input noch um aussagekräftige Variablen erweitern können.

Vielen Dank für das überragende Engagement und die tolle Hilfe!

Liebe Grüße
Jo
Post Reply