简单线性回归围绕一个响应变量和解释变量的某个特征之间的关系进行建模。虽然简单线性回归对于现实问题几乎不具备可用性,但它是理解许多其它模型的关键。
简单线性回归
先看一组根据比萨的直径来预测比萨价格的数据。
序号 | 直径(英寸) | 价格(美元) |
---|---|---|
1 | 6 | 7 |
2 | 8 | 9 |
3 | 10 | 13 |
4 | 14 | 17.5 |
5 | 18 | 18 |
首先使用 matplotlib 对数据进行可视化。
import numpy as np
import matplotlib.pyplot as plt
# scikit-learn中习惯将特征向量的矩阵命名为X
#一般大写字母表示矩阵,小写字母表示向量
X = np.array([[6],[8],[10], [14],[18]]).reshape(-1, 1) # X表示训练数据的特征,即比萨直径
y = [7, 9, 13, 17.5, 18] # y是一个表示比萨价格的向量
plt.figure()
plt.title("Pizza price plotted against diameter")
plt.xlabel("Diameter in inches")
plt.ylabel("Price in dollars")
plt.plot(X, y, 'k.')
plt.axis([0, 25, 0, 25])
plt.grid(True)
plt.show()
下面使用线性回归对模型进行建模。
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, y)
test_pizza = np.array([[12]])
predicted_price = model.predict(test_pizza)[0]
print('A 12 pizza should cost: $%.2f' % predicted_price)
A 12 pizza should cost: $13.68
简单线性模型假设响应变量和解释变量之间存在线性关系。
LinearRegression 类是一个估计器。估计器基于观测到的数据预测一个值,在scikit-learn中,所有估计器都实现了fit方法和predict方法。
LinearRegression 的fit方法学习了下面的公式简单线性回归模型的参数:
y_pred = model.predict(X)
plt.scatter(X, y, label='train data')
plt.title("Pizza price best fit line")
plt.xlabel("Diameter in inches")
plt.ylabel("Price in dollars")
plt.plot(X, y_pred, label='best fit line')
plt.axis([0, 25, 0, 25])
plt.grid(True)
plt.show()
利用训练数据学习产生最佳拟合模型的简单线性回归的参数值称为普通最小二乘(Ordinary Lease Squares, OLS)。
用代价函数评价模型的拟合性
代价函数,也叫损失函数,用于定义和衡量一个模型的误差。
可以通过最小化残差的和来生成最佳的预测器,也就是说,对于所有训练数据,如果响应变量都接近观测值,那么模型就是拟合的,这种衡量模型拟合的方法叫做残差平方和(RSS)代价函数。函数公式如下所示,其中是观测值,是预测值。
print('Residual sum of squares: %.2f' % np.mean((model.predict(X) - y) ** 2))
Residual sum of squares: 1.75
评价模型
我们可以使用一些衡量方法来评估模型的预测能力,这里使用R方,R方也被称作决定系数,用来衡量数据和回归线的贴近程度。
在简单线性回归模型中,R方等于皮尔森积差相关系数的平方。
import numpy as np
from sklearn.linear_model import LinearRegression
X_train = np.array([6, 8 , 10 , 14, 18]).reshape(-1, 1)
y_train = [7, 9, 13, 17.5, 18]
X_test = np.array([8, 9, 11, 16, 12]).reshape(-1, 1)
y_test = [11, 8.5, 15, 18, 11]
model = LinearRegression()
model.fit(X_train, y_train)
r_squared = model.score(X_test, y_test)
print(r_squared)
0.6620052929422553