对于初学者,您缺少拦截。尽管自变量的平均值接近零:
parsedData.map(lambda lp: lp.features).mean()
## DenseVector([-0.031, -0.0066, 0.1182, -0.0199, 0.0178, -0.0249,
## -0.0294, 0.0669]
因变量的平均值离它很远:
parsedData.map(lambda lp: lp.label).mean()
## 2.452345085074627
在这种情况下,强制回归线穿过原点是没有意义的。因此,让我们看看如何LinearRegressionWithSGD
使用默认参数和添加的拦截执行:
model = LinearRegressionWithSGD.train(parsedData, intercept=True)
valuesAndPreds = (parsedData.map(lambda p: (p.label, model.predict(p.features))))
valuesAndPreds.map(lambda vp: (vp[0] - vp[1]) ** 2).mean()
## 0.44005904185432504
让我们将其与分析解决方案进行比较
import numpy as np
from sklearn import linear_model
features = np.array(parsedData.map(lambda lp: lp.features.toArray()).collect())
labels = np.array(parsedData.map(lambda lp: lp.label).collect())
lm = linear_model.LinearRegression()
lm.fit(features, labels)
np.mean((lm.predict(features) - labels) ** 2)
## 0.43919976805833411
尽您所能,使用获得的结果LinearRegressionWithSGD
几乎是最佳的。