梳理一下内容和知识点

目的

统计学习用于对数据进行预测和分析,特别是对未知数据进行预测与分析。 对数据的预测与分析是 通过构建概率统计模型实现的。 统计学习总的目标就是要考虑学习什么样的模型和如何学习模型,从而能准确地去预测。

方法

基于数据构建统计模型从而进行数据预测与分析。 统计学习包含:监督、非监督、半监督和强化学习。 统计学习方法包含模型的假设空间、模型选择准则以及模型学习的算法。 简称模型、策略和算法

三要素

假设空间用\(F\)来标识,假设空间可以定义为决策函数的集合 $$F=\{f|Y=f(X)\} $$ 其中X和Y是定义在输入空间\(X\)和输出空间\(Y\)上的变量; 这时候\(F\)通常由一个参数向量决定的函数族 $$F=\{f|Y=f_{\theta}(X), \theta \in R^{n} \}$$ 参数向量\(\theta\)取之于n维欧式空间\(R^{n}\),称为参数空间(parameter space)

知识点

判别式和生成式模式

  • 判别式
  • 判别式模型直接学习决策函数f(X)或条件概率分布P(Y|X)作为预测的模型. 往往准确率更高,并且可以简化学习问题. 如k近邻法/感知机/决策树/最大熵模型/Logistic回归/线性判别分析(LDA)/支持向量机(SVM)/Boosting/条件随机场算法(CRF)/线性回归/神经网络
  • 生成式
  • 生成式模型由数据学习联合概率分布P(X,Y),然后由P(Y|X)=P(X,Y)/P(X)求出条件概率分布作为预测的模型,即生成模型. 当存在隐变量时只能用生成方法学习. 如混合高斯模型和其他混合模型/隐马尔可夫模型(HMM)/朴素贝叶斯/依赖贝叶斯(AODE)/LDA文档主题生成模型

隐变量

李航在统计学习方法中的EM引入中提到了 隐变量 的概念(latent variable), 他提到了如果我们的概率模型的变量都是观测到的变量, 那么给定数据,我们就可以使用 极大似然估计法 ,或者其他估计法去估计参数,但是当模型有隐变量的时候,就该我们的EM算法闪亮登场了。

让我们简单的说一下,我们估计算法在做的一些事情,我们要做的其实就是估算出概率模型的参数,概率模型是什么呢? 我们可以简单把它理解成一个分部,甚至说可以把它理解成一个函数,我们的估计算法就是为了求解出这些函数的参数而存在的。

如果你站在这个人旁边,你目睹了整个过程:这个人选了哪个袋子,抓出来的球是什么颜色。然后你把每次选择的袋子和抓出来的球的 颜色都记录下来(样本-观察值),那个人不停的抓,你不停的记。最终你就可以通过你的记录,推测出每个袋子里每种球颜色的大致比例。

而且,记录的越多,推测的就会变得越准(中心极限定理)。然而,抓球的人觉得这样很不爽,于是决定不告诉你他从哪个袋子里抓的球, 只告诉你抓出来的球的颜色是什么。这时候,选袋子的过程由于你看不见,其实就相当于是一个隐变量。 隐变量在很多地方都是能够出现的。现在我们经常说的隐变量主要强调它的“latent”。 所以广义上的隐变量主要就是指“不能被直接观察到,但是对系统的状态和能观察到的输出存在影响的一种东西”。 所以说,很多人在研究隐变量。以及设计出各种更优(比如如可解释、可计算距离、可定义运算等性质)的隐变量的表示。 https://blog.csdn.net/Ding_xiaofei/article/details/80207084

EM算法---基于隐变量的参数估计

EM算法算是机器学习中有些难度的算法之一,也是非常重要的算法,曾经被誉为10大数据挖掘算法之一,从标题可以看出, EM专治带有隐变量的参数估计,我们熟悉的MLE(最大似然估计)一般会用于不含有隐变量的参数估计,应用场景不同。

首先举一个带有隐变量的例子吧,假设现在有1000人的身高数据,163、153、183、203、173等等,不出意外肯定是男生或者女生组成的这1000个人, 那么这个163cm我们就没办法知道是男生的还是女生,这其中男女就是一个隐变量,我们只能看到163cm,但是看不到背后男女这个隐变量。 https://blog.csdn.net/u012771351/article/details/53005196

