更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html

scikit-learn库之线性回归

由于scikit-learn库中sclearn.linear_model提供了多种支持线性回归分析的类,本文主要总结一些常用的线性回归的类,并且由于是从官方文档翻译而来,翻译会略有偏颇,如果有兴趣想了解其他类的使用方法的同学也可以去scikit-learn官方文档查看https://scikit-learn.org/stable/modules/classes.html#module-sklearn.linear_model

在讲线性回归理论的时候讲到了,线性回归的目的是找到一个线性回归系数向量\(\omega\),使得输入特征\(X\)和输出向量\(Y\)之间有一个

\[Y = X\omega
\]

的映射关系,接下来的线性回归模型和线性回归模型的思想类似。假设一个数据集有\(m\)实例,每个实例有\(n\)个特征,则其中\(Y\)的维度是\(m*1\),\(X\)的维度是\(m*n\),\(\omega\)的维度是\(n*1\)。

使用线性回归的目的就是找到一个合适的线性回归系数\(\omega\)能够最小化我们定义的目标函数,又由于最小化目标函数的优化方法的不同,会有不同的线性回归算法。

由于其他版本的线性回归模型的参数类似于LinearRegression,即其他类型的线性回归模型的参数详解都会跳过,只会讲解它与LinearRegression的不同之处。我们接下来的目的就是为了给大家介绍scikit-learn库中常用的线性回归模型。

一、LinearRegression

1.1 使用场景

LinearRegression回归模型,即我们在线性回归中讲到的普通线性回归,该普通线性回归可以处理一元线性回归,也可以处理多元线性回归,但是该类使用的优化方法是最小二乘法

通常情况下该类是我们使用线性回归处理线性问题的首选方法,因为它的目标函数较其他线性回归简单,计算量小,如果它拟合数据出现过拟合问题则可以考虑使用正则化形式的线性回归。

1.2 代码

import numpy as np
from sklearn.linear_model import LinearRegression X = np.array([[2, 0], [1, 9], [6, 6], [8, 8]])
# y = 1 * x_0 + 2 * x_1 + 3
y = np.dot(X, np.array([6, 8])) + 3
reg = LinearRegression()
reg.fit(X, y)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
normalize=False)
reg.score(X, y)
1.0
reg.coef_
array([6., 8.])
reg.intercept_
2.999999999999986
reg.predict(np.array([[8, 6]]))
array([99.])

1.3 参数详解

  • fit_intercept:截距(偏置单元),bool类型。是否存在截距或者偏置单元。如果使用中心化的数据(中心点为0的数据),可以考虑设置fit_intercept=False。默认为True。
  • normalize:标准化数据,bool类型。当fit_intercept=False的时候,这个参数会被自动忽略;如果fit_intercept=True,回归器会标准化输入数据,该标准化方式为:减去平均值,并且除以相应的二范数。建议在使用fit()训练模型之前使用sklearn.preprocessing.StandardScaler对数据标准化,同时设置normalize=False。默认为False。
  • copy_X:复制数据,bool类型。如果copy_X=False,可能会因为对数据中心化把原始X数据覆盖。默认为True。
  • n_jobs:并行数,int类型。n_jobs=1使用1个cpu运行程序;n_jobs=2,使用2个cpu运行程序;n_jobs=-1,使用所有cpu运行程序。默认为1。

1.4 属性

  • coef_:array类型,线性回归系数。
  • intercept_:array类型,截距。

1.5 方法

  • fit(X,y,sample_weight=None):把数据放入模型中训练模型,其中sample_weight=None是array类型可以对训练集中实例添加权重,即对训练集中不同的数据增加不同的权重。
  • get_params([deep]):返回模型的参数,例如可以用于Pipeline中。
from sklearn.pipeline import Pipeline  

