组队学习--线性回归算法梳理及机器学习中常见概念

一、机器学习的一些概念

1.监督学习(supervised learning):监督学习的训练集要求包括输入输出,也可以说是特征和目标。训练集中的目标是由人标注的。监督学习就是最常见的分类(注意和聚类区分)问题,通过已有的训练样本(即已知数据及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优表示某个评价准则下是最佳的),再利用这个模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现分类的目的。常见的有监督学习算法:回归分析和统计分类。最典型的算法是KNN和SVM

2.无监督学习(unsupervised learning):输入数据没有被标记,也没有确定的结果。样本数据类别未知,需要根据样本间的相似性对样本集进行分类(聚类,clustering)试图使类内差距最小化,类间差距最大化。通俗点将就是实际应用中,不少情况下无法预先知道样本的标签,也就是说没有训练样本对应的类别,因而只能从原先没有样本标签的样本集开始学习分类器设计。
无监督学习的方法分为两大类:
(1) 一类为基于概率密度函数估计的直接方法:指设法找到各类别在特征空间的分布参数,再进行分类。
(2) 另一类是称为基于样本间相似性度量的简洁聚类方法:其原理是设法定出不同类别的核心或初始内核,然后依据样本与核心之间的相似性度量将样本聚集成不同的类别。

3.泛化能力:(generalization ability)是指机器学习算法对新鲜样本的适应能力。学习的目的是学到数据背后隐含的规律,对具有同一规律的学习集以外的数据,经过训练的网络也能给出合适的输出,该能力称为模型或算法的泛化能力。

