• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

IT-Talents.de Code Competitions

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
Ich habe angefangen ein ganz einfaches Neuronales Netz mit zwei Layern zu implementieren. Das übersetzen der ganzen Werte in Zahlen war erstmal ne ganze Menge Tipparbeit...
Jetzt habe ich allerdings ein Problem mit Python:
[src=python]def sigmoid(x, derive=False):
if derive:
return x*(1-x)
return 1/(1 + np.exp(-x))[/src]
Wenn ich da mein numpy-Array reinwerfe kriege ich IMMER ein RuntimeWarning: overflow encountered in exp.
Dabei habe ich zuerst mein Array mit normalen Werten befüllt gehabt (also Werte zwischen 0 und irgendwas Richtung 1500). Da ich gedacht habe, dass da vielleicht ein Problem bei besteht, habe ich mein Array dann Spaltenweise normalisiert - also nur noch Werte zwischen 0 und 1. Immernoch der gleiche Fehler. Derzeit weiß ich da leider nicht weiter. Hat da jemand anderes einen Tipp für mich?

EDIT:
Wenn ich den Fehler einfach ignoriere, dann setzt er entsprechende Werte automatisch auf 0, was auch richtig ist, da lim(1/large) gegen 0 geht.

Mit meinem 2-Layer Netzwerk kriege ich von insgesamt 15221 Trainingsdatensätzen nur 1781 falsche Ergebnisse. Das entspricht einer Genauigkeit von 88,29%.
Dabei habe ich alle Werte wie sie in dem Datensatz sind genommen und jeweils durchnummeriert (nach einer Sortierung der Werte von mir).
Mein Trainingdurchlauf war nur EIN MAL über den Datensatz. Mehrfaches drüberlaufen hat keine Verbesserung mehr gebracht (habe ich etwa was falsch gemacht?).

Nächste Idee (1):
Ein weiteres Layer einführen. Dadurch könnte sich schon die Komplexität positiv für mich auswirken.

Nächste Idee (2):
Andernfalls wollte ich vielleicht noch sowas wie die Zeiten etwas komprimieren und zum Beispiel auf Stunden runden oder beispielsweise aus den Lichtverhältnissen oder der Wetterlage mehrere Input-Parameter machen, da dort ja mehrere Informationen drinstecken, die in dem Text derzeit einfach zu komprimiert verschlüsselt sind, um dies effektiv in Zahlen abbilden zu können.

Ein Problem, dass ich allgemein sehe mit der Durchnummerierung von den Text-Werten: Ich nutze nur eine Funktion, die effektiv Zahlen miteinander multipliziert. Allerdings wären bei diesem Problem vermutlich auch Ungleichungen sinnvoll. Also sowas wie 'Wert > 0,5 ? 1: 0' oder so. Allerdings nicht bei allen Parametern.

Komplexe Idee (3):
Ich habe mir überlegt die Daten aus einem Datensatz weiter aufzuteilen. beispielsweise möchte ich alles was mit dem Wetter zu tun hat in ein Array extrahieren (beachte (2)) und so weiter. Diese Arrays möchte ich dann nicht in ein gemeinsames Layer werfen, sondern in voneinander getrennte Layer, damit ich bis zum nächsten Layer dann verschiedene Aktivierungsfunktionen für die Neuronen nutzen kann. Anschließend würde ich die Ergebnisse dieser Operationen wieder zu einem weiteren Layer zusammenführen und von dort aus ein Ergebnis bestimmen lassen.
Leider habe ich aktuell die Befürchtung, dass dabei mein Können überschritten wird. Das Aufbauen der Layer und Gewichte ist dabei nicht das Problem. Das ist Tipparbeit aber nicht übermäßig schwierig. Ich denke aber, dass ich es nicht hinkriegen würde, die Fehlerkorrektur, also das eigentliche Lernen, da vernünftig einzubauen. Möchte sich jemand mit mir Zusammentun und da einmal drüber quatschen?
 
