Seite 1 von 1
Accuracy im Neuronalen Netz erhöhen
Verfasst: Dienstag 16. Juni 2020, 13:00
von Marvin93
Hallo alle zusammen,
Ich habe ein Neuronales Netz mit dem ich eine Klassifizierung einer gelabelten CSV Datei mit ca. 40 Features vornehmen möchte.
Der Datensatz ist leider sehr klein und ich schaffe es nicht die Accuracy zu erhöhen. Ich habe jetzt schon recht viel mit den Hyperparametern herumexperimentiert und mit der Netzstruktur usw. Es ist absolut möglich eine Trainingsaccuracy von 100% zu erreichen, aber bei der Test Accuracy komm ich einfach nicht höher. Trotz schrittweiser Vereinfachung des Models und Dropout.
Es handelt sich um drei Klassen und ich habe versucht alle drei Klassifizierungen in einem Netz zu realisieren, habe das ganze aber auch schon aufgesplittet. Sprich: 0 vs 1, 0 vs 2 und 1 vs 2. Ich bekomme auch gar nicht unbedingt diese klassischen Overfitting Kurven, die Accuracy steigt einfach sehr schnell an, bleibt dann aber so ziemlich konstant bei ca. 70% stehen bzw. 85% bei den binären Klassifizierungen. Die Daten sind per Hand erstellt und sicher nicht perfekt. Man wird damit keine 100% Accuracy erreichen können, ich habe aber schon auf 90% gehofft.
Hat hier irgendjemand eine Idee welche Maßnahmen helfen könnten? Ich dachte jetzt schon an Data Augmentation, was ja bei Bildern in der Regel gemacht wird, weiß aber nicht, ob das in diesem Fall möglich ist oder, ob ich damit einfach die Grenzen völlig verwische und die Accuracy nur durch Stärkung der Mittelwerte "künstliche pushe". Dachte vielleicht gibt es da eine intelligente Lösung über einen Autoencoder oder ähnliches, weiß aber auch nicht so recht wie man das angehen kann.
Hoffe mir kann jemand helfen und hat vielleicht eine schlaue Idee.
Gruß
Marvin
Re: Accuracy im Neuronalen Netz erhöhen
Verfasst: Dienstag 16. Juni 2020, 19:35
von ThomasL
Hallo Marvin,
wie viele Trainings und Testdaten hast du denn? "sehr klein" kann viel bedeuten

