本文介绍如何构建简单线性回归模型及计算其准确率,最后介绍如何持久化模型。
线性回归模型
线性回归表示发现函数使用线性组合表示输入变量。简单线性回归很容易理解,使用了基本的回归技术,一旦理解了这些基本概念,可以更好地学习其他类型的回归模型。
回归用于发现输入变量和输出变量之间的关系,一般变量为实数。我们的目标是估计映射从输入到输出的映射核函数。下面从一个简单示例开始:
1 --> 23 --> 64.3 --> 8.61.1 --> 14.2
看到上面数据,估计你已经看出它们之间的关系:f(x) = 2x
但是现实数据不会这么直接。下面示例数据来自Vehicles.txt文件。每行数据使用逗号分割,第一个数据为输入数据,第二个为输出数据,我们的目标是发现线性回归关系:基于汽车登记量估计省份人口数量。示例数据如下:
145263,127329204477,312027361034,573694616716,891181885665,1059114773600,1221218850513,1326513996733,1543752827967,15710531011436,16581381222738,19705212404651,37443982259795,40771662844588,44042462774071,44481463011089,49151233169307,50742613346791,58508503702114,58884725923476,10008349
加载数据
import numpy as npfrom sklearn import linear_modelimport matplotlib.pyplot as pltimport sklearn.metrics as smimport picklefilename = "data/vehicles.txt"x = []y = []with open(filename, 'r') as lines:for line in lines:xt, yt = [float(i) for i in line.split(',')]x.append(xt)y.append(yt)
上面代码加载文件至x,y变量中,x是自变量,y是响应变量。在循环内读取每一行,然后基于逗号分裂为两个变量并转为浮点型。
划分训练集和测试集
构建机器学习模型,需要划分训练集和测试集,训练集用于构建模型,测试集用于验证模型并检查模型是否满足要求。
num_training = int(0.8 * len(x))num_test = len(x) - num_training# 训练数据占80%x_train = np.array(x[: num_training]).reshape((num_training, 1))y_train = np.array(y[: num_training])# 测试数据占20%x_test = np.array(x[num_training:]).reshape((num_test, 1))y_test = np.array(y[num_training:])
首先取80%数据作为训练集,剩余的作为测试集。这时我们构造了四个数组:x_train,x_test,y_train,y_test。
训练模型
现在准备训练模型,需要使用regressor对象。
# Create linear regression objectlinear_regressor = linear_model.LinearRegression()# Train the model using the training setslinear_regressor.fit(x_train, y_train)
首先从sklearn库中导入linear_model方法,用于实现线性回归,里面包括目标值:输入变量的线性组合。然后使用LinearRegression() 函数执行最小二乘法执行线性回归。最后fit函数用于拟合线性模型,需要传入两个参数:x_train,y_train。
预测数据
上面基于训练集拟合线性模型,使用fit方法接收训练数据训练模型。为了查看拟合程度,我们可以使用训练数据进行预测:
y_train_pred = linear_regressor.predict(X_train)
画图展示线性拟合情况
plt.figure()plt.scatter(x_train, y_train, color='green')plt.plot(x_train, y_train_pred, color='black', linewidth=4)plt.title('Training data')plt.show()
生成图示如下:
前面使用训练模型预测训练数据。对于未知数据不能确定模型性能,我们需要基于测试数据进行测试。
预测数据测试
下面基于测试数据进行预测并画图展示:
y_test_pred = linear_regressor.predict(x_test)plt.figure()plt.scatter(x_test, y_test, color='green')plt.plot(x_test, y_test_pred, color='black', linewidth=4)plt.title('Test data')plt.show()
与我们预想的一致,省人口与汽车注册量成正相关。
评估模型精度
上面构建了回归模型,但我们需要评估模型的质量。这里我们定义错误为实际值与预测值之间的差异,下面我们看如何计算回归模型的精度。
计算回归模型精度
print("MAE =", round(sm.mean_absolute_error(y_test, y_test_pred), 2))print("MSE =", round(sm.mean_squared_error(y_test, y_test_pred), 2))print("Median absolute error =",round(sm.median_absolute_error(y_test, y_test_pred), 2))print("Explain variance score =",round(sm.explained_variance_score(y_test, y_test_pred), 2))print("R2 score =", round(sm.r2_score(y_test, y_test_pred), 2))
输出结果:
MAE = 241907.27MSE = 81974851872.13Median absolute error = 240861.94Explain variance score = 0.98R2 score = 0.98
R2得分接近1表示模型预测效果非常好。计算每个指标会很麻烦,一般选择一两个指标来评估模型。一个好的做法是MSE较低,解释方差得分较高。
Mean absolute error: 所有数据集的平均绝对值误差
Mean squared error: 所有数据集的平均误差平方,是最常用的指标之一。
Median absolute error: 所有数据集的误差中位数,该指标主要用于消除异常值影响
Explained variance score: 模型在多大程度上能够解释数据集中的变化。1.0的分数表明我们的模型是完美的。
R2 score: 这被读作r²,是决定系数。表示模型对未知样本的预测程度。最好的分数是1.0,但也可以是负值。
模型持久化
训练完模型,可以保存至文件中,下次需要模型预测可直接从文件加载。
下面看如何持久化模型。需要使用pickle模块,实现存储Python对象,它是Python标准库的一部分。
# 写入文件output_model_file = "3_model_linear_regr.pkl"with open(output_model_file, ' wb') as f:pickle.dump(linear_regressor, f)# 加载使用with open(output_model_file, ' rb') as f:model_linregr = pickle.load(f)y_test_pred_new = model_linregr.predict(x_test)print("New mean absolute error =",round(sm.mean_absolute_error(y_test, y_test_pred_new), 2))
输出结果:
New mean absolute error = 241907.27
这里从文件加载数据至model_linregr变量,预测结果与上面一致。