线性回归

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

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

一、普通线性回归

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. Kubernetes Pod水平自动伸缩(HPA)

    HPA简介 HAP,全称 Horizontal Pod Autoscaler, 可以基于 CPU 利用率自动扩缩 ReplicationController.Deployment 和 ReplicaS ...

  2. Go map相关

    map Go语言中的map是一种无序的,基于key-value的数据解构,在Go语言中map是引用类型,因此必须初始化后才能使用. 以下示例将展示如何声明一个map类型,以及如何简单使用. 需要注意的 ...

  3. Java知识系统回顾整理01基础05控制流程08综合练习

    一.练习--黄金分割点 题目: 寻找某两个数相除,其结果 离黄金分割点 0.618最近 分母和分子不能同时为偶数 分母和分子 取值范围在[1,20] (即1到20) 要求效果: public clas ...

  4. P1297 单选错位 题解

    这是一道我们的考试题 前置芝士 期望 定义:试验中每次可能结果的概率乘以其结果的总和(来自百度某科 滑稽) 性质:\(E(ax+by)\) = \(xE(a)\) * \(yE(b)\) 计算式: \ ...

  5. [POI2010]PIL-Pilots 单调队列

    [POI2010]PIL-Pilots 题意: 给定一个序列和一个数值k,求一段连续最大区间是的最大值与最小值之差小于k: 思路: 因为要维护最大值和最小值并且连续,使用两个单调队列分别同时维护最大最 ...

  6. vue中,使用 es6的 ` 符号给字符串之间换行

    我这里分功能是点击"复制范围",就相当于复制图上的坐标点一样的数据和格式: "复制功能"的代码如下: copyPoints() { const vm = thi ...

  7. RHSA-2018:1700-重要: procps-ng 安全更新(存在EXP、本地提权)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  8. GDB将所有线程堆栈输出到文件

    在调试多线程程序时,经常需要查看线程堆栈信息,如果线程数目过多,每次查看一个线程堆栈,繁琐耗时.下面介绍一种一次性将所有线程堆栈输出到文件的方法. 首先,将gdb attach到调试线程 gdb -p ...

  9. 联赛模拟测试18 A. 施工 单调队列(栈)优化DP

    题目描述 分析 对于 \(Subtask\ 1\),可以写一个 \(n^3\) 的 \(DP\),\(f[i][j]\) 代表第 \(i\) 个建筑高度为 \(j\) 时的最小花费,随便转移即可 时间 ...

  10. centos8安装kafka(单机方式)

    一,下载kafka 1,官网地址 http://kafka.apache.org/downloads.html 2,下载 [root@localhost source]# wget http://mi ...