Zuletzt bearbeitet:

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.519
Geil.
Wenn irgend geht mache ich diesmal auch mit.
Muss nur noch diese eine kleine Sache A und B machen. Und C. Aber diesmal könnte es wirklich, wirklich sein, dass ich Gelegenheit habe :-D.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.592
  • Thread Starter Thread Starter
  • #383
Guten Morgen,

ich hab keine Ahnung was ihr da tut, aber macht weiter! ;)

Neurale Netze und Machine-learning sind mir persönlich zu komplex, als das ich dass verstehen könnte... aber ich wünsche euch allen viel Erfolg bei der Competiton! :)

Und Danke @ MingsPing dass du die Challenge hier bekannt gegeben hast und @Roin fürs "ausführlich machen". :T
 

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
@theSplit:
So kompliziert sind Neuronale Netze und Machine-Learning eigentlich gar nicht.
Es ist im Endeffekt nur Matritzenrechnung, die dir sowas wie Python mit numpy größtenteils abnimmt.

Eine schöne Erklärung mit ein paar Codezeilen als Beispiel habe ich mal verlinkt.
Da fehlt allerdings der Teil mit dem selbst optimieren. Das habe ich aus einem anderen Tutorial übernommen.
Dennoch würde ich mich wie oben in dem Spoiler geschrieben, über etwas Hilfe bei meinem komplexen Ansatz freuen.
 

MingsPing

NGBler

Registriert
15 Juli 2013
Beiträge
347
Konnte leider noch kaum was implementieren :(.
Finde es auch nervig, dass Fehler in den Daten sind (bzw. sie auch nicht einheitlich sind), sehe es wie du @Roin, im Real-Life muss man damit natürlich rechnen, aber bei ner Competition mit nem kleinen Zeitrahmen, wo es eigentlich um was anderes geht... .
Vielleicht komm ich am WE bissl dazu.
 

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
@BurnerR: Hattest du zufällig schon eine Gelegenheit zum Ausprobieren?
@MingsPing: Konntest du inzwischen schon irgendwas zusammen tickern?

Ich bin weiterhin nicht weiter gekommen. Ich habe da ein zwei-Layer Netzwerk. Muss allerdings noch das mit dem Ausgeben der Datei schreiben und bestenfalls das Netzwerk irgendwie speichern / laden können.
Ich weiß allerdings nicht, ob ich dafür noch Zeit finde. Könnte also sogar sein, dass ich nicht rechtzeitig abgeben kann.
 

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
Ich habe eben nochmal 10 Minuten gefunden. Ich kann jetzt mein Netzwerk speichern, laden und auch ein Ergebnis ausgeben lassen.
Problem: Ich kriege IMMER Unfallschwere 1 raus, ich vermute mal, da ist das Netwerk von mir einfach extrem dumm...

--- [2018-09-22 15:33 CEST] Automatisch zusammengeführter Beitrag ---

Selbst mit einem 3Layer Netwerk (12->24->3) komme ich IMMER nur auf Ergebnis von 1 (leichter Verletzung)

--- [2018-09-22 15:47 CEST] Automatisch zusammengeführter Beitrag ---

Noch eine Info: Wenn ich versuche auf nur ein Output-Neuron zu gehen kriege ich eine Genauigkeit von gerade mal 10% hin.. Irgendwas mache ich wohl falsch. Zudem: Normalerweise trainiert man die Netzwerke, indem man mehr als 1 Mal die Daten draufwirft. Komischerweise bin ich nach dem ersten Durchlauf aber bereits auf meiner Endgenauigkeit. Danach verändert sich nichts mehr...


Ich kriege bereits nach der Ersten Wiederholung 13495 Treffer für die Trainingsdaten. Aber irgendwie... Keine Ahnung was ich da flasch gemacht habe. Anscheinend habe ich die Daten so normalisiert, dass die automatisch auf "leichte Verletzung" eingestellt werden, egal was die Input-Daten später sagen.

Das Netzwerk lernt einfach "leicht passt voll oft. Das nehme ich jetzt immer". Ist ja nicht so dumm, aber hilft mir leider genau gar nicht.

--- [2018-09-22 17:21 CEST] Automatisch zusammengeführter Beitrag ---

Ich habe auch unterschiedliche Input-Varianten versucht. Wenn ich die Daten weiter aufsplitte ändert sich am Ergebnis einfach mal genau nix.
Das beste Ergebnis erlange ich mit 3 Output-Neuronen. Allerdings sagen die dann immer, egal was reinkommt, dass es eine leichte Verletzung ist. Ich versteh den Fehler leider auch nicht.
Größtes Problem könnte die minimal approximierte Aktivierungsfunktion sein. Aufgrund von großen Zahlen (trotz Normierung auf 1...) kachelt da sonst alles ab und bekommt overflow-Fehler. Deswegen habe ich bei Zahlen, die gegen 0 tendieren würden, bei der Berechnung, auf 0 approximiert. Aber ob es wirklich daran liegt?
 
Zuletzt bearbeitet:

MingsPing

NGBler

Registriert
15 Juli 2013
Beiträge
347
Hey,

ich hab es zumindest mal geschafft, eine Umgebung zu basteln, die die Daten aufbereitet.
Jetzt muss ich also "nur noch" ein geeignetes NN-Layout wählen und es laufen lassen.
Bin mal gespannt, wie viel Zeit dieses "nur noch" benötigen wird... . Heute schaffe ich es nicht mehr. Hoffentlich unter der Woche oder noch am kommenden WE.

@Roin: Da ich keine Ahnung von NN habe, kann ich Dir leider nicht wirklich helfen. Aber, dass sich Dein NN schon nach dem ersten Durchlauf nicht mehr verändert ist schon seltsam.
Da es viel öfter leichte/mittlere Verletzungen gibt, wird wohl das NN falsch trainiert. Wie gesagt, ich kenn mich nicht aus, aber vielleicht kannst Du da an den Bias-Werten herumschrauben. Ich meine auch gelesen zu haben, dass man den Trainingsdaten so ne Art "Wichtigkeit" mitgeben kann, da könntest den Trainingsdaten mit Label "3" ne hohe Wichtigkeit verpassen.
Und zu Letzt: Meine Input-Neuronen sind nun viel mehr als 12. Habe sowas wie "Bodenbeschaffenheit" aufgesplittet, pro Item ein eigenes Neuron, also quasi
0 trocken
0 nass / feucht
1 Schnee
0 Überflutung
falls der Datensatz "Schnee" als Bodenbeschaffenheit hatte.
Sinn dahinter: wenn man die irgendwie normiert und dann 0-0.2 = trocken, 0.2-0.4 = nass etc., dann entsteht (künstlich) eine Ordnung, bzw. ein Zusammenhang, der ggf gar nicht vorhanden ist. Noch besser ersichtlich bei "Unfallklasse".

Viel Spaß weiterhin :)