概率质量函数,概率密度函数,累积分布函数

  • 概率质量函数 (probability mass function,PMF)是离散随机变量在各特定取值上的概率。
  • 概率密度函数(p robability density function,PDF )是对 连续随机变量 定义的,本身不是概率,只有对连续随机变量的取值进行积分后才是概率。
  • 累积分布函数(cumulative distribution function,CDF) 能完整描述一个实数随机变量X的概率分布,是概率密度函数的积分。对於所有实数x ,与pdf相对。

极大似然估计

已知某个参数能使这个样本出现的概率最大,我们当然不会再去选择其他小概率的样本,所以干脆就把这个参数作为估计的真实值

最小二乘法

二乘的英文是least square,找一个(组)估计值,使得实际值与估计值之差的平方加总之后的值 \(Q=min\sum_{i}^{n}(y_{ie}-y_{i}) \)最小.求解方式是对参数求偏导,令偏导为0即可.样本量小时速度快.

TODO 梯度下降法

负梯度方向是函数值下降最快的方向,每次更新值都等于原值加学习率(步长)乘损失函数的梯度. 每次都试一个步长看会不会下降一定的程度,如果没有的话就按比例减小步长. 不断应用该公式直到收敛,可以得到局部最小值.初始值的不同组合可以得到不同局部最小值.在最优点时会有震荡.

批量梯度下降(BGD)

每次都使用所有的m个样本来更新,容易找到全局最优解,但是m较大时速度较慢

随机梯度下降(SGD)

每次只使用一个样本来更新,训练速度快,但是噪音较多,不容易找到全局最优解,以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升.注意控制步长缩小,减少震荡.

小批量梯度下降(MBGD)

每次使用一部分样本来更新

牛顿法:

牛顿法是二次收敛,因此收敛速度快.从几何上看是每次用一个二次曲面来拟合当前所处位置的局部曲面,而梯度下降法是用一个平面来拟合.

牛顿对比梯度

红色的是牛顿法的迭代路径,绿色的是梯度下降法的迭代路径.牛顿法起始点不能离极小点太远,否则很可能不会拟合.

黑塞矩阵

是由目标函数f(x)在点X处的二阶偏导数组成的n*n阶对称矩阵。

牛顿法

拟牛顿法

先验概率和后验概率

  • 先验概率就是事情发生前的预测概率.
  • 后验概率是一种条件概率,它限定了事件为隐变量取值,而条件为观测结果。一般的条件概率,条件和事件可以是任意的.
  • 贝叶斯公式P(y|x) = ( P(x|y) * P(y) ) / P(x)中,P(y|x)是后验概率,P(x|y)是条件概率,P(y)是先验概率.

极大似然估计等价于经验风险最小化

https://blog.csdn.net/xmu_jupiter/article/details/44965391

https://blog.csdn.net/u011508640/article/details/72815981

当模型师条件概率分布,损失函数是对数损失函数时,经验风险最小化就等价于极大似然估计 $$-\frac{1}{N}\sum_{1}^{N}logP(y_{i}|x_{i}) $$

最大似然估计是求参数θ, 使似然函数P(x0|θ)最大。最大后验概率估计则是想求θ使P(x0|θ)P(θ)最大。 求得的θ不单单让似然函数大,θ自己出现的先验概率也得大。 (这有点像正则化里加惩罚项的思想,不过正则化里是利用加法,而MAP里是利用乘法)

海森矩阵 黑塞矩阵

https://blog.csdn.net/zlrai5895/article/details/78765590 在机器学习课程里提到了这个矩阵,那么这个矩阵是从哪里来,又是用来作什么用呢?先来看一下定义: 黑塞矩阵(Hessian Matrix),又译作海森矩阵、海瑟矩阵、海塞矩阵等,是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。黑塞矩阵最早于19世纪由德国数学家Ludwig Otto Hesse提出,并以其名字命名。黑塞矩阵常用于牛顿法解决优化问题。

svm

  • 硬间隔支持向量机(线性可分支持向量机):当训练数据线性可分时,可通过硬间隔最大化学得一个线性可分支持向量机。
  • 软间隔支持向量机:当训练数据近似线性可分时,可通过软间隔最大化学得一个线性支持向量机。
  • 非线性支持向量机:当训练数据线性不可分时,可通过核方法以及软间隔最大化学得一个非线性支持向量机。

点到平面的距离

平面的一般式方程

$$Ax + By + Cz + D = 0 $$ 其中n = (A,B,C)是平面的法向量,D是将平面平移到左边远点所需距离(所以D=0时,平面过远点)

