Neuronales Netz für Mehrfachausgangsregression

21

Ich habe einen Datensatz mit 34 Eingabespalten und 8 Ausgabespalten.

Eine Möglichkeit zur Lösung des Problems besteht darin, die 34 Eingaben zu verwenden und für jede Ausgabespalte ein individuelles Regressionsmodell zu erstellen.

Ich frage mich, ob dieses Problem mit nur einem Modell, insbesondere mit Neural Network, gelöst werden kann.

Ich habe Multilayer-Perceptron verwendet, aber das erfordert mehrere Modelle, genau wie die lineare Regression. Kann Sequenz zu Sequenz eine praktikable Option sein?

Ich benutze TensorFlow. Ich habe Code, aber ich denke, es ist wichtiger zu verstehen, was ich in Bezug auf die Multilayer-Perzeptrontheorie verpasse.

Ich verstehe, dass in MLP, wenn Sie einen Ausgangsknoten haben, es einen Ausgang liefern wird. Wenn Sie 10 Ausgabeknoten haben, handelt es sich um ein Problem mit mehreren Klassen. Sie wählen aus den 10 Ausgaben die Klasse mit der höchsten Wahrscheinlichkeit aus. Aber in meinem Fall wird es mit Sicherheit 8 Ausgänge für denselben Eingang geben.

Nehmen wir an, Sie erhalten für eine Reihe von Eingaben die 3D-Koordinate von etwas (X, Y, Z). Wie, Inputs = {1,10,5,7} Output = {1,2,1}. Für die gleiche Eingabe {1,10,5,7} muss ich Modelle für den X-Wert, den Y-Wert und den Z-Wert erstellen. Eine Lösung besteht darin, 3 verschiedene Modelle mit MLP zu erstellen. Aber ich würde gerne sehen, ob ich ein Modell haben kann. Also dachte ich über seq2seq nach. Da der Encoder eine Reihe von Eingaben und der Decoder eine Reihe von Ausgaben bereitstellt. Es scheint jedoch, dass seq2seq in tensorflow keine float-Werte verarbeiten kann. Ich kann mich jedoch irren.

sjishan
quelle
Sie scheinen Probleme mit dem Verständnis des Multilayer-Perceptron-NN-Modells und mit TensorFlow zu haben - Ihre Aussagen dazu sind falsch. Es ist jedoch nicht klar, warum Sie dieses Missverständnis haben, was bedeutet, dass eine Antwort Ihnen nicht helfen kann, dies zu beheben. Das Vorhersagen von z. B. 8 Regressionsausgaben in einem einzelnen NN-Modell ist in den meisten NN-Frameworks trivial einfach. In Ihrem Fall sind keine Sequenzen erforderlich. Daher denke ich, dass es wichtig sein kann, nachzulesen, worauf Ihr letzter Absatz basiert, um Ihnen zu helfen. Können Sie ein paar Details von dem hinzufügen, was Sie gesehen oder versucht haben, um zu diesen Gedanken zu gelangen?
Neil Slater
Könnten Sie eine Antwort geben, wie Sie mit einem einzigen NN-Modell 8 Regressionsausgaben erhalten? Vielen Dank.
Sjishan
Wahrscheinlich, wenn Sie ein paar Dinge erklären, indem Sie Ihre Frage bearbeiten: 1) In welchem ​​Rahmen? 2) Was ist Ihr Code (oder Design, wenn Sie noch keinen Code haben)? 3) Was hindert Sie daran, dies selbst zu tun? Ich brauche 1 und 2, um mit etwas zu antworten, das du benutzen kannst. Ich brauche 3, um zu verstehen, was Ihr Problem ist und die Lösung zu erklären.
Neil Slater
1. Tensorflow. 2. Ich habe Code, aber ich denke, es ist wichtiger zu verstehen, was ich in Bezug auf die Multilayer-Perzeptrontheorie verpasse. Ich verstehe, dass in MLP, wenn Sie einen Ausgangsknoten haben, es einen Ausgang liefern wird. Wenn Sie 10 Ausgabeknoten haben, handelt es sich um ein Problem mit mehreren Klassen. Sie wählen aus den 10 Ausgaben die Klasse mit der höchsten Wahrscheinlichkeit aus. Aber in meinem Fall wird es mit Sicherheit 8 Ausgänge für denselben Eingang geben. Lassen Sie mich ein anderes Beispiel zeigen, sagen wir, für eine Reihe von Eingaben erhalten Sie die 3D-Koordinate von etwas (X, Y, Z). Wie, Inputs = {1,10,5,7} Output = {1,2,1}
sjishan
Für die gleiche Eingabe {1,10,5,7} muss ich Modelle für den X-Wert, den Y-Wert und den Z-Wert erstellen. Eine Lösung besteht darin, 3 verschiedene Modelle mit MLP zu erstellen. Aber ich würde gerne sehen, ob ich ein Modell haben kann. Also dachte ich über seq2seq nach. Da der Encoder eine Reihe von Eingaben und der Decoder eine Reihe von Ausgaben bereitstellt. Es scheint jedoch, dass seq2seq in tensorflow keine float-Werte verarbeiten kann. Ich kann mich jedoch irren.
Sjishan

