线性回归

关注公众号“轻松学编程”了解更多。

关键词】最小二乘法,线性

一、普通线性回归

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机器学习实现线性回归的更多相关文章

  1. 吴裕雄 python 机器学习——支持向量机线性回归SVR模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm fr ...

  2. 机器学习之线性回归(纯python实现)][转]

    本文转载自:https://juejin.im/post/5a924df16fb9a0634514d6e1 机器学习之线性回归(纯python实现) 线性回归是机器学习中最基本的一个算法,大部分算法都 ...

  3. Python机器学习笔记:常用评估指标的用法

    在机器学习中,性能指标(Metrics)是衡量一个模型好坏的关键,通过衡量模型输出y_predict和y_true之间的某种“距离”得出的. 对学习器的泛化性能进行评估,不仅需要有效可行的试验估计方法 ...

  4. JavaScript机器学习之线性回归

    译者按: AI时代,不会机器学习的JavaScript开发者不是好的前端工程师. 原文: Machine Learning with JavaScript : Part 1 译者: Fundebug ...

  5. 只需十四步:从零开始掌握 Python 机器学习(附资源)

    分享一篇来自机器之心的文章.关于机器学习的起步,讲的还是很清楚的.原文链接在:只需十四步:从零开始掌握Python机器学习(附资源) Python 可以说是现在最流行的机器学习语言,而且你也能在网上找 ...

  6. Python机器学习笔记:sklearn库的学习

    网上有很多关于sklearn的学习教程,大部分都是简单的讲清楚某一方面,其实最好的教程就是官方文档. 官方文档地址:https://scikit-learn.org/stable/ (可是官方文档非常 ...

  7. Python机器学习笔记:不得不了解的机器学习面试知识点(1)

    机器学习岗位的面试中通常会对一些常见的机器学习算法和思想进行提问,在平时的学习过程中可能对算法的理论,注意点,区别会有一定的认识,但是这些知识可能不系统,在回答的时候未必能在短时间内答出自己的认识,因 ...

  8. Python & 机器学习之项目实践

    机器学习是一项经验技能,经验越多越好.在项目建立的过程中,实践是掌握机器学习的最佳手段.在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的. 预测模型项目模板不能 ...

  9. 机器学习1—简介及Python机器学习环境搭建

    简介 前置声明:本专栏的所有文章皆为本人学习时所做笔记而整理成篇,转载需授权且需注明文章来源,禁止商业用途,仅供学习交流.(欢迎大家提供宝贵的意见,共同进步) 正文: 机器学习,顾名思义,就是研究计算 ...

随机推荐

  1. Hbuilder MUI 页面刷新及页面传值问题

    一.页面刷新问题 1.父页面A跳转到子页面B,B页面修改数据后再跳回A页面,刷新A页面数据 (1).父页面A代码 window.addEventListener("pageflowrefre ...

  2. spring-boot-route(二)读取配置文件的几种方式

    Spring Boot提供了两种格式的配置文件,分别是properties 和 yml.Spring Boot最大的特点就是自动化配置,如果我们想修改自动化配置的默认值,就可以通过配置文件来指定自己服 ...

  3. P5091 【模板】扩展欧拉定理

    题目链接 昨天考试考到了欧拉公式,结果发现自己不会,就来恶补一下. 欧拉公式 \(a^b \bmod p = a^{b}\) \(b < \varphi(p)\) \(a^b \bmod p = ...

  4. 刷LeetCode的简易姿势

    近期抽空刷了刷LeetCode,算是补补课. 由于不是很习惯直接在网页上Coding&Debug,所以还是在本地环境下进行编码调试,觉得基本OK后再在网页上提交. 主要采用Python3进行提 ...

  5. Black-Lives-Matter-Resources

    下载 Black-Lives-Matter-ResourcesBlack-Lives-Matter-Resources 关于最近在美国发生的事件的资源列表 链接 描述 由于(可选) 插入链接 在这里插 ...

  6. 如何检测ASP中的浏览器。NET与浏览器文件

    介绍 ASP.NET是一个用于使用Web表单.MVC.Web API和SignalR(这是官方定义)构建Web应用程序的高生产力框架.它是在.net框架上开发RESTful应用程序或使用HTML.CS ...

  7. 匿名内部类和Lambda表达式是一样的吗?

    先看一下匿名内部类长什么样子: 1 package com.jvm.demo.test2; 2 3 public class InnerClassTest { 4 5 public static vo ...

  8. tomcat加载失败

    tomcat启动加载信息如下: Connected to server [2017-10-16 09:02:28,149] Artifact basic-admin:war exploded: Art ...

  9. 用IPV6隧道连接IPV4孤岛

    hostA和hostB之间是IPV6连接的,但是之前的服务只能支持IPV4,兼容IPV6比较困难.所以用隧道实现hostA和hostB之间用IPV4连接. hostA如下: ip -6 addr ad ...

  10. scrapy LinkExtractors

    class scrapy.linkextractors.LinkExtractor Link Extractors 的目的很简单: 提取链接。 每个LinkExtractor有唯一的公共方法是 ext ...