线性回归算法梳理
一.机器学习的一些概念
1.监督学习
简单来说就是训练集的每个数据都是一组(特征值, 标签值), 也就是每个数据有对应明确的标签值.举个例子垃圾邮件分类的例子:
我们手上有一百封有标签的垃圾邮件, 也就是说对于里面每一封邮件我们都被告知了是否为垃圾邮件.然后我们用这个100个训练集数据对我们的算法进行训练, 最终用训练好的算法来预测没有标签值的邮件, 也就是最终训练完成的算法需要对任意一封邮件进行判断,这封邮件是否为垃圾邮件.
简而言之,就是有标签的训练集就是监督学习.
2.非监督学习
跟上面的概念相反,也就是训练集不带标签.
比如你开个服装店,你想根据客人的身高,体重,这两个特征值,来划分衣服S,M,L三个型号.现在你手上有100个客户资料(即身高,体重),然后你告诉你的算法要对这个100个训练集分3个类,然后算法就会根据每个客户已有的特征值,自动学习,自己找出这些特征间的规律,然后划出3个区间.最终我们会用这个新算法,对新客户进行预测,他将落入哪个区间.
以上就是非监督学习的例子.
3.泛化能力
也就是训练好的算法,对新样本的适应能力.拿准确率指标举个例子,假设我们已经设计好了一个算法,这个算法对训练集的数据已经能够达到95%的准确率(我们认为这个算法对训练集的准确率已经达到了较高的水平), 现在我们要用这个算法对新样本进行预测.假设100个新样本,我们对其也能够达到 90% 的准确率,那么我们就认为这个新算法的泛化能力较 强. 但是如果我们对这100个新样本的预测,只能够达到 **60%**的准确率,那么我们就认为这个模型算法的泛化能力较 弱, 需要对算法进行改进.
4.过拟合 及对应解决方法
通过泛化能力的了解, 我们对训练集达到95%准确率(假设瞎蒙只能达到50%的准确率),而对新样本集只能达到60%的准确率的这情况 称为过拟合, 也就是模型在训练集上表现的很好, 但是推广效果不好.
举个过拟合的图形化例子:
上图来自 吴恩达-机器学习课程讲义:
其中红X表示训练集上的每个数据, 蓝色的线段表示模型拟合出来的曲线.很明显,这个曲线能够完美的符合训练集上的每个数据,但是我们会预感到,对于新样本上的数据,很有可能完全不在这个曲线上,并且离曲线的距离较远.也就是说我们用了过于复杂的模型去拟合这个数据的走向.比如假设数据坐落在x关于y的二次方程上,我们却用了x关于y的三次,四次甚至是十次方程去拟合,从而导致泛化能力很差.
解决方法:
1.简化模型,选择一个参数更少的模型(比如用线性模型, 而不是高阶多项式模型), 减少训练数据的特征数量或限制模型
2.收集更多的训练数据,也就是增大训练集
3.减小训练数据的噪声(比如,修改错误数据和去除异常值)
限制模型,降低过拟合风险的办法我们成为正则化(regularization).也就是在算法中增加参数用以降低(惩罚)W,b两个参数对算法的影响水平.这个新增的参数若设定的大,那么就是对(W,b)的惩罚大,也就是大幅降低他们本身对算法的影响,使得模型的斜率几乎接近于0.如果设置的太低,那么就几乎对模型没有影响,模型还是原本的过拟合情况.
5.欠拟合 及对应解决方法
根据上面我们可以推测出,欠拟合就是跟过拟合相反,也就是用了过于简单的模型去拟合数据集.比如假设数据坐落在x关于y的二次方程上,我们却用了x关于y的一次方程去拟合,从而导致泛化能力很差.也就是说我们对训练集只能达到60%的准确率(假设瞎蒙只能达到50%的准确率),这情况 称为欠拟合,对训练集表现也不好.
举个欠拟合的图形化例子:
上图来自 吴恩达-机器学习课程讲义:
解决方法:
1.选择一个更强大的模型,带有更多参数
2.用更好的特征训练学习算法,就是寻找到跟模型相关度高的特征(比如要找衣服的尺寸SML, 那么人的身高就是一个高度相关特征,而今天的天气就是一个低相关度特征)
3.减小对模型的限制(比如,减小正则化参数)
6.交叉验证
为了避免模型的泛化能力较差,我们会使用交叉验证的方法.也就是先在训练集上内部测试,评估通过再用到测试集上,若内部测试结果较差,就调整参数再行验证.具体方法如下:
我们将训练集分成k个互补的子集,一般来说为了使得子集相似,用分层抽样的方法划分子集,然后每次用k-1个子集进行训练,用剩下的那个子集进行测试,重复k次,最终使用k次测试集结果的平均值作为训练集的评估结果.
上图来自 周志华-西瓜书:
二.线性回归原理
对于给定的训练集{(x1, y1), (x2, y2), (x3, y3)…(xn, yn)}, 试图通过学习,找到最佳w, b的取值, 使得训练集上的数据能够符合或者近似方程Y = WX +b(这个就是我们的模型).
三.线性回归的损失函数,代价函数,目标函数
Yi(Yi = Wxi + b)表示第i个样本通过Y = Wx + b 算出来的值, yi表示第i个样本的标签值, N表示样本的总个数.
1.损失函数
即loss function, ( Yi - yi) ^ 2 ,一般是针对单个样本 i, 这个函数的意思就是在x = xi的情况下(即对于数据xi), 计算出模型推到出的预测值和实际标签值的差值的平方.如果完美预测,我们可以知道Yi = yi, 则( Yi - yi) ^ 2 = 0.所以我们可以得出, 如果 损失函数 值越大, 那么就表示第i个数据的预测值和标签实际值差距越大,也就是拟合误差越大,反之,如果 损失函数 值越小, 那么 第i个数据的预测值和标签实际值就越接近,拟合误差越小.
2.代价函数
即cost function, 1/N * SUM(( Yi - yi) ^ 2) ,一般是针对总体, 即为求全部损失函数加总后的均值.
3.目标函数
即Object function, 1/N * SUM(( Yi - yi) ^ 2) + 正则化项
这个也就是我们最终要求优化的函数, 一般来说也就是通过求使得目标函数达到最小的(W, b)组合,来得到我们需要的线性回归方程.
其中添加的正则化项是为了避免过拟合的情况,如果单单使用代价函数求解,会使得最终的模型十分贴近训练集上的每个数据点,导致泛化能力较差,需要通过添加正则化项,加强泛化能力.
四.线性回归函数的优化方法(梯度下降法,牛顿法,拟牛顿法)
为了求得使目标函数达到最小的(W, b)组合, 也就是说对目标函数取其 最小值,一般而言我们的目标函数是 凸函数,所以即为对目标函数求导, 求(W,b) 使得其导数为0. 下面优化方法就是针对如何求得(W, b),也就是(W,b)关于目标函数的方程求解(变量不再是x).以下方法均建立在 凸函数 基础上,求全局最优
(PS:我自己学的时候会想为什么不直接解方程求导数为0的点,而是用一步一步迭代这么麻烦.后来了解到程序上直接用解方程求解代价比较大,面对高维的时候求解时间比较慢,还是逐步迭代求解来的快)
1.梯度下降法
在目标函数上随机取一个点a,算出此时的f’(a), 若导数大于0表明函数在该点沿着x轴的正方向趋于增加;反之,表明函数在该点沿着x轴的正方向趋于减小.我们需要每次增加一个步长即a+r, 使得函数趋于减小, 也就是沿着负导数的发现增加步长.通过迭代N次,使得最终函数达到导数为0的点.如下图:
上图来自 吴恩达-机器学习课程讲义:
数学表达:
1.随机取一a点 y = f(xa)
2.算出这一点的导数f’(xa)
3.若f’(xa) = 0, 则为极值点, 由于是凸函数,此极值点就是函数的最值点(全局最优),(W,b)得解.
若f’(xa) > 0 , 则这不是极值点,需要更新a点使得a点往极值点逼近,也就是增加一点步长,并且我们需要沿负导数方向增加,所以更新xa = xa - f’(xa) * r
若f’(xa) < 0 , 则这不是极值点,需要更新a点使得a点往极值点逼近,也就是增加一点步长,并且我们需要沿负导数方向增加,所以更新xa = xa + f’(xa) * r
4.算出更新后a的导数 即f’(xa + r),看导数符号,重复步骤3,直到导数逼近或者等于0,求得(W,b )
2.牛顿法
牛顿法一般是用来求解 方程 f(x) = 0 的解.比如用牛顿法求上图f(x) = 0的解, 首先我们在坐标轴上随机取一点A, 在A做曲线切线, 与x轴相交于B点, 此时再取点 (B, f(b)) 做曲线切线, 再次与x轴相交,重复上述步骤N次(即迭代N次), 将会得到或是无限逼近 f(x) = 0的点,即解得方程.
数学表达式为:
- A点的切线方程为:y = f(XA)+f’(XA) * (x-XA)
- B点坐标: f(XA)+f’(XA) * (x-XA) = 0 推出 XB = XA - f(XA) / f’(XA)
- B点切线方程: y = f(XB)+f’(XB) * (x-XB)
- …
- n点坐标 xn = x(n-1) - f(n-1) / f’(n-1)
现在我们将牛顿法用于求解极值问题,也就是相当于对目标函数的导数求0点.这里就不再赘述, 注意是先写出目标函数导数,在运用牛顿法求解.
3.拟牛顿法
牛顿法在每轮迭代中涉及海森矩阵的求逆,计算复杂度相当高,尤其在高维问题中几乎不可行。若能以较低的计算代价寻求海森矩阵的近似逆矩阵,则可以显著降低计算的时间,这就是拟牛顿法。
五.评估指标
线性回归的评价指标有四种:
均方误差
值越小越好.受异常值影响较大,可解释性差
均方根误差
值越小越好.受异常值影响较大,较为常用,是用来衡量预测值同实际值之间的偏差
平均绝对值误差
值越小越好.比于RMSE,受异常值影响较小,是用来衡量预测值同实际值之间的偏差,
但是你并不知道这个值代表模型拟合是优还是劣,只有通过对比才能达到效果.
R2 Score
将预测值跟只使用均值的情况下相比,看能好多少。其区间通常在(0,1)之间.0表示还不如什么都不预测,直接取均值的情况,而1表示所有预测跟真实结果完美匹配的情况.越大越好.
六.sklearn.linear_model.LinearRegression 参数详解
sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
参数解释:
fit_intercept: 参数只可设置为True或False, 默认为True. 就是是否要为此模型计算截距(即b). 如果设置为False, 那么就默认b=0(也就是说默认数据集已经中心化过了,即过原点,无需b)
normalize :参数只可设置为True或False, 默认为False.当 fit_intercept=False的时候,这个参数会被自动忽略.如果设置为True, 数据集X会在模型调试前自动正则化. 即X = (X - X均值) / l2范数. 如果你希望标准化数据集, 那么在使用估计器(并将估计器normalize参数设置为False)前使用sklearn.preprocessing.StandardScaler这个函数.
copy_X : 参数只可设置为True或False, 默认为True. 如果为True, 数据集X将会被复制,估计器在运行的时候使用X的副本,并不会直接在原始数据上进行修改.若为False, 原始数据会被覆盖.
n_jobs: int型数值 或者 None , 默认为None.意思是程序运行的时候使用几个CPU的核.只有当问题足够大并且n_targets > 1 (个人认为这个应该是n_jobs>1)的时候,这个才能起到加速作用. 除非是在joblib.parallel_backend 的环境下,否则None意味着只使用一个核进行计算. -1 意味着使用所有CPU核进行计算. 更多解释详见 Glossary.