--- [2018-09-23 14:17 CEST] Automatisch zusammengeführter Beitrag ---

Und jetzt hab ich erstmal Urlaub.

Ist doch perfekt! ;-)
Leg los, die Zeit reicht noch.
 

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
Ich habe das Zwischenzeitlich auch mal vollkommen aufgesplittet und am Ende 40 Neuronen etwa gehabt, die als Input dienen. Aber nach meiner Implementierung lernt der da einfach genau eine Runde und dann verändert sich effektiv nichts mehr. Und nach meinem Ansatz (ich benutze ja kein Tensorflow oder so) habe ich auch keinen Bias und auch keine Gewichtung für die seltenen Ereignisse.

Das werde ich wohl bei der Abgabe anmerken. Aber derzeit sieht es einfach so aus, als wenn ich da gewaltig was falsch gemacht habe.
Ich wüsste aber auch nicht, wie ich das besser hinkriegen sollte.

Wirklich mehr Zeit werde ich da nun auch nicht reinwerfen. Ist halt keine gute Lösung. Vielleicht können die mir ja sagen, was ich da so falsch gemacht habe. Vielleicht habe ich da auch nur eine einzelne Berechnung falsch gemacht ...

Bin ein wenig gefrustet davon. Aber wie gesagt, die Zeit ist es mir aktuell einfach nicht wert.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.592
  • Thread Starter Thread Starter
  • #391
