700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python构建简单线性回归模型教程

Python构建简单线性回归模型教程

时间:2023-05-12 03:10:01

相关推荐

Python构建简单线性回归模型教程

本文介绍如何构建简单线性回归模型及计算其准确率,最后介绍如何持久化模型。

线性回归模型

线性回归表示发现函数使用线性组合表示输入变量。简单线性回归很容易理解,使用了基本的回归技术,一旦理解了这些基本概念,可以更好地学习其他类型的回归模型。

回归用于发现输入变量和输出变量之间的关系,一般变量为实数。我们的目标是估计映射从输入到输出的映射核函数。下面从一个简单示例开始:

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变量,预测结果与上面一致。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。