2015-11-13 8 views
15

Ich versuche, this tutorial zu folgen.Verwenden Sie Attribut- und Zielmatrizen für lineare TensorFlow-Regression Python

TensorFlow kam gerade heraus und ich versuche es wirklich zu verstehen. Ich kenne bestrafte lineare Regression wie Lasso, Ridge und ElasticNet und seine Verwendung in scikit-learn.

Für scikit-learn Lasso Regression, alle I zur Eingabe in den Regressionsalgorithmus müssen, sind DF_X [eine M x N-dimensionale Attributmatrix (pd.DataFrame)] und SR_y [M ein dimensionsZielVektor (pd.Series)]. Die Variable Struktur in TensorFlow ist mir etwas neu und ich bin mir nicht sicher, wie ich meine Eingabedaten so strukturieren soll, wie sie wollen.

Es scheint, als ob Softmax-Regression für die Klassifizierung ist. Wie kann ich meine DF_X (M x N Attributmatrix) und SR_y (M dimensionalen Zielvektor) umwandeln in tensorflow für lineare Regression?

Meine aktuelle Methode für eine lineare Regression verwendet Pandas, Numpy und Sklearn und es ist unten gezeigt. Ich denke, diese Frage wirklich hilfreich sein für Menschen mit TensorFlow immer vertraut:

#!/usr/bin/python 
import pandas as pd 
import numpy as np 
import tensorflow as tf 
from sklearn.linear_model import LassoCV 

#Create DataFrames for attribute and target matrices 
DF_X = pd.DataFrame(np.array([[0,0,1],[2,3,1],[4,5,1],[3,4,1]]),columns=["att1","att2","att3"],index=["s1","s2","s3","s4"]) 
SR_y = pd.Series(np.array([3,2,5,8]),index=["s1","s2","s3","s4"],name="target") 

print DF_X 
#att1 att2 att3 
#s1  0  0  1 
#s2  2  3  1 
#s3  4  5  1 
#s4  3  4  1 

print SR_y 
#s1 3 
#s2 2 
#s3 5 
#s4 8 
#Name: target, dtype: int64 

#Create Linear Model (Lasso Regression) 
model = LassoCV() 
model.fit(DF_X,SR_y) 

print model 
#LassoCV(alphas=None, copy_X=True, cv=None, eps=0.001, fit_intercept=True, 
#max_iter=1000, n_alphas=100, n_jobs=1, normalize=False, positive=False, 
#precompute='auto', random_state=None, selection='cyclic', tol=0.0001, 
#verbose=False) 

print model.coef_ 
#[ 0.   0.3833346 0.  ] 

Antwort

14

Softmax ist eine einzige Ergänzung Funktion (in der logistischen Regression zum Beispiel), ist es nicht ein Modell wie

model = LassoCV() 
model.fit(DF_X,SR_y) 

Deshalb Sie können es nicht einfach Daten mit Fit-Methode geben. Sie können Ihr Modell jedoch einfach mit Hilfe von TensorFlow-Funktionen erstellen.

Zuerst müssen Sie ein Berechnungsdiagramm erstellen, zum Beispiel für die lineare Regression werden Sie Tensoren mit der Größe Ihrer Daten erstellen. Sie sind nur Tensoren und Sie geben Ihnen Ihr Array in einem anderen Teil des Programms.

import tensorflow as tf 
x = tf.placeholder("float", [4, 3])  
y_ = tf.placeholder("float",[4]) 

Wenn Sie zwei Variablen zu erstellen, wird diese enthalten Einwaagen unseres Modells

W = tf.Variable(tf.zeros([3,1])) 
b = tf.Variable(tf.zeros([1])) 

Und nun können Sie das Modell erstellen (Sie Regression erstellen möchten, nicht Einstufung deshalb brauchen Sie nicht verwenden tf.nn.softmax)

y=tf.matmul(x,W) + b 

Wie Sie Regression und lineare Modell haben Sie

verwenden
loss=tf.reduce_sum(tf.square(y_ - y)) 

Dann werden wir unser Modell mit dem gleichen Schritt wie im Tutorial trainieren

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

Nachdem Sie nun die Berechnungsgraphen erstellt man einen weiteren Teil des Programms zu schreiben, wo Sie diese Grafik verwenden um mit Ihren Daten zu arbeiten.

init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init)  
sess.run(train_step, feed_dict={x:np.asarray(DF_X),y_:np.asarray(SR_y)}) 

Hier geben Sie Ihre Daten mit Hilfe von feed_dict an diese Berechnungsgrafik weiter. In TensorFlow stellen Sie Informationen in numply Arrays bereit. Wenn Sie Ihren Fehler sehen möchten, können Sie

sess.run(loss,feed_dict={x:np.asarray(DF_X),y_:np.asarray(SR_y)}) 
+0

'Typeerror schreiben: 'Tensor' Objekt ist nicht bekam iterable'I diesen Fehler während' Verlust = (sum (y_-y)) ** 2' –

+0

I denke, die 'x'-Matrix und der' W'-Vektor werden im Beispiel des Tutorials getauscht. –

+2

Angenommen, Sie wollen die Summe der quadrierten Fehler, ich denke 'Verlust' sollte definiert werden als:' Verlust = tf.reduce_sum (tf.square (y_ - y)) '. (Der 'nicht iterierbare' Fehler kommt von Pythons eingebauter' sum() '-Funktion und nicht vom TensorFlow-Operator; und ich denke, dass Sie die Summe nach dem Quadrieren übernehmen wollen.) – mrry

Verwandte Themen