@Roin: Ich meine du solltest ne Nacht oder zwei drüber schlafen, vielleicht fällt dir dann ne Lösung ein für das Problem, aus Erfahrung kann ich sagen, etwas Abstand zu einem Problem hilft ab und an, weil man dann aus dem "alten Denken" etwas herauskommt. Ehrlich ;)

Ich könnte auch mal etwas versuchen, Zeit habe ich aktuell auch etwas, nur hab ich halt "0" (in Worten Null) Ahnung von Neuralen Netzen oder den entsprechenden Bibliotheken und Tools oder wie man so etwas aufbaut.

Ich glaube mit Python ist ja Scipy (+- Pandas) führend in dem Bereich. Aber vielleicht kann man da auch etwas eigenes machen? Ich bin etwas überfragt und unterschätze vermutlich die Komplexität ein wenig von sowas.... aber nen Versuch wäre es wert. :)
 

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
@theSplit: Ich warte mit der Abgabe bis ein oder zwei Tage vor Schluss, aber ich bin wenig zuversichtlich. Ich habe das mit dem Lernen bereits ganz zu Anfang festgestellt, aber keine Lösung bisher gefunden.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.592
  • Thread Starter Thread Starter
  • #393
Erst mal ein Plot* (mit Hinweis zu den Zahlen!) um die "grobe" Verteilung zu sehen:



*Bisher erfolgt dabei keine Unterteilung des Straßenklasse nach "Gefahrenzone", ähnlich auch bei den Lichtverhältnissen, Bodenbeschaffenheit und Zeit, wie auch Fahrzeugtyp und Wetterlage oder Uhrzeit - die sind zwar vorhanden und entsprechend belegt, aber die Schlüssel haben noch keine Gewichtung in irgendeiner Form.
Alle anderen Daten sind soweit "geeicht" auf dem Plot.

Was ich jetzt noch versuchen wollen würde, die Schlüssel die jetzt noch fehlen in Grade zu unterteilen - heißt "Bundesstraße" = 4, "Landesstraße" = 3 usw... bis die Schlüssel alle eine "Wertigkeit" haben, damit diese ausgewertet werden können nach "Schweregrad" oder "Bedingung".
Wobei anzumerken ist, vielleicht ist es gar nicht so wichtig dass so zu machen, im Grunde reicht schon die Information des "Durchschnitts", "Standards", "Minimum", und "Maximum" um dann die entsprechenden Schüssel "zu positionieren". Das könnte aber auch nach hinden losgehen das automatisch zu "Punkten", da nicht gesagt ist das "Schnee" oder "Nass / Feucht" einmal niedriger Wert (leichter) oder höheres Aufkommen von Unfällen (schwerer) ergibt. Könnte sein, muß nicht.

Muß mir dazu noch Gedanken machen :)

Edit:


Scheint ich habe 'perfekte' Vorhersagen:

Einmal eine ConfusionMatrix und eine Aufschlüsslung:

Ergebnis mit den Testdaten (überblick Unfallschwere):
 
Zuletzt bearbeitet:

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
Wie bereits zuvor erwähnt hat mein Code leider irgendwo einen Fehler was das eigentliche Lernen betrifft. Ich bin da auch ganz anders rangegangen als theSplit.
Ich habe dennoch mal meine Lösung eingereicht. Zwar mit entsprechendem Kommentar, dass da was kaputt ist aber vielleicht können die mir ja sagen, wo das Problem ist.
Ich würde natürlich gerne nach dem Abgabetermin eine Lösung von euch sehen. Mein Code ist ziemlich chaotisch und wird auf nahezu keinem Gebiet überhaupt über 3/10 Punkten kommen. Allerdings habe ich auch keine Zeit mehr auf refactoring oder sonstiges verwendet. Ich habe rumprobiert, um den Code zu fixen, war dabei allerdings nicht erfolgreich und entsprechend gefrustet.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.592
  • Thread Starter Thread Starter
  • #395
So, ich muss doch nochmal korrigieren, das Ergebnis wäre für den ersten Anlauf auch zu perfekt (Danke @Roin für den Hinweis! :T)

Da ich mir mit meiner Vorhersage nicht sicher war, habe ich nun etwas mehr ausprobiert.

