常用的三种线性模型算法–线性回归模型、岭回归模型、套索回归模型

线性模型基本概念
线性模型的一般预测模型是下面这个样子的,一般有多个变量,也可以称为多个特征x1、x2、x3 …

最简单的线性模型就是一条直线直线的方程式,b0是截距,b1是斜率

比如说我们的画一条直线:y=0.5*x+3,他是最简单的线性模型

import numpy as np
import matplotlib.pyplot as plt
#生成-5到5的元素数为100的数组
x=np.linspace(-5,5,100)
#输入直线方程
y=0.5*x+3
plt.plot(x,y,c='orange')
#图标题
plt.title('straight line')
plt.show()

在初中的数学我们都知道是两点确定一条直线,比如说下面我们根据(1,3)、(4,5)来画出一条直线

import numpy as np
import matplotlib.pyplot as plt
#导入线性回归模型
from sklearn.linear_model import LinearRegression
#导入横纵坐标
X=[[1],[4]]
y=[3,5]
#线性拟合
lr=LinearRegression().fit(X,y)
#画图
z=np.linspace(0,5,20)
plt.scatter(X,y,s=80)
plt.plot(z,lr.predict(z.reshape(-1,1)),c='k')
plt.title('Straight Line')
plt.show()print('\n\n\n 直线方程:')
print('=======\n')
print('y={:.3f}'.format(lr.coef_[0]),'x','+{:.3f}'.format(lr.intercept_))
print('=======\n')
print('\n\n\n')直线方程:
=======y=0.667 x +2.333
=======

接下是三个点,我们多加一个点(3,3),你会看到当有多个点的时候直线没有办法穿过三个点,所以这个时候我们需要画出一条和三个点的距离和最小的直线

X=[[1],[4],[3]]
y=[3,5,3]
lr=LinearRegression().fit(X,y)
z=np.linspace(0,5,20)
plt.scatter(X,y,s=80)
plt.plot(z,lr.predict(z.reshape(-1,1)),c='k')
plt.title('Straight Line ')
plt.show()print('\n\n\n 直线方程:')
print('=======\n')
print('y={:.3f}'.format(lr.coef_[0]),'x','+{:.3f}'.format(lr.intercept_))
print('=======\n')
print('\n\n\n')直线方程:
=======y=0.571 x +2.143
=======

下面如果我们用scikit-learn来生成非常多的点,这个时候用python的库来绘制一条最优解的曲线就显得非常方便了

from sklearn.datasets import make_regression
#用于生产回归分析数据
X,y=make_regression(n_samples=50,n_features=1,n_informative=1,noise=50,random_state=1)
#使用线性模型拟合
reg=LinearRegression()
reg.fit(X,y)
#生产等差数列用来画图
z=np.linspace(-3,3,200).reshape(-1,1)
plt.scatter(X,y,c='b',s=60)
plt.plot(z,reg.predict(z),c='k')
plt.title('Linear Regression')print('\n\n\n 直线方程:')
print('=======\n')
print('y={:.3f}'.format(reg.coef_[0]),'x','+{:.3f}'.format(reg.intercept_))
print('=======\n')
print('\n\n\n')直线方程:
=======y=79.525 x +10.922
=======

线性回归
线性回归的原理是找到训练数据集中的y和真实值的平方差最小。接下里我们还是用make_regression函数来生产多数据点。这里生成了100个,特征数量为2 的点

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
X,y=make_regression(n_samples=100,n_features=2,n_informative=2,random_state=38)
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=8)
lr=LinearRegression().fit(X_train,y_train)print('\n\n\n ')
print('=======\n')
print("lr.coef_:{}".format(lr.coef_[:]))
print("lr.intercept_:{}".format(lr.intercept_))
print('=======\n')
print('\n\n\n')#这里斜率存储在coef_中,截距储存在intercept_中
=======
lr.coef_:[70.38592453  7.43213621]
lr.intercept_:-1.4210854715202004e-14
=======

线性回归的表现,最高分是1.00

print('\n\n\n')
print('=======\n')
print(" train_score: {:.2f}".format(lr.score(X_train,y_train)))
print("test_score: {:.2f}".format(lr.score(X_test,y_test)))
print('=======\n')
print('\n\n\n') =======train_score: 1.00
test_score: 1.00
=======

这里我们换个数据,我们从数据库导入一个现实生活的数据,糖尿病的一些数据

from sklearn.datasets import load_diabetes
#导入真实数据集
X,y=load_diabetes().data,load_diabetes().target
#拆分成训练集和数据集
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=8)
#用线性模型拟合
lr=LinearRegression().fit(X_train,y_train)print('\n\n\n')
print('=======\n')
print(" train_score: {:.2f}".format(lr.score(X_train,y_train)))
print("test_score: {:.2f}".format(lr.score(X_test,y_test)))
print('=======\n')
print('\n\n\n') =======train_score: 0.53
test_score: 0.46
=======

