【机器学习】汇总——算法篇

版权声明:欢迎转载,请注明来源 https://blog.csdn.net/linghugoolge/article/details/88336514

 

  • 请简单介绍下SVM
  • 【概念】(名称)支持向量机、SVM、Support Vector Machine,(用途)用于数据分类,(实现方式)在特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可以转化为凸二次优化问题的求解;或者理解为,在高维空间中寻找一个超平面将数据点分隔开,其中涉及到非线性数据到高维数据映射以达到数据线性可分的目的。

    【方法】使用支持向量将不同数据分开,如下图,寻找支持向量,进行最大间隔分类

    【关键概念——支持向量】确定边界的样本点,上图中虚线上的X和O

    【关键概念——核函数(线性不可分)】从线性可分到线性不可分,如下图,从低维空间的不可分映射到高维空间的可分;避免了映射到高维空间的计算复杂度问题,常见多项式核函数,高斯核函数,线性核函数

    【关键概念——松弛变量(软间隔)】outliers处理,引入松弛变量

     

    【特点】支持向量是SVM训练的结果,SVM问题可以转化为凸优化问题,因此可以利用现有的算法发现目标函数的全局最小值。而其他分类算法(例如基于规则的分类器和人工神经网络)都在用基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。

    【优点】

    1、泛化错误低,计算量小(原因:使用了||w||正则项,L2范数正则化);

    2、高维空间下或者特征维度大于样本数仍然有效,小样本效果好(原因:在SVM中起决定性作用的是支持向量);

    3、可以灵活使用不同的核函数。

    【缺点】

    1、大规模训练难以实现(原因:存储训练样本和和矩阵(m阶)空间消耗大);

    2、只支持二分类(解决:通过多个二分类SVM组合解决)

    【例子】文本分类、文字识别

    【扩展1——SVM与LR比较】

    1)Loss function不同

    2)支持向量机仅考虑支持向量,逻辑回归考虑全部的向量

    3)SVM依赖距离,需要normalization,LR不受影响

    4)SVM的损失函数自带正则。

     

  • SVM公式推导(建议手推)
  • 线性硬间隔SVM推导

  • 根据间隔最大化的目标推导出SVM的标准问题
  • 拉格朗日乘子法对偶问题的求解。
  • 使用SMO算法求解max α

    SMO算法的中心思想就是每次选出两个alpha进行优化(之所以是两个是因为alpha的约束条件决定了其与标签乘积的累加等于0,因此必须一次同时优化两个,否则就会破坏约束条件),然后固定其他的alpha值。重复此过程,直到达到某个终止条件程序退出并得到我们需要的优化结果。接下来,就具体推导一下SMO算法的细节。

    本质,从约束条件出发,迭代求解

     

    参考:SMO算法最通俗易懂的解释

    https://blog.csdn.net/qq_39521554/article/details/80723770

  • SVM从原始问题变为对偶问题来求解的原因
  • 对偶问题将原始问题中的约束转为了对偶问题中的等式约束
  • 方便核函数的引入
  • 改变了问题的复杂度。由求特征向量w转化为求比例系数a,在原始问题下,求解的复杂度与样本的维度有关,即w的维度。在对偶问题下,只与样本数量有关。
  •  

    参考:

    1)支持向量机通俗导论(理解SVM的三层境界):https://blog.csdn.net/v_july_v/article/details/7624837

    2)支持向量机(SVM)复习总结https://www.cnblogs.com/arachis/p/SVM.html

    3)LR与SVM的异同:http://www.cnblogs.com/zhizhan/p/5038747.html

     

  • LR的特性与推导
  • 【概念】(名称)逻辑回归、logistic regression、LR,(用途)线性分类器,

    【特点】(优点)实现简单;训练速度快;(缺点)容易欠拟合;只能处理二分类问题。

    【公式推导】(建议手推)

    这里缺少了参数优化的过程

    推到关键点:

  • LR的定义
  • 损失函数(极大似然)
  • 参数优化(梯度下降)
  •  

    参考:

    第5章 Logistic回归:

    https://github.com/apachecn/AiLearning/blob/dev/blog/ml/5.Logistic%E5%9B%9E%E5%BD%92.md

     

  • LR为什么用sigmoid函数。这个函数有什么优点和缺点?为什么不用其他函数?
  • 从LR的目的上来看,在选择函数时,有两个条件是必须要满足的:

    1. 取值范围在0~1之间。

    2. 对于一个事件发生情况,50%是其结果的分水岭,选择函数应该在0.5中心对称。

     

  • 多分类LR
  • 将二分类扩展
    1. 将类型class1看作正样本,其他类型全部看作负样本,然后我们就可以得到样本标记类型为该类型的概率p1;
    2. 然后再将另外类型class2看作正样本,其他类型全部看作负样本,同理得到p2;
    3. 以此循环,我们可以得到该待预测样本的标记类型分别为类型class i时的概率pi,最后我们取pi中最大的那个概率对应的样本标记类型作为我们的待预测样本类型。
  • 向量版本的Softmax函数
  • 朴素贝叶斯为什么被称为“朴素”?谈谈朴素贝叶斯?
  • 【概念】利用贝叶斯公式根据某对象的先验概率计算其后验概率,选择具有最大后验概率的类作为该对象的属性。

    【关键概念-朴素】对条件概率分布做了条件独立性假设,减小模型复杂度

    【算法】基于特征条件独立假设学习输入/输出联合概率分布,然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。

    【特点】(优点)算法简单;所需估计的参数较少;属于生成式模型,收敛速度较快;可以处理多分类问题;(缺点)特征独立假设不一定成立;不能学习特征之间的关系。

    【注意事项】

  • 取对数:概率P很小或者为0,容易下溢,取对数解决;
  • Laplace校准:新特征出现,导致类别的条件概率为0,修改:分子+1,分母+k(类别的个数)
  • 【应用】

    屏蔽社区留言板的侮辱性言论

    https://github.com/apachecn/AiLearning/blob/dev/blog/ml/4.%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF.md

     

    例题:

    题目

    A1,A2,A3是三个特征,Y是分类结果。A1,A2,A3和Y 均只有0和1两种情况。

    A1

    A2

    A3

    Y

    1

    1

    0

    1

    0

    1

    1

    1

    1

    0

    1

    0

    0

    1

    0

    0

    0

    0

    1

    0

     

    1. 朴素贝叶斯(Naive Bayes)为什么朴素?

    朴素贝叶斯中的“朴素”二字突出了这个算法的简易性。

    朴素贝叶斯的简易性表现该算法基于一个很朴素的假设:所有的变量都是相互独立的。用贝叶斯定理可以写成

    但是在很多情况下,所有变量两两之间独立,这几乎是不可能的。

    举个例子: Y = 这个人是否是举重运动员。 X1 = 性别,X2 = 这个人能否举起100公斤的箱子。 变量X1和X2显然不是独立的。

    换句话说,朴素贝叶斯的独立性假设很傻很天真,所以预测精度往往不是很高。

    2. 1,0,0 的分类结果是什么?

    分母都是相同,所以只计算分子即可。

    P(Y=0) = 3/5

    P(Y=1) = 2/5

    P(Y=0|A1=1,A2=0,A3=0) = 3/5 * 1/3 * 2/3 * 1/3 = 2/45

    P(Y=1|A1=1,A2=0,A3=0) = 2/5 * 1/2 * 1/4 * 1/2 = 1/40

    答: 分类结果为0

     

    参考:

    朴素贝叶斯算法 & 应用实例:https://www.cnblogs.com/marc01in/p/4775440.html

     

  • RF与GBDT的区别
  • 【相同点】都是由很多树组成;最终结果由很多棵树一起决定

    【不同】

  • 组成随机森林的树可以是分类树也可以是回归树;GBDT由回归树组成
  • 随机森林bagging思想,可以并行生成;GBDT是boosting,串行生成
  • RF减小模型的方差variance;GBDT减小模型的偏差bias
  • GBDT树的数量过多,引起过拟合;RF不会。
  •  

  • 常见聚类算法
  • Kmeans:选择K个中心,不断迭代至收敛
  • 特点:(优点)速度快,计算简单;(缺点)提前确定K,不一定最优解

    Kmedians是Kmeans改进,使用中值替代均值,减小异常值的影响,但需要排序

  • 均值漂移聚类:基于滑动窗口的算法,找到数据点的密集中心,窗口滑动至密度不再增加,多个窗口有重合,保留包含最多点的窗口
  • 特点:(优点)不需要提前确定K;受均值影响小;(缺点)窗口半径R的选择可能不重要。

  • 凝聚层次聚类:自上而下或者自下而上(HAC)进行聚合
  • 优点:不需要知道有多少K;对距离不敏感。缺点:效率低

     

    各种聚类算法介绍和比较(全):https://blog.csdn.net/u013185349/article/details/82386113

    常见的六大聚类算法(动图):https://blog.csdn.net/Katherine_hsr/article/details/79382249

    https://geekcircle.org/machine-learning-interview-qa/questions/image/9.cluster.algorithms.png

     

  • 决策树
  • 学习算法主要包括:特征选择、决策树的生成、决策树的剪枝

    https://geekcircle.org/machine-learning-interview-qa/questions/image/14.decision_tree_eg.gif

    相当于if-then的判断规则:互斥并且完备

    ID3:每次选择信息增益最大的属性分类

    ID4.5:使用信息增益率替代信息增益;剪枝处理

    CART:对回归树 CART 算法用平方误差最小化准则来选择特征,对分类树用基尼指数最小化准则选择特征

    分类与回归树(Classification and Regression Trees, CART)

    //TODO 需要认真复习DT

    过拟合的处理:剪枝,自下而上进行剪枝

    ID3/ID4.5剪枝:损失函数添加一个L1,代表树节点的个数,自下而上进行收缩,当C减小,则回缩;递归直至根节点;α>=0控制预测误差与模型复杂度之间的关系

    CART:α从小到大,对于每个α,寻找最优结构Ti;最终生成一个子树序列,通过交叉验证,从子树序列中寻找最优结构。

    参考:

    【十大经典数据挖掘算法】CART https://www.cnblogs.com/en-heng/p/5035945.html

     

  • KMeans算法
  •  

    概述:聚类算法,由用户指定K个初始的质心(initial centroids),以作为聚类的类别(cluster),重复迭代直至算法收敛。

    基本算法:

    选取K个初始质心(作为初始Cluster);

    repeat:

    对每个样本点,计算得到据其最近的质心,将其类别标为该质心的cluster;

    重复计算k个cluster对应的质心;

    until 质心不在发生变化(或者分类结果不再发生变化)

    特点:(缺点)受初始质心的影响,局部最优;K的取值影响。

    优化:二分KMeans

    基本算法:

    初始只有一个cluster包含所有样本点;

    repeat:

    从待分裂的clusters中选择一个进行二元分裂,所选的cluster应该是的SSE(平方误差和)最小;

    until 有K个cluster

    参考:

    【十大经典数据挖掘算法】k-means:https://www.cnblogs.com/en-heng/p/5173704.html

  • 集成学习
  • 用于减少方差的bagging
  • 用于减少偏差的boosting
  • 用于提升预测结果的stacking
  •  

  • 为什么使用决策树作为基学习器?
  • 决策树表达能力和泛化能力强,可以通过剪枝快速调整
  • 决策树可以方便地将样本权重整合到训练过程中
  • 决策树是一种不稳定的学习器
  • 不稳定:数据样本的波动会对决策树的结果产生较大的影响

     

    为什么不稳定的学习器更适合作为基学习器?

    1)不稳定的基学习器容易受到样本分布的影响(方差大),引入了随机性,有助于提高集成学习的泛化能力

    2)为了更好引入随机性,有时会选择一个属性子集中的最优分裂属性,而不是全局最优

     

    还有哪些模型也适合作为基学习器?

    神经网络:不稳定;通过调整神经元的数量、网络层数、连接方式、初始权重也能很好引入随机性和改变模型的表达能力

     

    Bagging中能使用线性分类器作为基学习器吗?boosting呢?

    Bagging中不推荐:线性分类器属于稳定的学习器(方差小),对数据不敏感;甚至可能会因为bagging的采样,导致训练中难以瘦脸,增大集成分类器的偏差

    Boosting:boosting主要通过降低偏差方式提升模型的性能,而现象分类器的方差小

    XGB支持

     

    Boosting、bagging与方差、偏差之间的关系

    Boosting降低偏差:减小模型的训练误差,提高模型的复杂度;但不会显著降低方差,因为训练中的基分类器是强相关的,缺少独立性

    bagging降低方差:n个独立不相关的模型预测结果取平均,方差是原来的1/n;

     

  • Boosting
  • (抽样放回)串行策略,基学习器之间存在依赖关系,新的学习器需要依据旧的学习器生成

    https://images2018.cnblogs.com/blog/1180120/201807/1180120-20180713122517325-458611743.png

     

     

  • Bagging
  • Bagging:并行策略,基学习器中间不存在依赖关系

     

    https://images2018.cnblogs.com/blog/1180120/201807/1180120-20180713122552774-1172049695.png是bootstrap aggregating的简写。先说一下bootstrap,bootstrap也称为自助法,它是一种有放回的抽样方法,目的为了得到统计量的分布以及置信区间。

     

  • Stacking(多级学习器)
  • Stacking方法是指训练一个模型用于组合其他各个模型。首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。

    https://img-blog.csdn.net/20180830134947861?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hcXVuZmk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

    参考:

    数据挖掘竞赛利器-Stacking和Blending方式 https://blog.csdn.net/maqunfi/article/details/82220115

    https://img-blog.csdn.net/20170804165429247?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjk2OTQxMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

  • Blending
  • 用不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均。实现简单,但对训练数据利用少了。

     

  • 结合策略
  • 平均法
  • 对数值型输出,最常见的结合策略是使用平均法。

    简单平均法

    加权平均法

    但是对于规模比较大的集成来说,权重参数比较多,较容易导致过拟合。加权平均法未必一定优于简单平均法。

    一般而言,在个体学习器性能相差较大时,宜使用加权平均法,而在个体学习器性能相近时,宜使用简单平均法。

  • 投票法
  • 绝对多数投票法

    若某标记得票过半数,则预测为该标记;否则拒绝预测。

    相对多数投票法

    预测为得票最多的标记。若同时有多个标记获得最高票,则从中随机选取一个。

    加权投票法

  • 学习法
  • 当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合。变成了stacking

     

  • AdaBoost 算法
  • AdaBoost是Boosting策略的一种具体方式

    解决两个基本问题:

  • 每一轮如何改变数据的权值或概率分布?提高上一轮错误分类样本的权值,同时降低正确的权值。
  • 如何将弱分类器组合成一个强分类器?加权加法,增大分类误差率小的基学习器的权值。
  • 前向分步算法
  • 提升树 Boosting Tree
  • 梯度提升(GB)算法
  • 当损失函数为平方损失或指数损失时,每一步的优化是很直观的;但对于一般的损失函数而言,不太容易——梯度提升正是针对这一问题提出的算法;

    梯度提升是梯度下降的近似方法,其关键是利用损失函数的负梯度作为残差的近似值,来拟合下一个决策树。

    如果目标函数是回归问题的均方误差,很容易想到最理想的h(x)应该是能够完全拟合 ,这就是常说基于残差的学习。残差学习在回归问题中可以很好的使用,但是为了一般性(分类,排序问题),实际中往往是基于loss Function 在函数空间的的负梯度学习,对于回归问题残差和负梯度也是相同的。中的f,不要理解为传统意义上的函数,而是一个函数向量,向量中元素的个数与训练样本的个数相同,因此基于Loss Function函数空间的负梯度的学习也称为伪残差

     

  • 梯度提升决策树 GBDT
  • GBDT 是以决策树为基学习器、采用 Boosting 策略的一种集成学习模型(GDBT中使用的是回归树

    与提升树的区别:残差的计算不同,提升树使用的是真正的残差,梯度提升树用当前模型的负梯度来拟合残差。

    算法第 1 步初始化,估计使损失函数最小的常数值,得到一棵只有一个根节点的树

    第 2(i) 步计算损失函数的负梯度,将其作为残差的估计

    对平方损失而言,负梯度就是残差;对于一般的损失函数,它是残差的近似

    第 2(ii) 步估计回归树的节点区域,以拟合残差的近似值

    第 2(iii) 步利用线性搜索估计叶节点区域的值,使损失函数最小化

     

    参考:一步一步理解GB、GBDT、xgboost

    https://www.cnblogs.com/wxquare/p/5541414.html

     

  • XGB
  • 首先,定义一棵树 f(x) 为
  • https://github.com/imhuay/Algorithm_Interview_Notes-Chinese/raw/master/_assets/%E5%85%AC%E5%BC%8F_201807191434562.png

    Here w is the vector of scores on leaves, q is a function assigning each data point to the corresponding leaf, and T is the number of leaves.

  • 对损失函数加入正则项,包括 L2 权重衰减和对叶子数的限制
  • https://github.com/imhuay/Algorithm_Interview_Notes-Chinese/raw/master/_assets/%E5%85%AC%E5%BC%8F_20180719142639.png

  • 使用牛顿法代替梯度下降法寻找最优解
  • 前者使用一阶+二阶导数作为残差,后者只使用了一阶导数

  • 传统 CART树寻找最优切分点的标准是最小化均方差
  • XGBoost 通过最大化得分公式来寻找最优切分点:

    https://github.com/imhuay/Algorithm_Interview_Notes-Chinese/raw/master/_assets/%E5%85%AC%E5%BC%8F_20180719144515.png

    This formula can be decomposed as 1). the score on the new left leaf 2). the score on the new right leaf 3). The score on the original leaf 4). regularization on the additional leaf.

    这同时也起到了“剪枝”的作用——如果分数小于γ,则不会增加分支;

    XGBoost 的一些内部优化

  • 在寻找最佳分割点时,传统的方法会枚举每个特征的所有可能切分点。XGBoost 实现了一种近似的算法,大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。
  • XGBoost 考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper 提到能提高 50 倍。
  • 特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然 Boosting 算法迭代必须串行,但是在处理每个特征列时可以做到并行。
  • 按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致 cache miss,降低算法效率。Paper 中提到,可先将数据收集到线程内部的 buffer,然后再计算,提高算法的效率。
  • XGBoost 还考虑了数据量比较大的情况,当内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。
  •  

     

  • Box–Muller 变换
  • Box–Muller 变换是一个从均匀分布中得到正态分布采样的算法
  • Box–Muller 变换定理:
  • 假设随机变量U1和U2是 IID(独立同分布) 的,且 U1,U2 ∽ U(0,1),令Z1,Z2满足

    https://github.com/imhuay/Algorithm_Interview_Notes-Chinese/raw/master/_assets/%E5%85%AC%E5%BC%8F_20180723153506.png

    则 Z1,Z2 ∽ N(0, 1),即 Z1,Z2 服从标准正态分布。

     

     

猜你喜欢

转载自blog.csdn.net/linghugoolge/article/details/88336514