p =Pipeline([
('poly', PolynomialFeatures()),
('linear', LinearRegression(fit_intercept=False))])
lin = p.get_params('linear')['linear']
print(lin.coef_)
  • predict(X):通过样本X得到X对应的预测值。
  • score(X, y[, sample_weight]):基于报告决定系数\(R^2\)评估模型。
  • set_prams(**params):创建模型参数。

1.5.1 报告决定系数

报告决定系数\((R^2)\),可以理解成MSE的标准版,\(R^2\)的公式为

\[R^2 = 1-{\frac {{\frac{1}{n}\sum_{i=1}^n(y^{(i)}-\hat{y^{(i)}})^2}} {{\frac{1}{n}}\sum_{i=1}^n(y^{(i)}-\mu_{(y)})^2} }
\]

其中\(\mu_{(y)}\)是\(y\)的平均值,即\({{\frac{1}{n}}\sum_{i=1}^n(y^{(i)}-\mu_{(y)})^2}\)为\(y\)的方差,公式可以写成

\[R^2 = 1-{\frac{MSE}{Var(y)}}
\]

\(R^2\)的取值范围在\(0-1\)之间,如果\(R^2=1\),则均方误差\(MSE=0\),即模型完美的拟合数据。

二、ARDRegression

当数据集中有很多缺失值或异常值时使用ARDRegression模型,该模型属于贝叶斯回归模型。该模型会对模型输出\(Y\)和模型参数\(\omega\)作出分布假设,并且正则化参数alpha也会从数据中估计得到,虽然该模型对异常值鲁棒性很好,但由于该模型计算量大,耗时,一般情况不推荐使用,此处不多赘述。

三、BayesianRidge

该模型类似于ARDRegression模型,两者都属于贝叶斯回归,不同之处在于对\(\omega\)的分布假设不同。由于该模型的目标函数类似于Ridge模型的目标函数,因此取名BayesianRidge。但由于该模型同样计算量大,耗时,一般情况下也不推荐使用,此处不多赘述。

四、ElasticNet

ElasticNet模型的优化方法是坐标轴下降法,该模型由L1正则化和L2正则化的加权得到,如果使用L1正则化和L2正则化都不行的时候,可以考虑使用该模型。

该模型由于增加了参数alphal1_ratio,需要手动调参,通常使用接下来的LassoCV

五、ElasticNetCV

ElasticNetCV模型在目标函数和优化方式类似于ElasticNet,但是可以自己手动输入10组、100组参数alphal1_ratio,该模型会通过交叉验证后给你这组参数中最优模型。

六、Lasso

Lasso模型的优化方法是坐标轴下降法,该模型即线性回归L1正则化,该。如果数据集的特征维度较高,可以使用该模型,该模型可以把一些较小的回归系数直接变为\(0\),由于减少了数据集的特征维度,也会间接的减轻模型过拟合问题,增强模型的泛化能力。

该模型由于会把一些较小的回归系数变为\(0\),既可以找出重要的特征,对数据集的解释能力强。

该模型由于增加了参数alpha,需要手动调参,通常使用接下来的LassoCV

七、LassoCV

LassoCV模型在目标函数和优化方式类似于Lasso,但是可以自己手动输入10组、100组参数alpha,该模型会通过交叉验证后给你这组参数中最优模型。

八、LassoLars

LassoLars模型的优化方法是最小角回归法,该模型类似于Lasso模型,但是该模型优化方法为。

该模型由于增加了参数alpha,需要手动调参,通常使用接下来的LassoLarsCV

九、LassoLarsCV

LassoLarsCV模型在目标函数和优化方式类似于LassoLars,但是可以自己手动输入10组、100组参数alpha,该模型会通过交叉验证后给你这组参数中最优模型。

十、LassoLarsIC

LassoLarsIC模型类似于Lasso模型,不同之处在于它并不使用交叉验证的方式得到最优模型。它基于AIC和BIC准则,一轮就可以找到找到一个最优alpha和最优模型,而交叉验证如果使用\(k\)折交叉验证,则需要\(k-1\)次才能找到最优模型。

