python机器学习实现线性回归
线性回归
关注公众号“轻松学编程”了解更多。
【关键词】最小二乘法,线性
一、普通线性回归
1、原理
分类的目标变量是标称型数据,而回归将会对连续型的数据做出预测。
应当怎样从一大堆数据里求出回归方程呢?
假定输人数据存放在矩阵X中,而回归系数存放在向量W中。那么对于给定的数据X1, 预测结果将会通过
Y=X*W
给出。现在的问题是,手里有一些X和对应的Y,怎样才能找到W呢?
一个常用的方法就是找出使误差最小的W。这里的误差是指预测Y值和真实Y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我 们采用平方误差。
最小二乘法
平方误差可以写做:
对W求导,当导数为零时,平方误差最小,此时W等于:
例如有下面一张图片:
求回归曲线,得到:
矩阵乘法
矩阵相乘:行和列相同,行乘列。
#导包
import numpy as np
from IPython.display import display
# 创建两个二维数组
a = np.random.randint(0,10,size = (2,3))
b = np.random.randint(0,10,size = (3,4))
display(a,b)
#矩阵点乘:行乘列:8*0+4*8+4*4 = 48
np.dot(a,b)
# 矩阵转置
a.T
#单元矩阵:a_T*a
unit_a = np.dot(a_T,a)
# 逆矩阵的求解:
nverse_matrix = np.linalg.inv(unit_a)
nverse_matrix
2、实例(比较不同模型对同一样本集的预测效果)
注意:以下命令都是在浏览器中输入。
cmd命令窗口输入:jupyter notebook
打开浏览器输入网址http://localhost:8888/
2.1 导包
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 获取糖尿病信息
from sklearn.datasets import load_diabetes
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.model_selection import train_test_split
2.2 获取数据
#获取糖尿病数据
data=load_diabetes()
2.3 数据建模
#数据建模
features=data.data
target=data.target
2.4 模型选择
2.4.1 使用普通线性回归模型算法进行线性回归
1) 拆分数据
#拆分数据
x_train,x_test,y_train,y_test=train_test_split(features,
target,
test_size=0.3,
random_state=1)
2) 导入线性回归模型包
from sklearn.linear_model import LinearRegression
3)创建模型对象
#创建模型对象
linear=LinearRegression()
4)模型训练
#模型训练
linear.fit(x_train,y_train)
5)预测
#求出预测值(将测试的特征数据代入predict中)
y_pred=linear.predict(x_test)
6)模型评估
#使用r2.score对线性回归模型进行评分
from sklearn.metrics import r2_score
r2_score(y_test,y_pred)
7)绘图
#画出真实值和模型求出的预测值得线形图,进行比对
plt.plot(y_pred,color='r')
plt.plot(y_test,color='y')
8)求累差和(越低越好)
#查看真实值和预测值之间的累差和
((y_test + 2) - (y_pred + 2)).sum()
9)绘制残差直方图
可以求出真实值和预测值之间差的一个累和,该累和值越小表示模型越好。
result_=(y_test + 2) - (y_pred + 2)
plt.hist(result_,bins=20)
2.4.2 使用Knn算法模型处理回归问题
1) 导入Knn算法模型包
from sklearn.neighbors import KNeighborsRegressor
3)创建模型对象
#创建模型对象
knn=KNeighborsRegressor(n_neighbors=5)
4)模型训练
#模型训练
knn.fit(x_train,y_train)
5)预测
#求出预测值(将测试的特征数据代入predict中)
knn_y_pred=knn.predict(x_test)
6)模型评估
#使用r2.score对线性回归模型进行评分
from sklearn.metrics import r2_score
r2_score(y_test,y_pred)
7)模型调优
调整k参数,进行模型调优。
knn=KNeighborsRegressor(n_neighbors=28)
knn.fit(x_train,y_train)
knn_y_pred=knn.predict(x_test)
r2_score(y_test,knn_y_pred)
8)绘图
#画出真实值和模型求出的预测值得线形图,进行比对
plt.plot(knn_y_pred,color='r')
plt.plot(y_test,color='y')
8)求累差和(越低越好)
#查看真实值和预测值之间的累差和
((y_test + 2) - (knn_y_pred + 2)).sum()
9)绘制残差直方图
可以求出真实值和预测值之间差的一个累和,该累和值越小表示模型越好。
#绘制残差直方图
#Knn
result=(y_test + 2) - (knn_y_pred + 2)
plt.hist(result,bins=20)
从上面的对比可以看出,针对“糖尿病信息”这个样本集,使用普通的线性回归模型比使用knn算法模型做预测要好。
3、研究一个特征对结果的影响
#取样本集中的一列
new_features=features[:,3]
target=target
#使用普通线性回归模型
new_linear=LinearRegression()
#训练模型
new_linear.fit(new_features.reshape(-1,1),target)
#对给出的数据进行预测
x=np.linspace(new_features.min(),new_features.max(),300)
y=new_linear.predict(x.reshape(-1,1))
#绘图,绘出变化曲线
plt.scatter(new_features,target)
plt.scatter(x,y)
可以预测出,这一特征对“糖尿病”的影响是成正相关的。
二、岭回归
1、原理
缩减系数来“理解”数据 :
如果数据的特征比样本点还多应该怎么办?是否还可以使用线性回归和之前的方法来做预测?
答案是否定的,即不能再使用前面介绍的方法。这是因为输入数据的矩阵X不是满秩矩阵。非满秩矩阵在求逆时会出现问题。
为了解决这个问题,统计学家引入了岭回归(ridge regression)的概念。
缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果。
岭回归是加了二阶正则项的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小。
归纳总结
1.岭回归可以解决特征数量比样本量多的问题
2.岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维的效果
岭回归用于处理下面两类问题:
1.数据点少于变量个数
2.变量间存在共线性(最小二乘回归得到的系数不稳定,方差很大)
所谓的多重共线性是指一些自变量之间存在较强的线性关系。这种情况在实际应用中非常普遍,如研究高血压与年龄、吸烟年限、饮白酒年限等因素的关系,这些自变量通常是相关的,如果这种相关程度非常高,使用最小二乘法建立回归方程就有可能失效,引起下列不良后果 。
2、实例
岭回归一般用在样本值不够的时候 。
使用岭回归处理波士顿房价信息
2.1 获取数据
#导入波士顿的数据
from sklearn.datasets import load_boston
data=load_boston()
2.2 数据建模
#提取特征数据
features=data.data
#提取目标数据
target=data.target
2.3 特征工程(归一化处理:提高算法模型的精度)
有3种归一化处理方法。
1)普通归一化处理
普通归一化:每个特征数据在全部特征数据中占的比重。
#普通归一化处理
features / features.sum()
从图中可以看出每一列数据之间的量级差别还是比较大的,在这个实例当中,使用普通归一化处理不好。
2)区归一化
区归一化:每一个特征数据在一个区域中占的比重。
#区归一化:
features / (features.max() - features.min())
从图中可以看出每一列数据之间的量级差别还是比较大的,在这个实例当中,使用区归一化处理也不好。
3)函数归一化
使用以下三个函数进行特征数据归一化处理:
Normalizer,MinMaxScaler,StandardScaler
#导包
from sklearn.preprocessing import Normalizer,MinMaxScaler,StandardScaler
Normalizer()
Normalizer().fit_transform(features)
MinMaxScaler()
MinMaxScaler().fit_transform(features)
StandardScaler()
#该种归一化处理效果最优(特征值间的相差的量级最小)
features=StandardScaler().fit_transform(features)
features
4)模型选择
#创建普通线性回归模型对象
linear=LinearRegression()
#创建岭回归模型对象
ri=Ridge(alpha=5)
5)模型评估
拆分数据
#分割数据
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(features,target,
test_size=0.2,
random_state=2)
训练模型
#训练普通线性回归模型
linear.fit(x_train,y_train)
#训练岭回归模型
ri.fit(x_train,y_train)
使用coef_
注意:使用模型调用coef_后,可返回一个装有样本集中所有特征种类对结果的影响权重。 调整模型对象alpha参数会导致coef返回系数的变化。 系数缩减会导致对目标影响较小的特征对结果的权重值缩减到0,这样就只会留下重要的特征进行模型训练。目的:节省训练的开销 。
#普通线性回归模型的coef_
linear.coef_
#岭回归模型的coef_
ri.coef_
获取预测值并进行评分
#获取普通线性回归模型预测值
linear_y_pred=linear.predict(x_test)
#评分
r2_score(y_test,linear_y_pred)
#获取岭回归模型预测值
ri_y_pred=ri.predict(x_test)
r2_score(y_test,ri_y_pred)
两种模型的评分差不多,说明使用岭回归去除一些不重要的特征数据后做出的预测和原来的差不多。
残差直方图
#绘制普通线性回归模型的残差直方图
plt.hist(y_test-linear_y_pred,bins=20)
#绘制岭回归的残差直方图
plt.hist(y_test-ri_y_pred,bins=20)
三、lasso回归
1、原理
拉格朗日乘数法】
对于参数w增加一个限定条件,能到达和岭回归一样的效果:
2、实例
1)导包
from sklearn.linear_model import Lasso
2)创建Lasso模型
#alpha值可以根据评分高低来调整,越低评分越高
la=Lasso(alpha=5)
3)训练模型
la.fit(x_train,y_train)
4)查看coef_
#比对lasso和岭回归模型系数缩减幅度
la.coef_
ri.coef_
coef_越低说明这个特征对目标数据影响越小,从两图可以看出lasso去除不重要的特征数据更多。
5)评分
#获取预测值
la_y_pred=la.predict(x_test)
#评分
r2_score(y_test,la_y_pred)
6)模型调优
la=Lasso(alpha=1)
la.fit(x_train,y_train)
la_y_pred=la.predict(x_test)
r2_score(y_test,la_y_pred)
7)绘制残差直方图
plt.hist(y_test-la_y_pred,bins=20)
残差直方图:越接近0说明预测的值和真实的值重合度越高。
后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号
关注我,我们一起成长~~
python机器学习实现线性回归的更多相关文章
- 吴裕雄 python 机器学习——支持向量机线性回归SVR模型
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm fr ...
- 机器学习之线性回归(纯python实现)][转]
本文转载自:https://juejin.im/post/5a924df16fb9a0634514d6e1 机器学习之线性回归(纯python实现) 线性回归是机器学习中最基本的一个算法,大部分算法都 ...
- Python机器学习笔记:常用评估指标的用法
在机器学习中,性能指标(Metrics)是衡量一个模型好坏的关键,通过衡量模型输出y_predict和y_true之间的某种“距离”得出的. 对学习器的泛化性能进行评估,不仅需要有效可行的试验估计方法 ...
- JavaScript机器学习之线性回归
译者按: AI时代,不会机器学习的JavaScript开发者不是好的前端工程师. 原文: Machine Learning with JavaScript : Part 1 译者: Fundebug ...
- 只需十四步:从零开始掌握 Python 机器学习(附资源)
分享一篇来自机器之心的文章.关于机器学习的起步,讲的还是很清楚的.原文链接在:只需十四步:从零开始掌握Python机器学习(附资源) Python 可以说是现在最流行的机器学习语言,而且你也能在网上找 ...
- Python机器学习笔记:sklearn库的学习
网上有很多关于sklearn的学习教程,大部分都是简单的讲清楚某一方面,其实最好的教程就是官方文档. 官方文档地址:https://scikit-learn.org/stable/ (可是官方文档非常 ...
- Python机器学习笔记:不得不了解的机器学习面试知识点(1)
机器学习岗位的面试中通常会对一些常见的机器学习算法和思想进行提问,在平时的学习过程中可能对算法的理论,注意点,区别会有一定的认识,但是这些知识可能不系统,在回答的时候未必能在短时间内答出自己的认识,因 ...
- Python & 机器学习之项目实践
机器学习是一项经验技能,经验越多越好.在项目建立的过程中,实践是掌握机器学习的最佳手段.在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的. 预测模型项目模板不能 ...
- 机器学习1—简介及Python机器学习环境搭建
简介 前置声明:本专栏的所有文章皆为本人学习时所做笔记而整理成篇,转载需授权且需注明文章来源,禁止商业用途,仅供学习交流.(欢迎大家提供宝贵的意见,共同进步) 正文: 机器学习,顾名思义,就是研究计算 ...
随机推荐
- Centos-服务管理-systemctl
systemctl命令属于systemd软件包,这个软件包不仅可以完成系统的初始化工作,还能对系统和服务进行管理 在centos7中,服务单元取代启动脚本,服务单元以.service为文件扩展名,配置 ...
- mysql-11-DML
#DML语言 /* 数据操作语言 插入:insert 修改:update 删除:delete */ #一.插入语句 /* 语法: insert into 表名(列名...) values(新值...) ...
- mysql-5-aggregation
#2.分组函数 /* 分组函数/聚合函数:传入一组值,经过统计处理,得到一个输出值 sum, avg, max, min, count */ USE myemployees; #简单使用 SELECT ...
- 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 02 封装的代码实现
088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 02 封装的代码实现 本文知识点:Java封装的代码实现 说明:因为时间紧张,本人写博客过程中只 ...
- 这就是小学生也会用的四则计算练习APP吗?- by软工结对编程项目作业
结对编程项目 软件工程 这就是链接 作业要求 这就是链接 作业目标 熟悉在未结对情况下如何结对开发项目 Github与合作者 合作者(学号): 区德明:318005422 虚左以待 Github链接: ...
- 「Redis」字符串
原文链接:https://www.changxuan.top/?p=1109 简介 Redis 中自定义的字符串结构. 字符串是 Redis 中最常用的一种数据类型,在 Redis 中专门封装了一个字 ...
- LiteOS-任务篇-源码分析-删除任务函数
目录 前言 笔录草稿 源码分析 LOS_TaskDelete函数源码分析 完整源码 参考 链接 前言 20201009 LiteOS 2018 需要会通用链表 笔录草稿 源码分析 LOS_TaskDe ...
- 多测师浅谈 学员实现价值就是我们的幸福_高级讲师肖sir
学员实现价值就是我们的幸福 作为一名资深的IT高级讲师,在传统的行业IT薪资基本都是过万,作为一名IT培训教师,培养出在不同领域的测试,并且接触各种各样的产品,目前市场流行的比如银行业务系统,语音类系 ...
- MeteoInfoLab脚本示例:加载图片和透明图层
MeteoInfoLab的georead函数提供了读取shape文件.image文件(JPG.PNG等,需要有相应的地理定位文件)文件生成图层的功能(事实上shaperead也是同样的功能,不过函数名 ...
- 2020年在项目中使用MVVM正确姿势,你用对了吗?
最近看到了几篇与 Jetpack MVVM 有关到文章,使我不禁也想淌一下这场混水.我是在 2017 年下半年接触的 Jetpack 的那套开发工具,并且后来一直将其作为开发的主要框架.在这段时间的使 ...