Réseau de neurones pour la régression à sorties multiples

21

J'ai un ensemble de données contenant 34 colonnes d'entrée et 8 colonnes de sortie.

Une façon de résoudre le problème consiste à prendre les 34 entrées et à créer un modèle de régression individuel pour chaque colonne de sortie.

Je me demande si ce problème peut être résolu en utilisant un seul modèle, en particulier en utilisant Neural Network.

J'ai utilisé Perceptron multicouche, mais cela nécessite plusieurs modèles, tout comme la régression linéaire. La séquence à séquence peut-elle être une option viable?

J'utilise TensorFlow. J'ai du code mais je pense qu'il est plus important de comprendre ce que je manque en termes de théorie du perceptron multicouche.

Je comprends que dans MLP, si vous avez un nœud de sortie, il fournira une sortie. Si vous avez 10 nœuds de sortie, c'est un problème multi-classes. Vous choisissez la classe avec la probabilité la plus élevée parmi les 10 sorties. Mais dans mon cas, il est certain qu'il y aura 8 sorties pour la même entrée.

Disons que pour un ensemble d'entrées, vous obtiendrez les coordonnées 3D de quelque chose (X, Y, Z). Comme, Inputs = {1,10,5,7} Output = {1,2,1}. Donc, pour la même entrée {1,10,5,7}, je dois faire des modèles pour la valeur X, la valeur Y et Z. Une solution consiste à avoir 3 modèles différents en utilisant MLP. Mais je voudrais voir si je peux avoir un modèle. J'ai donc pensé à utiliser seq2seq. Parce que l'encodeur prend une série d'entrées et le décodeur fournit une série de sorties. Mais il semble que seq2seq dans tensorflow ne puisse pas gérer les valeurs flottantes. Je peux me tromper cependant.

sjishan
la source
Vous semblez avoir des problèmes pour comprendre le modèle NN de perceptron multicouche, ainsi que TensorFlow - vos déclarations à ce sujet sont incorrectes. Cependant, il n'est pas clair pourquoi vous avez ce malentendu, ce qui signifie qu'une réponse ne peut pas vous aider à résoudre ce problème. Prédire par exemple 8 sorties de régression dans un seul modèle NN est trivialement facile dans la plupart des frameworks NN, pas besoin de séquences dans votre cas. Je pense donc qu'il peut être important de regarder sur quoi votre dernier paragraphe est basé pour vous aider - pourriez-vous ajouter quelques détails de ce que vous avez vu ou essayé afin de venir à ces pensées?
Neil Slater
Serait-il possible pour vous de fournir une réponse sur la façon d'obtenir 8 sorties de régression en utilisant un seul modèle NN? Merci.
sjishan
Probablement, si vous expliquez quelques choses en modifiant votre question: 1) Dans quel cadre? 2) Quel est votre code (ou design, si vous n'avez pas de code) jusqu'à présent? 3) Qu'est-ce qui vous empêche de faire cela vous-même? J'ai besoin de 1 et 2 pour répondre avec quelque chose que vous pouvez utiliser. J'ai besoin de 3 pour comprendre quel est votre problème et expliquer la solution.
Neil Slater
1. Tensorflow. 2. J'ai du code mais je pense qu'il est plus important de comprendre ce que je manque en termes de théorie du perceptron multicouche. Je comprends que dans MLP, si vous avez un nœud de sortie, il fournira une sortie. Si vous avez 10 nœuds de sortie, c'est un problème multi-classes. Vous choisissez la classe avec la probabilité la plus élevée parmi les 10 sorties. Mais dans mon cas, il est certain qu'il y aura 8 sorties pour la même entrée. Permettez-moi de montrer un exemple différent, disons, pour un ensemble d'entrées, vous obtiendrez les coordonnées 3D de quelque chose (X, Y, Z). Comme, Inputs = {1,10,5,7} Output = {1,2,1}
sjishan
Donc, pour la même entrée {1,10,5,7}, je dois faire des modèles pour la valeur X, la valeur Y et Z. Une solution consiste à avoir 3 modèles différents en utilisant MLP. Mais je voudrais voir si je peux avoir un modèle. J'ai donc pensé à utiliser seq2seq. Parce que l'encodeur prend une série d'entrées et le décodeur fournit une série de sorties. Mais il semble que seq2seq dans tensorflow ne puisse pas gérer les valeurs flottantes. Je peux me tromper cependant.
sjishan

Réponses:

14

Ce que vous décrivez est une régression linéaire multidimensionnelle normale. Ce type de problème est normalement résolu avec un réseau à action directe, MLP ou toute autre architecture qui convient à la nature du problème.

N'importe quel cadre de réseau neuronal est capable de faire quelque chose comme ça.

La clé pour cela est de se rappeler que la dernière couche doit avoir des activations linéaires (c'est-à-dire aucune activation du tout).

Selon vos besoins, la forme de la couche d'entrée serait un vecteur (34,) et la sortie (8,).

Mise à jour : la fonction de perte habituelle utilisée pour les problèmes de régression est l'erreur quadratique moyenne (MSE). Voici un exemple de régression multidimensionnelle utilisant Keras ; le réseau n'est pas un MLP mais ça devrait être OK pour illustrer l'idée.

ncasas
la source
1
Il vaut probablement la peine d'ajouter une ligne sur la fonction de coût habituelle pour la régression (erreur quadratique moyenne) et de pointer sur l'exemple de régression TensorFlow - même si je viens de passer 10 minutes à en chercher une maintenant et je n'ai rien vu. . . (les exemples sautent de la régression linéaire aux classificateurs MNIST, mais pas de modèles de régression MLP de base).
Neil Slater
4

Vous pouvez l'implémenter très simplement en Python.
Votre X sera la collection de coordonnées d'entraînement x, y, z.
Votre Y sera la collection de tests de coordonnées 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
la source
0

C'est beaucoup plus facile que vous ne le pensez - vous pouvez simplement définir votre couche de sortie pour être un vecteur au lieu d'un seul scalaire. Bien sûr, il n'y a pas de magie ici et je vous conseille de préparer vos données (effectuez la normalisation par lots pour que toutes les sorties soient des valeurs comprises entre 0 et 1).

Si vous utilisez Keras, la façon de procéder consiste à ajouter une couche dense comme couche de sortie finale: model.add(Dense(8, activation='linear'))

Nissim
la source