该模型从上述讲述看起来是很完美的,但是该模型要求数据集是由某个假设的模型产生的,并且如果当特征数量大于实例数量的时候该模型可能会成为一个较差的模型,所以在工业上一般不推荐使用。

十一、MutilTaskLasso

MutilTaskLasso模型的优化方法是坐标轴下降法,模型中的MutilTask可以理解成“多个”而不是“多进程”,即一次性使用多个L1正则化线性回归模型拟合数据,有时候也称之为共享特征协同回归。

普通线性回归的模型是

\[Y = X\omega
\]

其中假设一个数据集有\(m\)实例,每个实例有\(n\)个特征,则其中\(Y\)的维度是\(m*1\),\(X\)的维度是\(m*n\),\(\omega\)的维度是\(n*1\)。

该模型去掉正则化项是

\[Y = XW
\]

其中假设一个数据集有\(m\)实例,每个实例有\(n\)个特征,则其中\(Y\)的维度是\(m*k\),\(X\)的维度是\(m*n\),\(W\)的维度是\(n*k\),其中\(k\)为回归模型的个数,即该模型的fit()方法可以传入\(k\)维的特征。

该模型由于增加了参数alpha和\(k\),需要手动调参,通常使用接下来的MutilTaskLassoCV

十二、MutilTaskElasticNet

MutilTaskElasticNet模型的优化方法是坐标轴下降法,该模型类似于MutilTaskLasso模型,只是在正则化项上前者使用了L1正则项,后者使用了弹性网络正则项。

该模型由于增加了参数alphal1_ratio,需要手动调参,通常使用接下来的LassoCV

十三、MutilTaskLassoCV

MutilTaskLassoCV模型在目标函数和优化方式类似于MutilTaskLasso,但是可以自己手动输入10组、100组参数alpha,该模型会通过交叉验证后给你这组参数中最优模型。

十四、MutilTaskElasticNetCV

该模型在目标函数和优化方式类似于Lasso,但是可以自己手动输入10组、100组参数alphal1_ratio,该模型会通过交叉验证后给你这组参数中最优模型。

十五、OrthogonalMatchingPursuit

OrthogonalMatchingPursuit模型优化方法是前向选择算法,优化方法速度虽然快,但是精确度较低。

该模型使用参数n_nonzero_coefs限制模型参数\(\omega\)向量中元素非\(0\)的个数,由于该特征可以用于稀疏特征模型的特征选择上,这一点类似于Lasso模型,但是由于优化方法前向选择算法,一般不推荐使用。

该模型由于增加了参数n_nonzero_coefs,需要手动调参,通常使用接下来的LassoCV

十六、OrthogonalMatchingPursuitCV

OrthogonalMatchingPursuitCV模型在目标函数和优化方式类似于OrthogonalMatchingPursuitCV,但是可以自己手动输入10组、100组参数n_nonzero_coefs,该模型会通过交叉验证后给你这组参数中最优模型。

十七、RANSACRegressor

RANSACRegressor模型使用的优化算法是RANSACR算法,该算法可以控制使用部分区域的数据集训练模型。

可以参考《RANSAC算法线性回归(波斯顿房价预测)》

十八、Ridge

Ridge模型的优化方法是最小二乘法,该模型即线性回归L2正则化,一般使用LinearRegression模型时模型过拟合时可以使用该方法。

由于额外增加了alpha参数,一般情况下需要自己手动调参,所以可以在自己测试的时候使用,一般工业上使用较多的是接下来的RidgeCV

十九、RidgeCV

RidgeCV模型在目标函数和优化方式类似于Ridge,但是可以自己手动输入10组、100组参数alpha,该模型会通过交叉验证后给你这组参数中最优模型。