岭回归-L2正规化线性模型
岭回归是一种可以避免过拟合的线性模型,在岭回归模型里面,会保存所有的特征变量,但是会减少特征变量的系数值。在回归模型中可以改变alpha的参数来控制减小特征变量系数的参数

from sklearn.linear_model import Ridge
ridge =Ridge().fit(X_train,y_train)
print('\n\n\n')
print('=======\n')
print(" train_score: {:.2f}".format(ridge.score(X_train,y_train)))
print("test_score: {:.2f}".format(ridge.score(X_test,y_test)))
print('=======\n')
print('\n\n\n')=======train_score: 0.43
test_score: 0.43
=======

我们可以试着把alpha的大小改为10、0.1、1,来看下他们的打分。同时我们把图形画出来看下他们的差异


from sklearn.linear_model import Ridge
ridge10 =Ridge(alpha=10).fit(X_train,y_train)
print('\n\n\n')
print('=======\n')
print(" train_score: {:.2f}".format(ridge10.score(X_train,y_train)))
print("test_score: {:.2f}".format(ridge10.score(X_test,y_test)))
print('=======\n')
print('\n\n\n')=======train_score: 0.15
test_score: 0.16
=======from sklearn.linear_model import Ridge
ridge01 =Ridge(alpha=0.1).fit(X_train,y_train)
print('\n\n\n')
print('=======\n')
print(" train_score: {:.2f}".format(ridge01.score(X_train,y_train)))
print("test_score: {:.2f}".format(ridge01.score(X_test,y_test)))
print('=======\n')
print('\n\n\n')=======train_score: 0.52
test_score: 0.47
=======plt.plot(ridge.coef_,'s',label='Ridge alpha=1')
plt.plot(ridge10.coef_,'^',label='Ridge alpha=10')
plt.plot(ridge01.coef_,'v',label='Ridge alpha=0.1')
plt.plot(lr.coef_,'o',label='linear regression')
plt.xlabel("coefficient index")
plt.ylabel("coefficient magnitude")
plt.hlines(0,0,len(lr.coef_))
plt.legend()!


我们可以看出
alpha=10,特征变量的系数基本上为0附近
alpha=1特征变量的系数变大了
alpha=0.1特征变量的系数变得非常大了,几乎与线性回归的重合

from sklearn.model_selection import learning_curve,KFold
def plot_learning_curve(est,X,y):training_set_size,train_scores,test_scores=learning_curve(est,X,y,train_sizes=np.linspace(.1,1,20),cv=KFold(20,shuffle=True,random_state=1))estimator_name=est.__class__.__name__line=plt.plot(training_set_size,train_scores.mean(axis=1),'--',label="training"+estimator_name)plt.plot(training_set_size,test_scores.mean(axis=1),'-',label="test"+estimator_name,c=line[0].get_color())plt.xlabel('Training set size')plt.ylabel('Score')plt.ylim(0,1.1)
plot_learning_curve(Ridge(alpha=1),X,y)
plot_learning_curve(LinearRegression(),X,y)
plt.legend(loc=(0,1.05),ncol=2,fontsize=11)

我们也可以画出alpha为1的岭回归模型和线性回归莫模型

岭回归和线性回归主要的区别是正规化,在少数据的时候岭回归的打分在训练数据集的时候要低,但是在测试数据集都差不多。数据足够多两个模型没有太大差异,但是如果数据少的话一般是岭回归表现好。
套索回归-L1正规化的线性模型
和岭回归很想,套索回归会把系数限制在0附近,但是套索回归会让一部分数据的系数等于零,有助于让模型更容易理解

from sklearn.linear_model import Lasso
lasso=Lasso().fit(X_train,y_train)
print('\n\n\n')
print('=======\n')
print(" train_score: {:.2f}".format(lasso.score(X_train,y_train)))
print("test_score: {:.2f}".format(lasso.score(X_test,y_test)))
print('=======\n')
print('\n\n\n')=======train_score: 0.36
test_score: 0.37
=======from sklearn.linear_model import Lasso
lasso01=Lasso(alpha=0.1,max_iter=100000).fit(X_train,y_train)
print('\n\n\n')
print('=======\n')
print(" train_score: {:.2f}".format(lasso.score(X_train,y_train)))
print("test_score: {:.2f}".format(lasso.score(X_test,y_test)))
print('=======\n')
print('\n\n\n')=======train_score: 0.53
test_score: 0.46
=======from sklearn.linear_model import Lasso
lasso00001=Lasso(alpha=0.0001,max_iter=100000).fit(X_train,y_train)
print('\n\n\n')
print('=======\n')
print(" train_score: {:.2f}".format(lasso.score(X_train,y_train)))
print("test_score: {:.2f}".format(lasso.score(X_test,y_test)))
print('=======\n')
print('\n\n\n')=======train_score: 0.53
test_score: 0.46
=======from sklearn.linear_model import Lasso
lasso011=Lasso(alpha=0.11,max_iter=100000).fit(X_train,y_train)
print('\n\n\n')
print('=======\n')
print(" train_score: {:.2f}".format(lasso.score(X_train,y_train)))
print("test_score: {:.2f}".format(lasso.score(X_test,y_test)))
print('=======\n')
print('\n\n\n')=======train_score: 0.53
test_score: 0.46
=======