4.过拟合:通俗一点来说就是模型把训练数据学习的太彻底。以至于把噪声数据的特征也学习了,这样就会导致后期测试的时候不能很好的识别数据,既不能正确的分类,对新数据的适应性很差,模型的泛化能力太差。
解决办法:
(1).重新清洗数据,导致过拟合的一个原因也有可能是数据不纯造成的,如果出现了过拟合现象可以尝试重新清洗数据
(2).增大数据的训练量,还有一个原因就是我们用于训练的数据量太小,训练数据占总数据的比例太小。
(3).采用正则化惩罚项。正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对应的范数。但是在机器学习中一般使用L2正则。
(4).采用dropout方法。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。
5.欠拟合:首先欠拟合就是模型没有很好的捕捉到数据特征,不能够很好的拟合数据。
解决办法:
(1)添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。
(2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。
(3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。
6.偏差:描述的预测值(估计值)的期望与真实值之间的差距,表征预测值的准确性。偏差越大,越偏离真实数据,如下图第二行所示。
方差:描述的是预测值的变化范围,离散程度,也就是离其期望值的距离,表征预测值的稳定性。方差越大,数据的分布越分散,如下图右列所示。
组队学习--线性回归算法梳理及机器学习中常见概念
高方差的处理方法:1.采集更多的样本数据 2.减少特征数量,去除非主要的特征 3.增大正则化参数
高偏差的处理方法:1.引入更多的相关特征 2.采用多项式特征 3.减小正则化参数

7.交叉验证:首先将所有数据分为两部分:训练集和测试集。然后对测试集的数据进一步划分,比如我们要进行十折交叉验证的话就把训练集的数据十等分(注意,是训练集的数据),然后取其中九份数据当做训练集用来建模,剩下一份数据作为验证集用来测试准确率,进行十次建模,保证十份数据都被用来测试过模型,最终模型的准确率取十次的准确率的平均值。模型参数也取十次模型参数的平均值,这样整个模型的泛化能力就会好很多。
交叉验证的常见方式有:1.留出法:就直接把数据分为三份,训练集,验证集和测试集。2.K折交叉验证,就是上面说的方法,把训练集分成K份。3.留一法:用在数据量很少的情况下,就是每次只留下一个数据作为测试集,其余数据是训练集,这个方法用于训练的数据只比原始数据少一个样本,因此最接近原始样本的分布。但是训练复杂度增加了。因为模型数量与样本数量相同。所以一般在数据缺乏时使用。

二、线性回归的原理损失函数,代价函数和目标函数

线性回归遇到的问题一般是这样的。我们有m个样本,每个样本对应于n维特征和一个结果输出,如下:
(x1(0),x2(0),xn(0),y0),(x1(1),x2(1),xn(1),y1),...(x1(m),x2(m),xn(m),ym)(x_1^{(0)},x_2^{(0)},x_n^{(0)},y_0) , (x_1^{(1)},x_2^{(1)},x_n^{(1)},y_1) ,...(x_1^{(m)},x_2^{(m)},x_n^{(m)},y_m)
我们的问题是,对于一个新的样本数据:
组队学习--线性回归算法梳理及机器学习中常见概念
他所对应的y值是多少呢?如果这个问题里面的y是连续的,则是一个回归问题,否则是一个分类问题。
对于n维特征的样本数据,线性回归对应的模型是这样的:
组队学习--线性回归算法梳理及机器学习中常见概念
其中,Θi(i=0,1,2...n)\Theta _{i}(i = 0,1,2...n)为模型参数,xi(i=0,1,2...n)x _{i}(i = 0,1,2...n)为每个样本的n个特征值。这个表示可以简化,我们增加一个常数特征x0x _{0}=1,这样的话线性回归对应的模型:
hΘ(x0,x1,x2,...xn)=Θ0x0+Θ1x1+Θ2x2+...+Θnxnh_{\Theta }\left ( x_{0},x_{1},x_{2},...x_{n}\right )=\Theta _{0}x_{0}+\Theta _{1}x_{1}+\Theta _{2}x_{2}+...+\Theta _{n}x_{n}
如果用矩阵的形式表示则会更加简洁,如下所示:
hΘ(X)=XΘh_{\Theta }\left ( X \right )=X\Theta
其中,假设函数hΘ(X)h_{\Theta }\left ( X \right )为m×1的向量,Θ\Theta为n×1的向量,里面有n个代数法的模型参数。XX为m×n维的矩阵。m代表样本个数,n代表样本的特征数。
至此,我们已经得到了线性回归的模型,接下来我们需要求出损失函数,一般线性回归我们使用均方误差作为损失函数。损失函数的代数表示如下:
J(θ0,θ1,...θn)=i=0m(hΘ(x0,x1,...xn)yi)2J(\theta_{0},\theta_{1},...\theta_{n})=\sum_{i=0}^{m}(h_\Theta(x_{0},x_{1},...x_{n})-y_{i})^2
进一步用矩阵形式表示损失函数:
J(θ)=12(XΘY)T(XΘY)J(\theta)=\frac{1}{2} (X\Theta-Y)^T(X\Theta-Y)
这里插一下目标函数,损失函数和代价函数的区别与联系:
1.损失函数:计算的是一个样本的误差
2.代价函数:是整个训练集上所有样本误差的平均
3.目标函数:代价函数+正则化项,目标函数加上不同的正则化项就是不同的线性回归方法,加上L2正则,就是岭回归(Ridge Regression),加上L1正则,就是LASSO回归,如果同时使用L1,L2正则,就是Elastic Net回归。
可以看出,矩阵形式表达的损失函数简洁很多,后面的推导我们统一采用矩阵方式表达模型函数和损失函数。
推出线性回归的损失函数J(θ)=12(XΘY)T(XΘY)J(\theta)=\frac{1}{2} (X\Theta-Y)^T(X\Theta-Y)之后,我们接下来要做的就是最小化损失函数,求出对应的参数Θ\Theta:这一步常用的有两种方法:一种是梯度下降法,一种是最小二乘法。

如果采用梯度下降法,则Θ\Theta的迭代公式是这样的:Θ=ΘαXT(XΘY)\Theta=\Theta-\alpha X^T(X\Theta-Y)
其中α\alpha表示学习率, XT(XΘY)X^T(X\Theta-Y)是上面的损失函数Θ=ΘαXT(XΘY)\Theta=\Theta-\alpha X^T(X\Theta-Y)Θ\Theta 求导得到的梯度。因为要最小化损失函数,所以得到上面梯度下降的迭代公式。

如果采用最小二乘法,则就是直接的矩阵求导,同上,对损失函数求导得出梯度后,直接让梯度等于零(就相当于导数为零)直接解出Θ\Theta的代数解,可以解出Θ\Theta的结果公式如下:Θ=(XTX)1XTY\Theta=(X^T X)^{-1} X^T Y
但是这种方法并不能适用于所有情况,有的求不出导数,而且这个方法要求解逆矩阵,运算量比较大,一般来说,得到损失函数J(Θ)J(\Theta)之后,需要先优化一下,梯度下降就是其中的一种优化方法。
三、优化方法
牛顿法:牛顿法最初提出是来用求解方程的根的。我们假设点xx^*为函数f(x)f(x)的根,那么有f(x)=0f(x^*)=0。现在我们把函数f(x)f(x)在点xkx_k处一阶泰勒展开有:
f(x)=f(xk)+f(xk)(xxk)f(x)=f(x_k)+f'(x_k)(x-x_k)
那么假设xk+1x_{k+1}为该方程的根,则有:
f(xk+1)=f(xk)+f(xk)(xxk)=0f(x_{k+1})=f(x_k)+f'(x_k)(x-x_k)=0
那么就可以的得到:
xk+1)=xkf(xk)f(xk)x_{k+1})= x_k-\frac{f(x_k)}{f'(x_k)}
这样我们就得到了一个递归方程,我们可以通过迭代的方式不断让xx趋近于xx^*从而求得方程f(x)f(x)的解。该递归式同样可以通过下图的方式得到:
组队学习--线性回归算法梳理及机器学习中常见概念
从图中可以看到,xn+1x_{n+1}是要比xnx_{n}更接近于xx^*的,同时,利用三角形特征也可以知道xn+1=xnf(xn)f(xn)x_{n+1}=x_n - \frac{f(x_n)}{f'(x_n)},其中f(xn)f'(x_n)在三角形中表示点(xn,f(xn))(x_n ,f(x_n))处切线的斜率。
对于最优化问题来说: 对于最优化问题,其极值点处有一个特性就是在极值点处函数的一阶导数为0。因此我们可以在一阶导数处利用牛顿法通过迭代的方式来求得最优解,即相当于求一阶导数对应函数的根。
首先,我们对函数在xkx_k点处进行二阶泰勒展开:
f(x)=f(xk)+f(xk)(xxk)+12f(xk)(xxk)2f(x)=f(x_k)+f'(x_k)(x-x_k)+\frac{1}{2} f''(x_k)(x-x_k)^2
\Downarrow
f(x)f(xk)xxk=f(xk)+f(xk)(xxk)\frac{f(x)-f(x_k)}{x-x_k}=f'(x_k)+f''(x_k)(x-x_k)
因此,当xx\rightarrowxkx_k时,f(x)=f(xk)+f(xk)(xxk)f'(x)=f'(x_k)+f''(x_k)(x-x_k)。这里假设$x_{k+1}是一阶导数的根,那么就有:
f(xk+1)=f(xk)+f(xk)(xk+1xk)=0f'(x_{k+1})=f'(x_k)+f''(x_k)(x_{k+1}-x_k)=0
依据上式可以得到:xk+1=xkf(xk)f(xk)x_{k+1}=x_k-\frac{f'(x_k)}{f''(x_k)}
这样我们就得到了一个不断更新xx迭代求得最优解的方法。这个也很好理解,假设我们上面的第一张图的曲线表示的是函数f(x)f(x)一阶导数的曲线,那么其二阶导数就是一阶导数对应函数在某点的斜率,也就是那条切线的斜率,那么该公式就和上面求根的公式本质是一样的。
我们这里讨论的都是在低维度的情形下,那么对于高维函数,其二阶导数就变为了一个海森矩阵,记为H(X)=[δ2fδxiδxj]H(X)=[\frac{\delta^2 f}{\delta_{x_i} \delta_{x_j}}],那么迭代公式就变成了:
xk+1=xkHk1fkx^{k+1} = x^k - H_k^{-1} f'_k
可以看出,当HkH_k为正定矩阵时(Hk1H_k^{-1}也为正定矩阵)的时候,可以保证牛顿法的搜索方向是向下搜索的。
牛顿法求最优值的步骤如下:
1.随机选取起始点x0x^0
2.计算目标函数f(x)f(x)在该点xkx^k的一阶导数和海森矩阵:
3.依据迭代公式xk+1=xkHk1fkx^{k+1}=x^k - H_k^{-1} f'_k更新xx的值,如果E(f(xk+1)f(xk))<ϵE(f(x_{k+1})-f(x_k))<\epsilon,则收敛返回,否则继续步骤2,3直至收敛
我们可以看到,当我们的特征特别多的时候,求海森矩阵的逆的运算量是非常大且慢的,这对于在实际应用中是不可忍受的,因此我们想能否用一个矩阵来代替海森矩阵的逆呢,这就是拟牛顿法的基本思路。
拟牛顿法:
因为我们要选择一个矩阵来代替海森矩阵的逆,那么我们首先要研究一下海森矩阵需要具有什么样的特征才能保证牛顿法成功的应用。通过上面的描述我们知道:
f(xk+1=f(xk)+Hk(xk+1xk)Hk1(f(xk+1)f(xk))=xk+1xkf'(x^{k+1} = f'(x^k) + H_k(x^{k+1} - x^k)\Rightarrow H_k^{-1}(f'(x^{k+1})-f'(x_k))=x^{k+1} - x^k
上式我们称之为拟牛顿条件。
因此,对于我们选择的替代矩阵GkG_k,需要满足两个条件:
1.拟牛顿条件,既Gk(f(xk+1)f(xk))=xk+1xkG_k(f'(x^{k+1})-f'(x_k))=x^{k+1} - x^k:
2.要保证GkG_k为正定矩阵,因为只有正定才能保证牛顿法的搜索方向是向下搜索的。
假设 yk=f(xk+1)f(xk),δk=xk+1xky_k = f'(x^{k+1})-f'(x_k) , \delta_k=x^{k+1}-x^k,因为每次迭代我们都需要更新替代矩阵GkG_k,下面介绍一种常用的迭代算法DFP(Davidon-Fletcher-Powell)
DFP算法
DFP算法中选择GK+1G_{K+1}的方法是在每一步迭代中在矩阵GkG_k中加两项附加项构成Gk+1G_{k+1},既:
Gk+1=Gk+Pk+QkG_{k+1}=G_k + P_k + Q_k
我们有:
Gk+1yk=Gkyk+Pkyk+QkykG_{k+1}y_k=G_ky_k + P_ky_k + Q_ky_k
我们可以令Pkyk=δk,Qkyk=GkykP_ky_k=\delta_k , Q_ky_k = -G_ky_k,这样就可以得到GkG_k的迭代公式
四、线性回归的评估指标
说完优化算法,下面说一下线性回归模型好坏的评价指标:
定义Coefficient of Determination(确定系数)如下:
R2=1RSSTSS=1i=1m(yi^yi)2i=1m(yiy)2R^2=1-\frac{RSS}{TSS}=1-\frac{\sum\limits_{i=1}^{m}(\hat{y_i}-y_i)^2}{\sum\limits_{i=1}^{m}( y_i- \overrightarrow {y} )^2}
公式中y\overrightarrow{y}是样本均值(表示均值的横杠打不出来,这里用箭头凑合一下),TSS是样本的总平方和(Total Sum of Square)。
公式中yi^\hat{y_i}是模型的估计值,,RSS是残差平方和(Residual Sum of Square)也既误差平方和。
R2R^2的取值范围为(,1](-\infty,1], R2R^2取值越大,模型的拟合效果就越好。
R2R^2的最优值为1:若模型预测为随机值,R2R^2有可能为负,若预测值恒为样本期望,R2R^2为0。
可以看出,如果R2R^2为负,说明模型非常不好,甚至不如预测一个恒定值(样本期望)。
还可以定义ESS(Explained Sum of Square)如下:
ESS=i=1m(yi^y)2ESS=\sum\limits_{i=1}^{m}(\widehat{y_i}-\overrightarrow{y})^2
只有在无偏估计(假设误差独立同分布)时,存在等式:TSS=ESS+RSS,否则TSS>ESS+RSS
因为这里讨论的是回归问题,有时ESS也被称为回归平方和SSR(Sum of Square for Regression)

五、sklearn线性回归参数详解
参数:
fit_intercept: 布尔型,默认为true
说明:是否对训练数据进行中心化。如果该变量为false,则表明输入的数据已经进行了中心化,在下面的过程里不进行中心化处理;否则,对输入的训练数据进行中心化处理
normalize布尔型,默认为false
说明:是否对数据进行标准化处理
copy_X 布尔型,默认为true
说明:是否对X复制,如果选择false,则直接对原数据进行覆盖。(即经过中心化,标准化后,是否把新数据覆盖到原数据上)
n_jobs 整型, 默认为1
说明:计算时设置的任务个数(number of jobs)。如果选择-1则代表使用所有的CPU。这一参数的对于目标个数>1(n_targets>1)且足够大规模的问题有加速作用。
返回值:
coef_ 数组型变量, 形状为(n_features,)或(n_targets, n_features)
说明:对于线性回归问题计算得到的feature的系数。如果输入的是多目标问题,则返回一个二维数组(n_targets, n_features);如果是单目标问题,返回一个一维数组 (n_features)。
intercept_ 数组型变量
说明:线性模型中的独立项。
方法:
decision_function(X) 对训练数据X进行预测
fit(X, y[, n_jobs]) 对训练集X, y进行训练。是对scipy.linalg.lstsq的封装
get_params([deep]) 得到该估计器(estimator)的参数。
predict(X) 使用训练得到的估计器对输入为X的集合进行预测(X可以是测试集,也可以是需要预测的数据)。
score(X, y[,]sample_weight) 返回对于以X为samples,以y为target的预测效果评分。
set_params(**params) 设置估计器的参数

特殊说明:
decision_function(X) 和predict(X)都是利用预估器对训练数据X进行预测,其中decision_function(X)包含了对输入数据的类型检查,以及当前对象是否存在coef_属性的检查,是一种“安全的”方法,而predict是对decision_function的调用。
score(X, y[,]sample_weight) 定义为(1-u/v),其中u = ((y_true - y_pred)**2).sum(),而v=((y_true-y_true.mean())**2).mean(),简单来说score函数计算的就是前面说过的R2R^2的值
其中sample_weight为(samples_n,)形状的向量,可以指定对于某些sample的权值,如果觉得某些数据比较重要,可以将其的权值设置的大一些。

参考博客链接:
https://www.cnblogs.com/pinard/p/6004041.html
https://blog.csdn.net/qq_29083329/article/details/48653391