Sklearn 线性回归 X 和 Y 输入格式

Sklearn linear regression X and Y input format

我对 sklearn linear_model.LinearRegression(模块)的输入有一些疑问。

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

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

查看 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 (polynomial fitting) or np.linalg.lstsq(广义最小二乘法)。这些更易于安装和使用。不过,Scikits-learn 具有更多功能和高级回归技术。