Antworten:

14

Was Sie beschreiben, ist eine normale multidimensionale lineare Regression. Diese Art von Problem wird normalerweise mit einem Feedforward-Netzwerk, entweder MLP oder einer anderen Architektur, die der Art des Problems entspricht, gelöst.

Jedes neuronale Netzwerk-Framework kann so etwas tun.

Der Schlüssel dazu ist, sich daran zu erinnern, dass die letzte Ebene lineare Aktivierungen haben sollte (dh überhaupt keine Aktivierung).

Entsprechend Ihren Anforderungen ist die Form der Eingabeebene ein Vektor (34,) und die Ausgabe (8,).

Update: Die bei Regressionsproblemen übliche Verlustfunktion ist der mittlere quadratische Fehler (MSE). Hier ist ein Beispiel für eine mehrdimensionale Regression mit Keras . Das Netzwerk ist kein MLP, aber es sollte in Ordnung sein, um die Idee zu veranschaulichen.

ncasas
quelle
1
Wahrscheinlich lohnt es sich, eine Zeile über die übliche Kostenfunktion für die Regression (mittlerer quadratischer Fehler) hinzuzufügen und auf das TensorFlow-Regressionsbeispiel zu verweisen - obwohl ich gerade 10 Minuten damit verbracht habe, eine zu suchen, und nichts gesehen habe. . . (Beispiele überspringen von linearer Regression zu MNIST-Klassifikatoren, aber keine grundlegenden MLP-Regressionsmodelle).
Neil Slater
3

Sie können dies sehr einfach in Python implementieren.
Ihr X ist die Sammlung von x-, y- und z-Koordinaten für das Training.
Ihr Y ist die Sammlung der Testkoordinaten x, y, z.

from sklearn import cross_validation                     
from sklearn.neural_network import MLPRegressor   

model = MLPRegressor(solver='lbfgs',alpha=0.001,hidden_layer_sizes=(150,))
cross_validation.cross_val_score(model, X, Y,scoring='mean_squared_error')
John Quanasama
quelle
0

Dies ist viel einfacher als Sie denken - Sie können einfach festlegen, dass Ihre Ausgabeebene ein Vektor anstelle eines einzelnen Skalars ist. Natürlich gibt es hier keine Magie und ich rate Ihnen, Ihre Daten vorzubereiten (führen Sie eine Batch-Normalisierung durch, damit alle Ausgaben Werte zwischen 0 und 1 annehmen).

Wenn Sie Keras verwenden, können Sie dazu eine dichte Ebene als endgültige Ausgabeebene hinzufügen: model.add(Dense(8, activation='linear'))

Nissim
quelle