02-05 scikit-learn库之线性回归的更多相关文章

  1. (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探

    一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...

  2. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  3. scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)

    scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...

  4. 【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用

    [网络爬虫入门02]HTTP客户端库Requests的基本原理与基础应用 广东职业技术学院  欧浩源 1.引言 实现网络爬虫的第一步就是要建立网络连接并向服务器或网页等网络资源发起请求.urllib是 ...

  5. (原创)(四)机器学习笔记之Scikit Learn的Logistic回归初探

    目录 5.3 使用LogisticRegressionCV进行正则化的 Logistic Regression 参数调优 一.Scikit Learn中有关logistics回归函数的介绍 1. 交叉 ...

  6. 怎样用Python的Scikit-Learn库实现线性回归?

    来源商业新知号网,原标题:用Python的Scikit-Learn库实现线性回归 回归和分类是两种 监督 机器 学习算法, 前者预测连续值输出,而后者预测离散输出. 例如,用美元预测房屋的价格是回归问 ...

  7. Scikit Learn

    Scikit Learn Scikit-Learn简称sklearn,基于 Python 语言的,简单高效的数据挖掘和数据分析工具,建立在 NumPy,SciPy 和 matplotlib 上.

  8. python进阶05 常用问题库(1)json os os.path模块

    python进阶05 常用问题库(1)json os os.path模块 一.json模块(数据交互) web开发和爬虫开发都离不开数据交互,web开发是做网站后台的,要跟网站前端进行数据交互 1.什 ...

  9. 使用TensorFlow v2库实现线性回归

    使用TensorFlow v2库实现线性回归 此示例使用简单方法来更好地理解训练过程背后的所有机制 from __future__ import absolute_import, division, ...

随机推荐

  1. 前端利器躬行记(4)——webpack进阶

    webpack是一个非常强大的工具,除了前文所介绍的基础概念之外,还有各种进阶应用,例如Source Map.模块热替换.集成等,本文会对这些内容做依次讲解. 一. runtime和manifest ...

  2. [ERR] 1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

    昨天,在测试新的数据库时,迁移表遇到了这个问题.现在记录一下解决方案. 1.在配置文件中添加关闭严格模式的配置:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS ...

  3. 做一个完整的Hadoop项目

     1. 完整的数据流图 由同ip访问的次数: SQL查询 select ip,count(ip) from tablename Group by ip; 基于Hadoop分析 使用Hadoop分析,需 ...

  4. Spring Cloud(二):服务消费者

    创建“服务消费者” 创建一个基础的Spring Boot工程,命名为springboot-consumer,并在pom.xml中引入需要的依赖内容: <dependency> <gr ...

  5. Android图片的缩放效果

    一.概述 Android 图片要实现:手势滑动,双击变大,多点触控的效果. 其实是有一定难度的,我们需要用Matrix ,GestureDetector 等等需要完成一个复杂的逻辑才能实现,然而今天我 ...

  6. Unity3D_07_日志、文本打印

    1.Debug.Log(“hello”); 2.打开控制台查看日志:ctrl+shift+c 3.输出一个位置的坐标(需要转换成字符串.ToString()) Vector3 worldPositio ...

  7. mybatis #号与$号的区别

    区别: 在sql中当传入的参数是字符型,则用#号会带上单引号,不会引起sql注入: 在sql中当传入的参数是字符型,则用$号不会带上单引号,会引起sql注入: 使用范围: 当传入的参数用于查询条件,尽 ...

  8. mybatis-geneator

    一.简介 在使用mybatis时我们需要重复的去创建pojo类.mapper文件以及dao类并且需要配置它们之间的依赖关系,比较麻烦且做了大量的重复工作,mybatis官方也发现了这个问题, 因此给我 ...

  9. C#使用Oxyplot绘制监控界面

    C#中可选的绘图工具有很多,除了Oxyplot还有DynamicDataDisplay(已经改名为InteractiveDataDisplay)等等.不过由于笔者这里存在一些环境上的特殊要求,.Net ...

  10. JVM 内存区域大小参数设置

    JVM内存包括区域 Heap(堆区) New Generation(新生代) Eden 伊甸园 Survivor From Survivor To Old Generation(老年代) 方法区 Pe ...