Python构建简单线性回归模型
作者:梦想画家 发布时间:2021-03-22 19:58:42
前言:
本文介绍如何构建简单线性回归模型及计算其准确率,最后介绍如何持久化模型。
线性回归模型
线性回归表示发现函数使用线性组合表示输入变量。简单线性回归很容易理解,使用了基本的回归技术,一旦理解了这些基本概念,可以更好地学习其他类型的回归模型。
回归用于发现输入变量和输出变量之间的关系,一般变量为实数。我们的目标是估计映射从输入到输出的映射核函数。
下面从一个简单示例开始:
1 --> 2
3 --> 6
4.3 --> 8.6
1.1 --> 14.2
看到上面数据,估计你已经看出它们之间的关系:f(x) = 2x
但是现实数据不会这么直接。下面示例数据来自Vehicles.txt文件。每行数据使用逗号分割,第一个数据为输入数据,第二个为输出数据,我们的目标是发现线性回归关系:基于汽车登记量估计省份人口数量。
示例数据如下:
145263, 127329
204477, 312027
361034, 573694
616716, 891181
885665, 1059114
773600, 1221218
850513, 1326513
996733, 1543752
827967, 1571053
1011436,1658138
1222738,1970521
2404651,3744398
2259795,4077166
2844588,4404246
2774071,4448146
3011089,4915123
3169307,5074261
3346791,5850850
3702114,5888472
5923476,10008349
1.加载数据
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt
import sklearn.metrics as sm
import pickle
filename = "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是响应变量。在循环内读取每一行,然后基于逗号分裂为两个变量并转为浮点型。
2.划分训练集和测试集
构建机器学习模型,需要划分训练集和测试集,训练集用于构建模型,测试集用于验证模型并检查模型是否满足要求。
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。
3.训练模型
现在准备训练模型,需要使用regressor对象。
# Create linear regression object
linear_regressor = linear_model.LinearRegression()
# Train the model using the training sets
linear_regressor.fit(x_train, y_train)
首先从sklearn库中导入linear_model方法,用于实现线性回归,里面包括目标值:输入变量的线性组合。然后使用LinearRegression() 函数执行最小二乘法执行线性回归。最后fit函数用于拟合线性模型,需要传入两个参数:x_train,y_train。
4.预测数据
上面基于训练集拟合线性模型,使用fit方法接收训练数据训练模型。为了查看拟合程度,我们可以使用训练数据进行预测:
y_train_pred = linear_regressor.predict(X_train)
5.画图展示线性拟合情况
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()
生成图示如下:
前面使用训练模型预测训练数据。对于未知数据不能确定模型性能,我们需要基于测试数据进行测试。
6.预测数据测试
下面基于测试数据进行预测并画图展示:
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()
与我们预想的一致,省人口与汽车注册量成正相关。
评估模型精度
上面构建了回归模型,但我们需要评估模型的质量。这里我们定义错误为实际值与预测值之间的差异,下面我们看如何计算回归模型的精度。
1.计算回归模型精度
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.27
MSE = 81974851872.13
Median absolute error = 240861.94
Explain variance score = 0.98
R2 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变量,预测结果与上面一致。
来源:https://blog.csdn.net/neweastsun/article/details/126507917


猜你喜欢
- Python 爬虫图片简单实现经常在逛知乎,有时候希望把一些问题的图片集中保存起来。于是就有了这个程序。这是一个非常简单的图片爬虫程序,只能
- 一个字典就是一个键对应一个单值的映射。如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面。比如,你可
- 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的编写,刚开始不会体会出SQL语句各种写法的性能优劣,但是如果将应
- 本文实例讲述了PHP实现无限极分类的两种方式。分享给大家供大家参考,具体如下:面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表
- torch.cat()函数可以将多个张量拼接成一个张量。torch.cat()有两个参数,第一个是要拼接的张量的列表或是元组;第二个参数是拼
- 数组都是从0开始。javascript是arrayname[i],而vbscript是arrayname(i) javascript的字符串
- 阅读上一篇:网马解密大讲堂——网马解密中级篇(Eval篇) 一.Document.write 函数简介:在Microsoft JScript
- 本文实例讲述了Python实现简单的可逆加密程序。分享给大家供大家参考。具体如下:Python代码如下:#coding=utf-8 
- 今天研究了个开源项目,数据库是mysql的,其中的脚本数据需要备份,由于本人的机器时mac pro,而且mac下的数据库连接工具都不怎么好用
- asp压缩access数据库,具体asp代码见下: Class DatabaseTools &n
- 来源:在工作过程中,需要统计一些trace信息,也就是一些打点信息,而打点是通过关键字进行的,因此对一个很大的文件进行分析时,想把两个打点之
- 前言密码安全是非常重要的,因此我们在代码中往往需要对密码进行加密,以此保证密码的安全加依赖<!-- jasypt --><
- XmlDocume
- Redisredis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串
- 对大家推荐很好使用的MySql节点系统,像让大家对MySql节点系统有所了解,然后对MySql节点系统全面讲解介绍,希望对大家有用在向大家详
- 即使打开了strict和warnings选项也无妨,下面代码并无错误和警告。#!/usr/bin/perluse strict;use wa
- Django在执行python manage.py makemigrations的时候一切正常但是执行python manage.py mi
- <html><head><meta http-equiv="Content-T
- 1.基本构架:mport PIL.Image 相关模块img=Image.open(img_name) 打开图片img.save(save_
- 前言electron-vue脚手架搭建的项目,在开发阶段可能你注意不到项目启动慢的问题,但是在build 生成的exe可执行文件,启动后,要