向量的模

给定一个向量V (x,y,z), 则它的模是 $$ |V| = \sqrt{x^2+y^2+z^2} $$

向量的点积(内积)

给定两个向量\(V_{1} (x_{1}, y_{1}, z_{1} ) \) 和 \(V_{2}(x_{2}, y_{2}, z_{2}) \) 他们的内积是 $$V_{1}V_{2} = x_{1}x_{2} + y_{1}y_{2} + z_{1}z_{2} $$

点到平面的距离

点到平面

推导方法

链接

空间中超平面可记为\( (\overrightarrow{w},\overrightarrow{b}) \) 根据点到平面的距离公式,空间中任意点\( \overrightarrow{x}\)到超平面\( (\overrightarrow{w},\overrightarrow{b}) \) 的距离可以写成 $$ r = \frac{ \overrightarrow{w} * \overrightarrow{b} }{||\overrightarrow{w} ||} $$ 进一步优化可得到; $$ max_{\overrightarrow{w},b} \frac{2}{||\overrightarrow{w}||} \\ s.t.\quad y_{i}(\overrightarrow{w}^{T}\overrightarrow{x_{i}}+b) \geq +1, i=1,2,...,n $$ 显然,等价于 $$ max_{\overrightarrow{w},b} \frac{1}{2}||\overrightarrow{w}||^{2} \\ s.t.\quad y_{i}(\overrightarrow{w}^{T}\overrightarrow{x_{i}}+b) \geq +1, i=1,2,...,n $$

参考文档

https://www.zuozuovera.com/archives/1440/

https://www.cnblogs.com/ooon/p/5723725.html

https://blog.csdn.net/blackyuanc/article/details/67640844

https://blog.csdn.net/liugan528/article/details/79448379

https://www.cnblogs.com/ooon/p/5721119.html

统计学习方法资源汇总 https://blog.csdn.net/u014688145/article/details/60758291

决策树

剪枝

http://wenda.chinahadoop.cn/question/4171

因为决策树剪枝计算可以再局部进行。所以,决策树的剪枝算法可以由一种动态规划的方法实现。

树的剪枝算法

输入:生成算法产生的整个树T,参数α;
输出:修剪后的子树Tα
- 计算每个结点的经验熵。
- 递归地从树的叶结点向上回缩。(如果Cα(TA)≤Cα(TB)则剪枝)
- 返回2,直至不能继续为止,得到损失函数最小的子树Tα (具体可以使用动态规划来实现)


cart剪枝

参考文档

关于g(t)的解释,以及为什么先要减去g(t)最小内部结点 https://blog.csdn.net/wjc1182511338/article/details/76793164

https://www.zhihu.com/question/22697086

提升方法

  • boosting的思想:
  • 利用弱分类器(基函数)不断调整样本的权重,从而调整误差,迭代学习出M个弱分类器,再进行相应的组合,属于迭代类算法。
  • adboost算法:
  • 不断调整样本的权重来达到降低模型分类误差,最后使用线性组合基函数的方式
  • 提升树:
  • 以基函数为决策树的adboost特殊算法,因为决策树有回归决策树和分类决策树,所以存在回归提升树和分类提升树。
  • gbdt:
  • 以梯度为目标进行迭代优化
  • xgboost:
  • 以泰勒二阶展开为目标进行迭代优化

adboost

前向分步算法与Adaboost关系的推导

https://blog.csdn.net/thriving_fcl/article/details/50877957

gbdt

提升算法

另外描述

https://blog.csdn.net/aspirinvagrant/article/details/48415435

shrinking可以防止过拟合

https://blog.csdn.net/sb19931201/article/details/52506157

衰减

Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。用方程来看更清晰,即没用Shrinkage时:(yi表示第i棵树上y的预测值, y(1~i)表示前i棵树y的综合预测值) 
y(i+1) = 残差(y1~yi), 其中: 残差(y1~yi) = y真实值 - y(1 ~ i) 
y(1 ~ i) = SUM(y1, …, yi) 
Shrinkage不改变第一个方程,只把第二个方程改为: 
y(1 ~ i) = y(1 ~ i-1) + step * yi