Ein Algorithmus kommt schon relativ gut dabei weg und es gibt folgende Score auf die Testdaten:
[src=python]# 15k Einträge Datensatz mit Testdatensatz "gegengeprüft":
Results: 12138 hits, 3083 miss (79.75% score)

# Die Predictions
{1.0: 13620, 2.0: 256, 3.0: 1345}

# Korrekt Treffer im Datensatz
{1: 12092, 2: 37, 3: 9}[/src]

Knappe 80% Trefferquote, schon nicht schlecht für den Anfang, aber das muß ja noch nichts heißen... aktuell benutze ich "default" einstellungen.
Ich wollte zwar noch individuell das Gewicht auf die Spalten (Columns) legen, aber irgendwie scheitere ich just noch daran.

Aktuell nutze ich sk.learn. - Falls also jemand nen Tip hat wie man "class_weigths" setzt, nur her damit ;)
 

MingsPing

NGBler

Registriert
15 Juli 2013
Beiträge
347
So, hab's auch mal geschafft, das ganze umzusetzen.

Hab die Daten in
- 13000 Trainingsdaten
- 2221 Testdaten
aufgeteilt.

Mit den Trainingsdaten wurde nun ein erstes Netzwerk trainiert.

Das Netzwerk angewandt auf die Trainingsdaten:
[src=powershell]
Von 11519 leichten Unfaellen richtig vorhergesagt: 11474 Prozent: 99.609344
Von 1388 mittleren Unfaellen richtig vorhergesagt: 183 Prozent: 13.184438
Von 93 schweren Unfaellen richtig vorhergesagt: 19 Prozent: 20.430107
Genauigkeit gesamt: 89.815384
[/src]

Jedoch auf die Testdaten angewandt nur:
[src=powershell]
Von 1976 leichten Unfaellen richtig vorhergesagt: 1953 Prozent: 98.83603
Von 230 mittleren Unfaellen richtig vorhergesagt: 8 Prozent: 3.4782608
Von 15 schweren Unfaellen richtig vorhergesagt: 0 Prozent: 0.0
Genauigkeit gesamt: 88.293564
[/src]

Mir gefällt nicht, dass die schweren/mittleren Unfälle kaum erkannt werden (vor allem in den Testdaten sehr schlecht, und da ist's ja eigentlich wichtig...). Ist wohl der Grund, den ich oben schon mal als Antwort auf @roin genannt habe.
Mal gucken, ob/wie ich das noch verbessern kann.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.592
  • Thread Starter Thread Starter
  • #397
@MingsPing: Mal eine Frage, hast du "Zufällig" 2000 Samples ausgewählt die du testest, oder sind das einfach die letzten "2000" ?

Wenn ich dir einen Tip geben kann (so viel glaube ich schon zu wissen :p ) - Trainiere dein Netzwerk mit allen 15k Einträgen. Danach, greifst du 2000 Samples raus, entweder zufällig oder zum testen einen festen Ausschnitt.

Es kann theoretisch sein, das in den letzten 2000 Samples wichtige Trainingsdaten enthalten sind bzw. Konstellationen der Daten - die dir ansonsten fehlen.
Deshalb, ruhig mit 100% Trainieren, und dann einfach X rausgreifen die man vorhersagen will.

Ich habe es so gemacht, ich habe zum Beispiel die Testdaten einmal verdoppelt um 0.5 zu üben und 0.5 zu prognostizieren bzw. zu validieren, also die gleichen Daten nochmal.
 

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
So. Die Abgabe ist rum.
Hier mal mein bisschen Code.

Wie bereits erwähnt vermutlich fehlerhaft. Zudem nicht wirklich gut kommentiert oder aufgeräumt. Das wäre passiert, sobald alles funktioniert.
Anhang anzeigen Abgabe.rar
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.592
  • Thread Starter Thread Starter
  • #400
Na gut, dann will ich auch mal....

Python 3 + Pandas + Sklearn + Numpy + Matplotlib
 

Anhänge

  • ml_theSplit.py3.7z
    2,8 KB · Aufrufe: 251
Oben