我们之前训练并评价了一个用于预估披萨价格的模型
详情请见我的另一篇博文
scikit-learn机器学习之简单线性回归
但是这个模型其实并不完美,我们需要更多的解释变量来完善我们的模型
所以就有了我们的多元线性回归
披萨的其他特征也和其价格相关,比如披萨的配料的数量,所以我们可以添加配料的数量作为第二个解释变量
多元线性回归是一种简单线性回归的泛化形式,它可以使用多个解释变量
多元线性回归模型如公式:
y = a + b1*x1 + b2*x2 + b3*x3 ……
在这一个例子中,我们的学习算法必须估计3个参数的值:两个特征系数和一个常数。
我们可以通过numpy来解出b值
这里提供两种方法都能够解出这三个值
from numpy.linalg import inv
from numpy import dot, transpose
from numpy.linalg import lstsq
x = [
[1, 6, 2],
[1, 8, 1],
[1, 10, 0],
[1, 14, 2],
[1, 18, 0]
]
y = [[7], [9], [13], [17.5], [18]]
print(dot(inv(dot(transpose(x), x)), dot(transpose(x), y)))
print(lstsq(x, y, rcond=None)[0]) # 这种方法更加简洁
结果:
[[1.1875 ]
[1.01041667]
[0.39583333]]
[[1.1875 ]
[1.01041667]
[0.39583333]]
我们使用第2个解释变量来更新预测代码,并比较性能
from sklearn.linear_model import LinearRegression
x_train = [
[6, 2],
[8, 1],
[10, 0],
[14, 2],
[18, 0]
]
y_train = [[7], [9], [13], [17.5], [18]]
mod = LinearRegression()
mod.fit(x_train, y_train)
x_test = [[8, 2],
[9, 0],
[11, 2],
[16, 2],
]
y_test = [[11], [8.5], [15], [18]]
pred = mod.predict(x_test)
for i, pre in enumerate(pred):
print(pre, y_test[i]) # 输出模型预测结果和实际结果
print(mod.score(x_test, y_test)) # 方差
输出结果:
[10.0625] [11]
0.8551010249379817
[10.28125] [8.5]
0.8551010249379817
[13.09375] [15]
0.8551010249379817
[18.14583333] [18]
0.8551010249379817
多元线性回归的特殊形式
这里的基本模型:
y = a+b1*x^2+b2*x^3+……
会出现高阶多项式
虽然这种模型能够几乎完全拟合训练数据,但是却无法准确逼近真实的关系,这称为过拟合。也就是说这个模型准确的拟合了训练数据,但是却没有真正的学习到尺寸和价格之间的真实关系
我们可以通过正则化来防止过拟合
正则化是一个能用于防止过拟合技巧的集合
当然sk-learn库中也提供了几个正则化线性回归模型,比如提克洛夫规范化和最小绝对收缩和选择算子
一种有效估计模型参数最优值的方法
引用scikit-learn 机器学习(第二版)异步图书,中的一个类比的例子来说明这种方法
梯度下降法有时会被类比为一个蒙眼的人试着从山腰上找到通往山谷最低点的路。这个人看不见地势, 但是他能够判断每一步的陡峭程度。受些他会向下降最快的方法走一步,接着同样在下降最快的方向上走另一步。他的每一步的跨度和当前位置地形的陡峭程度成比例。当地形陡峭时他会走大步,因为他很确信他依然很接近山顶,并且他不会越过山谷的最低点。当地形变得不那么陡峭时,他会走小步。接着他需要改变方向再次向山谷的最低点前进。通过逐渐减少大步,他能够避免在山谷最低点周围来回行走。这个蒙着眼睛的人会继续行走,直到他的下一步无法降低高度,那么他就到了山谷的底部
也就是说梯度下降法是一种用于估计函数局部最小值的优化算法
在sk-learn库中 SGDRegressor类是随机梯度下降法的一种实现