深入浅出Python机器学习4——广义线性模型
线性模型的基本概念 |
线性模型的一般公式
在机器学习领域,常用的线性模型包括线性回归、岭回归、套索回归、逻辑回归和线性SVC等。
假如我们有一条直线,其方程是 y = 0.5x+3,
通过两个点((1,3)和(4,5))的直线模型:线性模型的图形表示
打印直线方程:
当数据有三个点((1,3)、(4,5)和(3,3))时:
可以看出没有穿过任何一个点,而是位于一个和3个点的距离相加最小的位置,直线方程为:
我们以scikit-learn生成的make_regression数据集为例,用Python语句绘制一条线性模型的预测线,更加清晰地反映出线性模型的原理:
打印拟合直线的系数和截距:
注意:细心的读者可能注意到coef_和intercept_这两个属性非常奇怪,它们都是一下划线_结尾。这是scikit-learn的一个特点,它总是用下划线作为来自训练数据集的属性的结尾,以便于将它们与用户设置的参数分开。线性模型的特点
在上面内容中,我们使用的特征数只有1个的数据集。用于回归分析的线性模型在特征数为1的数据集中,是使用一条直线来进行预测分析,而当数据的特征数量达到2时则是一个平面,而对于更多特征数量的数据集来说,则是一个高维的超平面。
如果和K最近邻模型生成的预测进行比较的话,你会发现线性模型的预测方法是非常有局限性的——很多数据都没有体现在这条直线上。从某种意义上说,这是一个问题。因为使用线性模型的前提条件,是假设目标y是数据特征的线性组合。但需要特别注意的是,使用一维数据集进行验证会让我们有一点偏颇,而对于特征变量较多的数据集来说,线性模型就显得十分强大。尤其是,当训练数据集的特征变量大于数据点的数量的时候,线性模型可以对训练数据做出近乎完美的预测。
用于回归分析的线性模型也有很多种类。这些模型之间的区别在于如何从训练数据中确定模型参数w和b,以及如何控制模型复杂度.
线性回归 |
线性回归,也称为普通最小二乘法(OLS),是在回归分析中最简单也是最经典的线性模型。
- 线性回归的基本原理
线性回归的原理是,找到当训练数据集中y的预测值和其真实值的平方差最小的时候,所对应的 w 和 b 的值。线性回归没有可供用户调节的参数,这是它的优势,但也代表我们无法控制模型的复杂性。
分析上述代码可知,intercept_属性是一个浮点数,而coef_属性则是一个Numpy数组,其中每个特征对应数据中的一个数值,由于我们这次用的make_regression生成的数据集中有2个特征,所以lr.coef_是一个二维数组。 - 线性回归的性能表现
在上图中的数据集中没有加入noise,故而训练集和测试集中都取得了满分的成绩。真实的世界并非如此简单,当我们增加噪声后如下图所示:
这次模型的得分降低了很多,由于真实世界的数据复杂程度要比我们手工合成的数据高的多,使得线性回归的表现大幅度下降了。此外由于线性回归自身的特点,非常容易出现过拟合的现象。在训练集和测试集上的得分之间的差异是过拟合问题的一个明确信号。
岭回归——L2正则化项 |
岭回归的原理
岭回归也是回归分析中常用的线性模型,它实际上是一种改良的最小二乘法。从实际应用角度看,岭回归实际上是一种能够避免过拟合的线性模型。
在岭回归中,模型会保留所有的特征变量,但是会减小特征变量的系数值,让特征变量对预测结果的影响变小,在岭回归中是通过改变alpha参数来控制减小特征变量系数的程度。
通过保留全部特征变量,只是降低特征变量的系数值来避免过拟合的方法,我们称之为L2正则化。
可以看到得分有所调整,训练集和测试集得分一致。由于岭回归是一个相对受限的模型,所以降低了发生过拟合的可能性。
可以说,复杂度越低的模型在训练数据集上的表现越差,但是其泛化能力会更好。如果我们更在意模型在泛化方面的表现,那么我们就应该选择岭回归模型,而不是线性回归模型。岭回归的参数调节
岭回归是在模型的简单性(使系数趋于零)和它在训练集上的性能之间取得平衡的一种模型。
注意:alpha的取值并没有一定之规。alpha的最佳设置取决于我们使用的特定数据集。增加alpha值会降低特征变量的系数,使之趋于零,从而降低在训练集的性能,但更有助于泛化。
提高了alpha,模型得分大幅度降低,然而测试集上的得分超过了训练集上的得分。这说明,如果我们的模型出现过拟合现象,可以通过提高alpha值来降低过拟合的程度。
这时相比于线性回归模型略微好点,可以尝试降低alpha值来降低过拟合程度。
可以看出较高的alpha值代表模型的限制更加严格,当alpha较高时coef_属性的数值 会更小,反之coef_属性的数值更大。
当alpha=0.1时,特征变量的系数比较大,甚至大部分于线性回归的系数重合。而线性回归模型没有经过正则化处理,从而对应的系数会特别大,甚至跑出了图外。
通过固定alpha值,改变训练数据集的数据量。可以看出不论在岭回归还是线性回归中,训练数据集的得分都比测试数据集的得分要高。而由于岭回归时正则化处理过的模型,因此它在整个图像中训练数据集的得分要比线性回归的得分低。
相比之下,岭回归在训练测试数据集的得分于训练数据集的得分差异就要小一些,尤其是在数据子集比较小的情况下。
从图中我们也可以看出,如果有足够多的数据,正则化就显得不是那么重要了,岭回归和线性回归的表现也就相差无几。
注意:随着数据量的增加,线性回归在训练数据集的得分是下降的,这说明随着数据增加,线性回归模型就越不容易产生过拟合的现象,或者说越难记住这些数据。
套索(lasso)回归——L1正则化项 |
套索(lasso)回归的原理
与岭回归一样,lasso回归也会将系数限制在非常接近0的范围内,但它进行方式略微有点不一样,称之为L1正则化。
L1正则化会使lasso回归的一些特征系数正好为0,也就是说,有一些特征会被忽略,这可以看作模型对特征的进行自动选择的一种方式。把一部分系数变成0有助于让模型更加容易理解,而且可以突出体现模型中最重要的那些特征。
与岭回归类似,lasso回归也有一个正则化参数alpha,用它来控制特征变量系数被约束到0的强度。套索回归的参数调节
在上面例子中用了alpha默认值1.0,为了降低欠拟合的程度,我们可以试着降低alpha的值。与此同时,我们还需要增加最大迭代次数(max_iter)的默认设置。
可以看出降低alpha值,可以拟合出更加复杂的模型,从而在训练数据集和测试数据集都能获取良好的表现。而且相比于岭回归,lasso回归表现稍好一点,只用了10个特征中的7个特征。
但是,如果把alpha值设置的太低,就等于把正则化效果去除了,那么模型可能会像线性回归一样,出现过拟合。例如:
套索回归于岭回归的对比
针对不同的alpha值,将lasso回归和岭回归做个对比:
分析上图发现,当alpha=1时,大部分系数为0,不为零的系数非常小;当alpha=0.1时,大部分系数为0,但是系数为0的相比于alpha=1时有所减少;当alpha=0.0001时,模型几乎没有被正则化,大部分系数都是非零的,而且数值比较大;当alpha=0.1时,lasso回归和岭回归在预测能力上一致,但是,使用岭回归模型的时候几乎所有系数不为0。
在实践当中,岭回归往往是这两个模型中的优选。但是如果你的数据特征过多,而且其中一小部分是真正重要的,那么lasso回归就是更好的选择。同样如果你需要对模型进行解释的话,那么lasso回归会让你的模型更容易被人理解,因为它只是使用了输入特征的一部分。
注意:scikit-learn还提供了一种模型,称为弹性网模型(Elastic Net)。弹性网模型综合了lasso回归和岭回归的惩罚因子。在实践中这两个模型的组合效果最好的,然而代价是用户需要调整两个参数,一个是L1正则化参数,另一个是L2正则化参数
深入浅出Python机器学习4——广义线性模型相关推荐
- 回归素材(part10)--深入浅出python机器学习
学习笔记,仅供参考,有错必纠 文章目录 深入浅出python机器学习 线性回归 基本原理 使用 L 2 L_2 L<
- 机器学习 python_送书 | 深入浅出Python机器学习
大家好,我是村长, 为了感谢您一直以来的关注与支持,给大家送了点福利! 以后每周三都会送免费送技术书!您有哪方面技术书籍的需求,也可以微信告诉我~~本周送的书籍如下,后台回复 送书 参与 书籍简介 ...
- 深入浅出python机器学习_9.1.5_通过数据预处理提高模型的准确率_MinMaxScaler
# 导入红酒数据集from sklearn.datasets import load_wine# 导入MLP神经网络from sklearn.neural_network import MLPClas ...
- 深入浅出python机器学习_8.3_神经网络实例_手写识别_MNIST数据集的使用
# 导入数据集获取工具 # from sklearn.datasets import fetch_mldata# 加载MNIST手写数字数据集 # mnist=fetch_mldata('MNIST ...
- 深入浅出python机器学习_7.1_支持向量机
%matplotlib inline# 支持向量机SVM的核函数import numpy as npimport matplotlib.pyplot as pltfrom sklearn import ...
- 深入浅出python机器学习_如何用python画三维图? add_subplot() Axes3D() plot_surface() gca()
# 第一种创建3D图形的方法:创建子图# 用创建子图的方法画出来感觉要比下面的方法小一点??from matplotlib import pyplot as plt #用来绘制图形import num ...
- 深入浅出python机器学习_如何用python画(绘制)二维函数(二维图)?
参考文档 python 如何绘制二维函数? from matplotlib import pyplot as plt import numpy as np low=lambda x:10000 if ...
- 深入浅出Python机器学习9——数据预处理、降维、特征提取及聚类
数据预处理 使用 StandScaler 进行数据预处理 首先手工生成一些数据: 用make_blobs 函数时,指定了样本数量 n_samples 为 40,分类 centers 为 ...
- 《Py机器学习》-广义线性模型
目录 一. 本章使用的函数说明 二. 四种线性模型 1.最最基本线性模型 2.线性回归模型 3.岭回归 4.套索回归 三. 模型的选择 一. 本章使用的函数说明 reshape( x ) 1.当原始数 ...
最新文章
- C#中接口和方法的运用(Fourteenth Day)
- HTML form 标签的 action 属性
- Android在Shell环境下运行Linux命令
- NOIP2001-普及组复赛-第一题-数的计算
- 大厂中秋礼盒大PK!祝大家中秋快乐,送大家鹅厂月饼礼盒!
- 《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略
- Redis 单数据多源超高并发下的解决方案
- easyui图标对照
- 递归算法经典实例python-python-动态规划的递归、非递归实现
- 2022新考纲408计组详细思维导图分享
- 各省简称 拼音 缩写_近50个拼音/英文缩写合集 (一)
- 安利4款良心的时间轴软件,建议收藏!
- 将html内容转换成word文档,一招教你将网页内容转化为word文档保存
- ArcGIS Desktop10.3位置分配,选址分析
- android root权限获取失败,安卓手机为什么获取Root权限失败?Root失败是什么原因...
- 怎么把PDF分割成几个文件?分享几种分割方法
- 中国石油大学《输气管道设计与管理(含课程设计)》第二阶段在线作业
- 服务器五大相关基础知识【转】
- erp打印面单 php实现,利用店小秘ERP处理Shopee虾皮订单及打印面单
- 163邮箱自动化登录实现模块化【2】