2015-11-13 69 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