即Shrinkage仍然以残差作为学习目标,但对于残差学习出来的结果,只累加一小部分(step*残差)逐步逼近目标,step一般都比较小,如0.01~0.001(注意该step非gradient的step),导致各个树的残差是渐变的而不是陡变的。直觉上这也很好理解,不像直接用残差一步修复误差,而是只修复一点点,其实就是把大步切成了很多小步。本质上,Shrinkage为每棵树设置了一个weight,累加时要乘以这个weight,但和Gradient并没有关系。这个weight就是step。就像Adaboost一样,Shrinkage能减少过拟合发生也是经验证明的,目前还没有看到从理论的证明。


xgboost

  • 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的logistic回归(分类问题)或者线性回归问题(回归问题)
  • 传统GBDT在优化的时候只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同事用到了一阶和二阶导数。顺便
  • 提一下,xgboost工具支持自定义代价函数或者损失函数,只要导数可一阶和二阶可导。
  • xgboost在代价函数里面加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点,
  • 每个叶子节点上输出的score的L2模的屏风和。从偏差-方差均衡的角度来讲,正则项降低了模型的方差,使得学习出来的模型更加简单,防止过拟合, 这也是xgboost优于传统gbdt的一个特性。
  • Shringkage(缩减),相当于学习速率(xgboost中的eta)。在xgboost进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了
  • 削弱每颗树的影响,然后面有更大的学习空间。实际应用中,一般把eta设置小一点,然后迭代次数设置大一点。(补充:传统GBDT的实现也有学习速率 )
  • 列抽样(column subsampling).xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboos异于传统
  • gbdt的一个特性。
  • 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
  • xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
  • 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

https://www.zhihu.com/question/41354392

xgboost使用经验总结

  • 多类别分类时,类别需要从0开始编码
  • Watchlist不会影响模型训练。
  • 类别特征必须编码,因为xgboost把特征默认都当成数值型的
  • 调参:Notes on Parameter Tuning 以及 Complete Guide to Parameter Tuning in XGBoost (with codes in Python)
  • 训练的时候,为了结果可复现,记得设置随机数种子。
  • XGBoost的特征重要性是如何得到的?某个特征的重要性(feature score),等于它被选中为树节点分裂特征的次数的和,比如特征A在第一次迭代中(即第一棵树)被选中了1次去分裂树节点,在第二次迭代被选中2次…..那么最终特征A的feature score就是 1+2+….
  • http://wepon.me/2016/05/07/XGBoost%E6%B5%85%E5%85%A5%E6%B5%85%E5%87%BA/

特征工程

数据预处理

https://blog.csdn.net/u012162613/article/details/50629115

  • 标准化
  • 变换后各维特征有0均值,单位方差。也叫z-score规范化(零均值规范化)。 计算方式是将特征值减去均值,除以标准差。

一般会把train和test集放在一起做标准化,或者在train集上做标准化后, 用同样的标准化器去标准化test集,此时可以用scaler。

实际运用中,需要做特征标准化的常见情景是:svm 因为svm假设每个特征的分布式一致的,详细的需要进一步研究。

  • 最小-最大规范化
  • 最小-最大规范化对原始数据进行线性变换,变换到[0,1]区间(也可以是其他固定最小最大值的区间)
  • 规范化 正则化
  • 规范化是将不同变化范围的值映射到相同的固定范围,常见的是[0, 1],此时也叫归一化。
X = [[ 1, -1, 2],[ 2, 0, 0], [ 0, 1, -1]]
sklearn.preprocessing.normalize(X, norm='l2') 
  • 特征二值化
  • 给定阈值,将特征转换为0/1
  • 类别特征编码
  • 有时候特征是类别型的,而一些算法的输入必须是数值型的,此时需要对其进行编码

enc = preprocessing.OneHotEncoder() enc.fit(1, 1, 0 [0, 2, 1], [1, 0, 2]]) enc.transform(0, 1, 3).toarray() #array( 1., 0., 0., 1., 0., 0., 0., 0., 1.


例如,xgboost模型中用到城市这个维度的话,需要进行类别的特征编码;

  • 标签编码
le = sklearn.preprocessing.LabelEncoder()  
le.fit([1, 2, 2, 6]) 
le.transform([1, 1, 2, 6])  #array([0, 0, 1, 2]) 
#非数值型转化为数值型
le.fit(["paris", "paris", "tokyo", "amsterdam"])
le.transform(["tokyo", "tokyo", "paris"])  #array([2, 2, 1])
  • 特征中含有异常值时
  • 生成多项式特征
poly = sklearn.preprocessing.PolynomialFeatures(2)
poly.fit_transform(X)