我们通过图像来了解一下


plt.plot(lasso.coef_,'s',label='Ridge alpha=1')
plt.plot(lasso011.coef_,'^',label='Ridge alpha=0.11')
plt.plot(lasso00001.coef_,'v',label='Ridge alpha=0.0001')
plt.plot(ridge01.coef_,'o',label='Ridge alpha=0.1')plt.xlabel("coefficient index")
plt.ylabel("coefficient magnitude")

alpha=1,大部分系数为0
alpha=0.01,还是很多0,但少了不少
alpha=0.0001,这个时候很多点都不是零了。

常用的三种线性模型算法--线性回归模型、岭回归模型、套索回归模型相关推荐

  1. 常用的三种白平衡算法整理

    1.灰度世界法 https://blog.csdn.net/u012736685/article/details/50730784 2.完美反射法 https://blog.csdn.net/just ...

  2. Xdelta3 bsdiff Courgette三种差分算法比较

    今天介绍常用的三种差分算法,分别是Xdelta3 bsdiff Courgette. Xdelta3 官网地址: http://xdelta.org 源码地址:https://github.com/j ...

  3. 静电放电(ESD)最常用的三种模型及其防护设计

    ESD:Electrostatic Discharge,即是静电放电,每个从事硬件设计和生产的工程师都必须掌握 ESD 的相关知识.为了定量表征 ESD 特性,一般将 ESD 转化成模型表达方式,ES ...

  4. ESD静电放电最常用的三种模型及其防护设计

    推荐好文 建议直接看链接 1.静电放电最常用的三种模型及其防护设计 http://www.360doc.com/content/17/0827/14/32066980_682502209.shtml ...

  5. 机器学习萌新必备的三种优化算法 | 选型指南

    作者 | Nasir Hemed 编译 | Rachel 出品 | AI科技大本营(id:rgznai100) [导读]在本文中,作者对常用的三种机器学习优化算法(牛顿法.梯度下降法.最速下降法)进行 ...

  6. 机器学习中的矩阵求导的一点总结(三种方法求线性回归最佳参数)

    机器学习中的矩阵求导的一点总结(三种方法求线性回归最佳参数) 转载于:https://blog.csdn.net/promisejia/article/details/80159619?ops_req ...

  7. ETL常用的三种工具介绍及对比 Datastage,Informatica 和 Kettle

    大家好,我是梦想家 Alex ~ ETL是数据仓库中的非常重要的一环,是承前启后的必要的一步.ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最 ...

  8. ETL常用的三种工具介绍及对比Datastage,Informatica

    ETL是数据仓库中的非常重要的一环,是承前启后的必要的一步.ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为 ...

  9. python 三种聚类算法(K-means,AGNES,DBScan)

    python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan) 更新时间:2019年06月27日 14:44:44   作者:weixin_42134141 这篇文章主要介绍了pyth ...

最新文章

  1. 二进制与十进制的小数位怎么转?
  2. jQuery ajax 和 普通js ajax 笔记
  3. 计算机视觉中的多视图几何_基于深度学习的视觉三维重建研究总结
  4. Get sdcard directory by adb
  5. [NOIP2013] 花匠
  6. android学习笔记---52_发送状态栏通知
  7. Tomcat服务器响应特别慢(服务器假死)的解决办法
  8. java中重写equals方法
  9. 项目管理实战课程总结
  10. B端产品经理基本介绍
  11. Python利用wakeonlan库 局域网 网络唤醒电脑
  12. CentOS8桌面环境打开终端
  13. vue 两种文档下载方法的实现(后台传递文件流,后台返回文件下载地址)
  14. c语言汇编混合编译不了,IAR汇编与C语言混合编程的问题(内附源程序)
  15. javascript特效3月12日软件速递:Mozilla Firefox发布
  16. 【AI简报20210702期】骁龙888 plus发布、RISC-V处理器大飞跃
  17. 数学建模养老保险问题matlab,全国大学生数学建模竞赛C题 企业退休职工养老金制度的改革...
  18. 2×3卡方检验prism_抽样分布之卡方分布02 – 分布拟合优度检验
  19. 有限元-朗格朗日和欧拉描述的区别
  20. Java打印流——PrintStream

热门文章

  1. 《活着中文版自序》感悟
  2. WIN7下网络共享设置
  3. Git 04 ---用Idea合并git分支
  4. 解决低版本matlab打开高版本Matlab的.m文件时,出现中文乱码的问题。
  5. 压力测试工具tsung
  6. 实时音视频开发理论必备:如何省流量?视频高度压缩背后的预测技术
  7. 跨平台手动迁移虚拟机
  8. 数字电位器X9312
  9. 一荣俱荣,豪取多项冠军后荣耀着手年终奖改革
  10. CANoe-第3个仿真工程-总线仿真- 3-2 工程实现