Und dann zeig doch mal deine Modeldefiniton in Code, arbeitest du mit Tensorflow oder Pytorch?
Re: Accuracy im Neuronalen Netz erhöhen
Verfasst: Mittwoch 17. Juni 2020, 20:06
von Marvin93
Also, ich hab eine ganze Reihe an Modellen ausprobiert. Also Layer und Neuronen erhöht und verringert usw. Und hatte auch völlig andere Herangehensweisen. Bin immer noch am lernen, sowohl was KI angeht, als auch normales Programmieren. Hier mal so der letzte Stand. Habe noch ein zweites Modell, was genauso aussieht, aber eine binäre Klassifizierung vornimmt. Und die rufe das dann über die main Funktion mehrmals auf mit verschiedenen Datensätzen. Hatte einen kleinen Datensatz der nochmal erweitert wurde und wollte das vergleichen usw. Denke wichtig ist nur dieser Teil hier. Ich habe 1200 Datensätze. Kann man das so sagen? Oder der Datensatz besteht aus 1200 Zeilen. Also bei 42 Spalten schon sehr wenig.
Code: Alles auswählen
def one_step():
model = Sequential()
model.add(Dense(50, input_dim=42, activation='relu'))
model.add(Dropout(rate=0.4))
model.add(Dense(100, activation='relu'))
model.add(Dropout(rate=0.4))
model.add(Dense(50, activation='relu'))
model.add(Dropout(rate=0.3))
model.add(Dense(25, activation='relu',))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
def learning(x,y,model):
epochs = 80
batch_size = 8
estimators = []
estimators.append(('standardize', StandardScaler()))
estimators.append(('mlp', KerasClassifier(build_fn=model, epochs=epochs, batch_size=batch_size, verbose=1)))
pipeline = Pipeline(estimators)
kfold = RepeatedKFold(n_splits=2, n_repeats=1)
results = cross_val_score(pipeline, x, y, cv=kfold)
return(results)
Re: Accuracy im Neuronalen Netz erhöhen
Verfasst: Mittwoch 17. Juni 2020, 21:02
von __blackjack__
@Marvin93: Habe keine Ahnung von Keras, daher nur eher oberflächliche Anmerkungen: Laut Dokumentation kann man `Sequential` schon beim erstellen Layers mitgeben. Dann spart man sich x mal ``model.add(…)`` zu schreiben. Selbst wenn man das nicht machen könnte, würde ich die Layers warscheinlich in eine Liste schreiben und in einer Schleife dem Model hinzufügen.
Die beiden `estimators.append()`-Aufrufe sind für Python ziemlich schräg. So etwas macht man in Sprachen wo es Listen oder einen vergleichbaren Datentyp keine Syntax für Literale von dem Typ gibt. Aber erst eine literale leere Liste hinschreiben um dann direkt danach einzelne Elemente hinzuzufügen statt gleich eine Liste mit diesen Elementen hinzuschreiben ist „unpythonisch“
Da wird auch extrem viel an Namen gebunden. Mindestens mal `epochs`, `batch_size`, `pipeline`, `kfolds` und `results` bringen dem Leser dabei keinen wirklichen Mehrwert weil man die Bedeutung entweder an den Schlüsselwortargumenten ablesen kann wo sie übergeben werden, oder an den Klassennamen. Bleibt nur `estimators`. Wenn man will kann man aber auch diesen Wert direkt an die Stelle der Verwendung schreiben. Da bleibt am Ende kein lokaler Name mehr übrig:
Code: Alles auswählen
def one_step():
model = Sequential(
[
Dense(50, input_dim=42, activation="relu"),
Dropout(rate=0.4),
Dense(100, activation="relu"),
Dropout(rate=0.4),
Dense(50, activation="relu"),
Dropout(rate=0.3),
Dense(25, activation="relu",),
Dense(3, activation="softmax"),
]
)
model.compile(
loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]
)
return model
def learning(x, y, model):
return cross_val_score(
Pipeline(
[
("standardize", StandardScaler()),
(
"mlp",
KerasClassifier(
build_fn=model, epochs=80, batch_size=3, verbose=1
),
),
]
),
x,
y,
cv=RepeatedKFold(n_splits=2, n_repeats=1),
)
Re: Accuracy im Neuronalen Netz erhöhen
Verfasst: Donnerstag 18. Juni 2020, 06:56
von tonikae
Wenn einem neuronalen Netz nur wenige Trainingsdatensätze zur Verfügung stehen,
kann man die Trainingsqualität mit "Dropouts" erhöhen.Das ist ein gängiges Standardverfahren.
Bei Dropouts werden in einer Trainingsepoche verschiedene Neuronen zufällig entweder
ganz ausgeschaltet oder mit Zufallswerten belegt.Damit erzwingt man eine größere
Trainingsvielfalt und reduziert das frühzeitige Overfitting.
Das kann dann zu einer Verbesserung der Trainingsqualität führen. Allerdings sollte man
es auch nicht übertreiben, weil es sonst zu einer Verfälschung der Ergebnisse(d.h. unrealistische
Trainingsgüten) kommen kann.
Re: Accuracy im Neuronalen Netz erhöhen
Verfasst: Freitag 19. Juni 2020, 11:57
von Marvin93
Vielen Dank für die Tipps. Der Code sieht so schon deutlich übersichtlicher aus. Ich bin halt noch am Lernen und die Art und Weise wie der Code aufgebaut ist, habe ich mir irgendwo rauskopiert und für mich etwas angepasst.
Das mit den Namen wusste ich. Ich hatte auch vor zum Beispiel die batch_size zu übergeben und das lernen dann mit unterschiedlichen Werten durchlaufen zu lassen. Also insgesamt alle möglichen Parameter anzupassen, um die beste Kombination zu finden. Da gibts zwar auch Funktionen die über die Pipeline funktionieren von sklearn und so, aber ja ich war mir noch nicht wirklich sicher wie ich das mache. Diese Art das zu programmieren habe ich mir wie gesagt zu großen Teilen von irgendwo herkopiert und für mich angepasst.
Aber stimmt schon. Die Namen sind unnötig und machen das Ganze nur unübersichtlich.
__blackjack__ hat geschrieben: Mittwoch 17. Juni 2020, 21:02
@Marvin93: Habe keine Ahnung von Keras, daher nur eher oberflächliche Anmerkungen: Laut Dokumentation kann man `Sequential` schon beim erstellen Layers mitgeben. Dann spart man sich x mal ``model.add(…)`` zu schreiben. Selbst wenn man das nicht machen könnte, würde ich die Layers warscheinlich in eine Liste schreiben und in einer Schleife dem Model hinzufügen.
Die beiden `estimators.append()`-Aufrufe sind für Python ziemlich schräg. So etwas macht man in Sprachen wo es Listen oder einen vergleichbaren Datentyp keine Syntax für Literale von dem Typ gibt. Aber erst eine literale leere Liste hinschreiben um dann direkt danach einzelne Elemente hinzuzufügen statt gleich eine Liste mit diesen Elementen hinzuschreiben ist „unpythonisch“
Da wird auch extrem viel an Namen gebunden. Mindestens mal `epochs`, `batch_size`, `pipeline`, `kfolds` und `results` bringen dem Leser dabei keinen wirklichen Mehrwert weil man die Bedeutung entweder an den Schlüsselwortargumenten ablesen kann wo sie übergeben werden, oder an den Klassennamen. Bleibt nur `estimators`. Wenn man will kann man aber auch diesen Wert direkt an die Stelle der Verwendung schreiben. Da bleibt am Ende kein lokaler Name mehr übrig:
Code: Alles auswählen
def one_step():
model = Sequential(
[
Dense(50, input_dim=42, activation="relu"),
Dropout(rate=0.4),
Dense(100, activation="relu"),
Dropout(rate=0.4),
Dense(50, activation="relu"),
Dropout(rate=0.3),
Dense(25, activation="relu",),
Dense(3, activation="softmax"),
]
)
model.compile(
loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]
)
return model
def learning(x, y, model):
return cross_val_score(
Pipeline(
[
("standardize", StandardScaler()),
(
"mlp",
KerasClassifier(
build_fn=model, epochs=80, batch_size=3, verbose=1
),
),
]
),
x,
y,
cv=RepeatedKFold(n_splits=2, n_repeats=1),
)
Re: Accuracy im Neuronalen Netz erhöhen
Verfasst: Freitag 19. Juni 2020, 12:04
von Marvin93
Ja, genau Dropouts habe ich ja schon drin. Momentan sehr große, habe damit aber auch schon etwas rumprobiert, auch mit kleineren
Die wirklich optimale Kombination aus Netzarchitektur und Dropout habe ich bestimmt noch nicht gefunden, aber denke da bin ich auf dem richtigen Weg.
Was ich jetzt schon öfters gelesen habe ist Regularisierung. Das ist in Keras ja auch relativ leicht umsetzbar. Damit muss ich mich aber noch weiter beschäftigen.
Ansonsten habe ich wie gesagt an Data Augmentation gedacht, aber keine wirkliche Vorstellung wie ich das umsetzen kann bzw. eben ob das für solche numerischen Datasets Sinn macht. Ich laufe ja Gefahr, dass ich dadurch einfach nur den Mittelweg extrem stärke und die Accuracy künstlich verbessere, die Grenzen aber verwische obwohl in der Praxis ja möglicherweise sehr viel mehr Werte an den Grenzen liegen als im Mittelpunkt. Ist halt bei über 40 Dimensionen schwierig sich das vorzustellen.
Kennst du sonst noch weitere Möglichkeiten? Oder hast eine Idee wie sich das umsetzen lässt?
tonikae hat geschrieben: Donnerstag 18. Juni 2020, 06:56
Wenn einem neuronalen Netz nur wenige Trainingsdatensätze zur Verfügung stehen,
kann man die Trainingsqualität mit "Dropouts" erhöhen.Das ist ein gängiges Standardverfahren.
Bei Dropouts werden in einer Trainingsepoche verschiedene Neuronen zufällig entweder
ganz ausgeschaltet oder mit Zufallswerten belegt.Damit erzwingt man eine größere
Trainingsvielfalt und reduziert das frühzeitige Overfitting.
Das kann dann zu einer Verbesserung der Trainingsqualität führen. Allerdings sollte man
es auch nicht übertreiben, weil es sonst zu einer Verfälschung der Ergebnisse(d.h. unrealistische
Trainingsgüten) kommen kann.