2015-04-05 197 views
0

我有一些关于sklearn linear_model.LinearRegression(模块)的输入问题。Sklearn线性回归X和Y输入格式

ages_train = [[20, 10000], [22, 12000], [22, 14000], [25, 17000], [30, 29000]] 
net_worths_train = [10000, 12000, 14000, 17000, 29000] 

reg = linear_model.LinearRegression() 
reg.fit(ages_train, net_worths_train) 

上述工作,但它使得很难绘图。举例来说,这样做是行不通的:

plt.scatter(ages_train, net_worths_train, color = "b", label = "train data") 

所以我想做的是输入这样的:

ages_train = np.array([20, 22, 25, 27, 30, 31, 31, 34, 42, 50]) 
net_worths_train = np.array([10000, 12000, 16000, 20000, 30000, 33000, 34000, 38000, 49000, 60000]) 

但这种数据格式不与.fit工作() linear_model.LinearRegression的函数。输入数据的正确方法是什么,并使其易于绘图?最好是使用numpy数组吗?

回答

3

查看documentation for scikits.learn。你会看到X和Y需要分别是形状(n_samples,n_features)和(n_sample,n_targets)的二维数组。即使您只有一个功能和一个目标,情况也是如此。

你知道形状数组(6,1)和形状数组(6,)之间的区别吗?起初有点混乱,但第一个是一个真正的二维数组,恰好有一列,第二个是完全的一维数组。

以下是如何将数据转换为二维数组。是的,当使用像这样的数字数据时,你应该使用numpy,而不是列表。

ages_train = np.array([20, 22, 25, 27, 30, 31, 31, 34, 42, 50]) 
net_worths_train = np.array([10000, 12000, 16000, 20000, 30000, 33000, 34000, 38000, 49000, 60000]) 
reg.fit(ages_train[:, np.newaxis], net_worths_train[:, np.newaxis]) 
print reg.coef_, reg.intercept_ 

顺便说一句,如果你真的只想做简单的线性回归,考虑np.polyfit(多项式拟合)或np.linalg.lstsq(广义最小二乘法)。这些更容易安装和使用。尽管如此,Scikits-learn还有更多的功能和先进的回归技术。