Wie tune eine MLPRegressor?
Moment habe ich einen Datensatz mit Variablen und Beobachtungen. Ich möchte, um vorherzusagen, eine variable (Nachfrage), die einen kontinuierlichen, damit ich eine Regression-Modell. Ich habe versucht, mit Linear Regression
, und bewertet es mit der R2
Metrik, etwa 0.85
. Ich wollte seine Leistung zu bewerten, mit anderen Modellen, und einer von Ihnen war der NNs
. Ich glaube, dass Neuronale Netze geeignet sind, in andere Aufgaben wie Klassifizierung, dennoch wollte ich Sie auszuprobieren.
Entschied ich mich für scikit-learn
vor allem, weil es bietet beide Modelle (Lineare Regression-und Multi-Layer-Perzeptron), die Sache ist die, dass die R2
Metrische war der Weg zu weit und schlecht im Vergleich zu der Linearen Regression ein. So kam ich zu dem Schluss, dass ich bin, fehlen viele wichtige Konfigurationen. Unten seht Ihr meinen code, und wie die Daten kommt.
Meine Daten hat die folgenden Spalten, nur demand
(das ist meine Bezeichnung), population
,gdp
, day
und year
sind numerische kontinuierliche, der rest sind kategorisch.
['demand','holy','gdp','population', 'day','year', 'f0', 'f1', 'f2', 'f3', 'f4','f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f20', 'f21', 'f22', 'f23', 'g0', 'g1', 'g2', 'g3', 'g4', 'g5', 'g6', 'g7', 'g8', 'g9', 'g10', 'g11']
Dies ist, was ich wirklich tun, ich entfernt einige Ausgänge.
import pandas as pd
import numpy as np
import math as math
from sklearn.linear_model import LinearRegression
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import r2_score
training_data, validation_data = np.split(data.sample(frac=1), [int(.8*len(data))])
linear_model = LinearRegression().fit(training_data[[c for c in data.columns if c != "demand"]], training_data[["demand"]])
validation_data_predictions = linear_model.predict(validation_data[[c for c in training_data.columns if c != "demand"]])
validation_predictions_pd = pd.DataFrame(data=validation_data_predictions,
index=validation_data.index.values,
columns=["prediction"])
# join both pandas
result_df = validation_data.join(validation_predictions_pd, how="inner")
r2_error = r2_score(y_true=result_df[["demand"]], y_pred=result_df[["prediction"]], multioutput="uniform_average")
print(r2_error) # outputs 0.85
# NN section
clf = MLPRegressor(hidden_layer_sizes=(10,), max_iter=100000)
neural_model = clf.fit(training_data[[c for c in training_data.columns if c != "demand"]], training_data[["demand"]])
validation_data_predictions = neural_model.predict(validation_data[[c for c in training_data.columns if c != "demand"]])
validation_predictions_pd = pd.DataFrame(data=validation_data_predictions,
index=validation_data.index.values,
columns=["prediction"])
result_df = validation_data.join(validation_predictions_pd, how="inner")
r2_error = r2_score(y_true=result_df[["demand"]], y_pred=result_df[["prediction"]], multioutput="uniform_average")
print(r2_error) # outputs 0.23
So, wie Sie sehen können, die NNs die performance ist sehr schlecht. Und ich denke, seine performance verbessert werden kann, irgendwelche Tipps?
- Alberto, könnten Sie bitte machen Sie Ihr Beispiel reproduzierbar? Definieren Sie die
data
Variablen, so dass andere kann Ihnen eine spürbare Hilfe. Prost!
Du musst angemeldet sein, um einen Kommentar abzugeben.
MLP-sensitive Funktion-Skalierung. Haben Sie normalzied Ihre Daten?
Ändern Sie Ihre Netzwerk-Struktur: fügen Sie weitere versteckte Schichten und ändern Sie die Anzahl von perceptrons jeder Schicht
ändern Aktivierung der Funktion sigmod/tanh/aufgrund der Kr usw.
learning_rate
,learning_rate_init
. 5. Toggleearly_stopping
Vielleicht nicht, dass die NN ' s performance schlecht ist, vielleicht sind Sie gerade mit der falschen Metrik für den Vergleich. In der Regel ist es nicht eine gute Idee, um das Vertrauen der R2-score für die Bewertung von linearen regressionsmodellen mit vielen Regressoren: in der Tat, je mehr Regressoren, die Sie setzen in Ihrem Modell, desto höher wird Ihr R-Quadrat (sehen Sie dieses video für eine kurze Erklärung).
Ja, ich denke diese Frage ist besser geeignet für https://stats.stackexchange.com/