2015-11-13 78 views
15

我正在嘗試關注this tutorial使用屬性和目標矩陣進行TensorFlow線性迴歸Python

TensorFlow剛出來的時候,我真的想了解它。我熟悉懲罰線性迴歸像Lasso,Ridge和ElasticNet及其在scikit-learn中的用法。

對於scikit-learn套索迴歸,所有我需要輸入到迴歸算法是DF_X [一個M×N的二維屬性矩陣(pd.DataFrame)]和SR_y [的M維目標矢量(pd.Series)]。 TensorFlow中的Variable結構對我來說有點新意,我不知道如何將輸入數據組織成想要的結果。

看起來好像SOFTMAX迴歸是一種分類。 我怎樣才能調整自己DF_X(M×N個屬性矩陣)和SR_y(M維目標矢量),以輸入到tensorflow線性迴歸?

我做一個線性迴歸的方法目前使用的大熊貓,numpy的,並且sklearn和它的如下圖所示。我認爲這個問題將是人們越來越熟悉TensorFlow真正幫助:

#!/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.  ] 

回答

14

SOFTMAX是唯一增加的功能(在例如邏輯迴歸),它不像

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

因此模型你不能簡單地用適合的方法給它的數據。但是,您可以使用TensorFlow函數簡單地創建模型。

首先,你必須創建一個計算圖表,例如用於線性迴歸,您將創建張量與您的數據的大小。他們只是張量,你會在程序的另一部分給他們你的數組。

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

當您創建兩個變量,將包含我們的

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

模型的初始權重現在你可以創建模型(你要創建的迴歸,而不是分類,因此你不需要使用tf.nn.softmax)

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

當你有迴歸和線性模型,您將使用

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

然後,我們將培養我們用同樣的步驟模型教程

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

現在你創建你的計算圖表寫程序,在那裏你會使用此圖的另外一部分處理您的數據。

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)}) 

在這裏,您可以在feed_dict的幫助下將數據提供給此計算圖。在TensorFlow中,您可以使用numpy數組提供信息。 如果你想看到你的錯誤,你可以寫

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

'類型錯誤: '張量' 的對象不是iterable'I得到這個錯誤,而'損失=(SUM(Y_-Y))** 2' –

+0

我認爲'x'矩陣和'W'向量在教程的例子中被交換了 –

+2

假設你想要平方誤差的總和,我認爲'loss'應該被定義爲:'loss = tf.reduce_sum(tf.square(y_ - Y))'。 ('不可迭代'錯誤來自使用Python內置的'sum()'函數,而不是TensorFlow運算符;我認爲你想在平方後取這個和。) – mrry