在本章中,我们将实践一个简单的线性回归,我们把它用于对一个响应变量和解释变量的特征之间的关系进行建模。
下面我们用一个披萨的尺寸和价格之间的关系来进行建模并赴以实践。
首先,我们来看一下数据
| 训练实例 | 披萨直径(单位:英寸) | 披萨价格(单位:美元) |
|---|---|---|
| 1 | 6 | 7 |
| 2 | 8 | 9 |
| 3 | 10 | 13 |
| 4 | 14 | 17.5 |
| 5 | 18 | 18 |
数据可视化
下面我们用matplotlib来将上面的数据可视化
import numpy as npimport matplotlib.pyplot as pltdef datas_plt():# 我们习惯用大写字母表示矩阵,小写字母表示向量X = np.array([[6], [8], [10], [14], [18]])y = np.array([7, 9, 13, 17.5, 18])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]) # 设置x轴的范围为[0, 25],y轴的范围为[0, 25]plt.grid(True) # 网格线显示plt.show()datas_plt()
拟合线性回归模型
简单线性模型假设响应变量和解释变量之间存在线性关系。
我们可以假设简单的线性回归模型如下:
其中是响应变量的预测值,在这个例子里他表示的是披萨的预测价格;
表示解释变量。截短项
和系数项
都是可以通过学习算法学到的模型参数。一般都是用最小二乘法来拟合处这两个参数
import numpy as npfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_errordef main():X = np.array([[6], [8], [10], [14], [18]])y = np.array([7, 9, 13, 17.5, 18])# 实例化一个线性回归模型model = LinearRegression()# 用训练数据拟合模型model.fit(X, y)# 用一个之前未出现在训练数据的数据来测试模型true_price = 12true_price = np.array(true_price).reshape(1, 1) # true_price -> [[12]]pred_price = model.predict(true_price) # pred_price -> [13.68]# 计算mse损失mse = np.mean((model.predict(X) - y) ** 2)mse_sklearn = mean_squared_error(model.predict(X), y )print(mse) # 1.7495689655172406print(mse_sklearn) # 1.7495689655172406if __name__ == '__main__':main()
模型评估
首先让我们看一下模型评估的数据
| 测试实例 | 披萨直径(单位:英寸) | 真实价格(单位:美元) | 预测价格(单位:美元) |
|---|---|---|---|
| 1 | 8 | 11 | 9.7759 |
| 2 | 9 | 8.5 | 10.7522 |
| 3 | 11 | 15 | 12.7048 |
| 4 | 16 | 18 | 17.5863 |
| 5 | 12 | 11 | 13.6811 |
看完数据以后,我们可以使用一些衡量方法来评估模型的预测能力。下面我们介绍一种R方的方法来评估我们上面训练的披萨介个预估模型。
R方,有时候也被叫做决定系数,它被用来衡量数据和回归线的贴近程度。
计算R方的方法有很多种,在简单线性回归模型中,R方等于皮尔森积差相关系数的平方,也被称为皮尔森相关系数r的平方。使用这种方法,R方必须是0和1之间的正数,其原因就是:R方描述的是模型解释的响应变量中的方差的比例。另外,当我们采用其他计算方式时,比如说sklearn库中的方法。它不使用皮尔森相关系数r的平方来计算R方。如果模型的效果非常差,那么由sklearn库的计算方式,求出来的R方可能为负值。
R方对异常值尤其敏感,当新的特征增加到模型中时,它常常会出现异常的增长。
下面我们展示一下上面说的两种不同的计算方式
皮尔森相关系数r的平方
首先我们先看一下计算公式
其中为响应变量的观测值均值(即真实价格的均值),
是第i个实例的预测价格。
将数值带入上述式子中,得到
最红R方的结果是0.66.
sklearn库
下面我们用sklean自带的库来计算R方的值
import numpy as npfrom sklearn.linear_model import LinearRegressiondef main():X_train = np.array([[6], [8], [10], [14], [18]])y_train = np.array([7, 9, 13, 17.5, 18])X_test = np.array([[8], [9], [11], [16], [12]])y_test = np.array([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.6620052929422553if __name__ == '__main__':main()
通过两种计算方法得到的结果大体一致。
