各类机器学习算法原理及优缺点

一、逻辑回归

1.1 原理

将线性回归的结果通过sigmod函数映射到0到1之间,如果结果越接近0或者1,说明分类结果的可信度越高,对于线性不可分的数据,可以对非线性函数进行线性加权,得到一个不是超平面的分割面。

 

 

在进行分类时,通过比较上面两式的大小来将输入实例分配到概率值大的那一类。

 

本质上是线性函数

1.2 目标函数:

交叉熵损失函数/负对数似然函数

 

1.3 梯度

迭代公式:

1.4 优缺点

 

优点:

1 ) 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。

2 ) 模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度。

3 ) 训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。

4 ) 资源占用小,尤其是内存。因为只需要存储各个维度的特征值。

5 ) 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。

缺点:

1 ) 准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。

2 ) 很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。

3 ) 处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题 。

4) 逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。

二、SVM

2.1 原理

支持向量机可以分为线性核和非线性两大类。其主要思想为找到空间中的一个更够将所有数据样本划分开的超平面,并且使得样本集中的所有数据到这个超平面的距离最短

2.2 目标函数

间隔最大化原理,寻找最优分隔面

 

核函数:

线性核,多项式核,高斯核,指数核,sigmoid核,拉普拉斯核

2.3 优缺点

优点

1)能够处理非线性特征的相互作用;

2)无需依赖整个数据;

3)泛化能力较强;

需要对数据提前归一化,很多人使用的时候忽略了这一点,毕竟是基于距离的模型,所以LR也需要归一化

缺点

1)当观测样本很多时,效率并不是很高;一个可行的解决办法是模仿随机森林,对数据分解,训练多个模型,然后求平均,时间复杂度降低p倍,分多少份,降多少倍

2)对非线性问题没有通用解决方案,有时候很难找到一个合适的核函数;

3)对缺失数据敏感;

对于核的选择也是有技巧的(libsvm中自带了四种核函数:线性核、多项式核、RBF以及sigmoid核):

1)如果样本数量小于特征数,那么就没必要选择非线性核,简单的使用线性核就可以了;

2)如果样本数量大于特征数目,这时可以使用非线性核,将样本映射到更高维度,一般可以得到更好的结果;

3)如果样本数目和特征数目相等,该情况可以使用非线性核,原理和第二种一样。

对于第一种情况,也可以先对数据进行降维,然后使用非线性核。

2.4 svm 和 LR 比较

相同点:

    LR和SVM都都是监督学习算法;可以用作分类;都是判别模型;不考虑核函数情况下LR和SVM都是线性分类算法

不同点:

  1. loss function不同

  2. 支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局

  3. 支持向量机可以采用非线性核函数解决非线性问题

  4. 支持向量机需要对数据normalization

  5. 支持向量机损失函数自带正则(½||w||^2),LR必须另外在损失函数上添加正则项!!!

三、决策树

决策树是由一个个“决策”组成的树, 放“决策依据”的是非叶结点,放“决策结果”的是叶结点。

3.1 原理

3.1.1 ID3算法:

信息熵:

联合熵

条件熵

信息增益

样本D,特征A

I(D,A)=H(D)−H(D|A)

(1)不支持连续特征

(2)采用信息增益大的特征优先建立决策树的节点。在相同条件下,取值比较多的特征比取值少的特征信息增益大。

(3)不支持缺失值处理

(4)没有应对过拟合的策略

3.1.2 C4.5 算法:

信息增益比:

(1)剪枝的算法有非常多,C4.5的剪枝方法有优化的空间

(2)C4.5生成的是多叉树,很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率

(3)C4.5只能用于分类

(4)C4.5使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算

 

3.1.3 CART 算法:

基尼徐庶:

节点越不纯,GINI值越大

分类:选择使子节点的GINI值最小的属性作为分裂的方案。即最小化(分类树)

回归:选择使子节点回归方差最小的属性作为分裂的方案

(1)既可处理分类,又可处理回归问题

(2)容易过拟合,需要剪枝

3.2 优缺点:

优点

1)计算简单,易于理解,可解释性强;

2)可以处理有缺失属性的样本;

3)能够处理不相关的特征;

4)速度快

5)能对大型数据源做出可行且效果良好的结果

缺点

1)容易发生过拟合(随机森林可以很大程度上减少过拟合);

2)忽略了数据之间的相关性;

3)对于那些各类别样本数量不一致的数据,在决策树当中,信息增益的结果偏向于那些具有更多数值的特征(只要是使用了信息增益,都有这个缺点,如RF)。

 

四、随机森林

4.1 原理

bagging方法,即bootstrap aggregating

随机森林建立了多个决策树,一般是CART决策树。随机对样本集采样T次,每次采样m个,对这T个样本集随机选择n个特征训练T个决策树

回归:T个弱分类结果算术平均作为最终结果

分类:T个弱分类投票选出得票最多的作为最终类

 

4.1.1 Isolation Forest

对于在T个决策树的样本集,IForest也会对训练集进行随机采样,但是采样个数不需要和RF一样,对于RF,需要采样到采样集样本个数等于训练集个数。但是IForest不需要采样这么多,一般来说,采样个数要远远小于训练集个数,因为我们的目的是异常点检测,只需要部分的样本我们一般就可以将异常点区别出来了。

对于每一个决策树的建立, IForest采用随机选择一个划分特征,对划分特征随机选择一个划分阈值。这点也和RF不同。

IForest一般会选择一个比较小的最大决策树深度max_depth,原因同样本采集,用少量的异常点检测一般不需要这么大规模的决策树。

对于异常点的判断,则是将测试样本点x拟合到T颗决策树。计算在每颗决策树上该样本的叶子节点的深度ht(x)。,从而可以计算出平均高度h(x)。此时我们用下面的公式计算样本点x的异常概率:

4.2 优缺点

RF的主要优点有:

    1) 训练可以高度并行化,对于大数据时代的大样本训练速度有优势。个人觉得这是的最主要的优点。

    2) 由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。

    3) 在训练后,可以给出各个特征对于输出的重要性

    4) 由于采用了随机采样,训练出的模型的方差小,泛化能力强。

    5) 相对于Boosting系列的Adaboost和GBDT,RF实现比较简单。

    6) 对部分特征缺失不敏感。

    RF的主要缺点有:

    1)RF模型容易陷入过拟合,在某些噪音比较大的样本集上

    2) 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。


 

五、adaboost/gbdt/xgboost/ligthgbm

5.1 Adaboosting

详见:https://www.cnblogs.com/NextNight/p/6227526.html

http://www.cnblogs.com/pinard/p/6133937.html

5.1.1 原理

1. 先给数据集中的每个样本均分权值,训练一个弱分类器,然后根据此弱分类器,计算每个样本的分类错误率,分错的权值增大,使用加权后选取的训练数据代替随机选取的训练样本,这样将训练的焦点集中在比较难分的训练数据样本上;

2. 将弱分类器联合起来,使用加权的投票机制代替平均投票机制。让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。

5.1.2 损失函数

指数损失函数为:

学习算法使用前向分步算法:即下一步的推导计算要用上一步的结果,因此我们需要最小化下面的式子

5.1.3 优缺点

Adaboost的主要优点有:

    1)Adaboost作为分类器时,分类精度很高

    2)在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。

    3)作为简单的二元分类器时,构造简单,结果可理解。

    4)不容易发生过拟合

    Adaboost的主要缺点有:

    1)对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。

 

5.2 GBDT

5.2.1 原理

Adaboost,是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同,为拟合结果的误差。

 

在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是ft−1(x), 损失函数是L(y,ft−1(x)), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失函数L(y,ft(x)=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。

 

GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。

5.2.2 常用损失函数

分类问题:

1. 指数损失,同adaboost

2. 对数损失函数

回归问题:

1. 均方差

2. 绝对值

3. Huber损失,它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量

 

5.2.3 优缺点

GBDT主要的优点有:

    1) 可以灵活处理各种类型的数据,包括连续值和离散值。

    2) 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。

    3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

GBDT的主要缺点有:

    1) 难以并行训练数据。由于弱学习器之间存在依赖关系,不过可以通过自采样的SGBT来达到部分并行。

5.3 xgboost

https://blog.csdn.net/yinyu19950811/article/details/81079192

 

gbdt第n颗树训练时,需要用到第n-1颗树的(近似)残差。从这个角度来看,gbdt比较难以实现分布式(ps:虽然难,依然是可以的,换个角度思考就行)

5.3.1 xgboost与gbdt对比

1. 传统的GBDT以CART作为基分类器,xgboost还支持线性分类器。可以通过booster[default=gbtree]设置参数:gbtree:tree-based models;gblinear:linear models;

2. GBDT只用到了一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶与二阶导数,并且指出自定义代价函数,只要它们可导。

3. xgboost在代价函数中加入了正则化项,用于控制模型的复杂度,新增的是叶子节点输出L2平滑。学习出来的模型更加简单,防止过拟合。

4. XGBoost生成CART树考虑了树的复杂度,GDBT未考虑

5. 新增了shronkage和column subsampling,为了防止过拟合。

6. XGBoost在选取最佳切分点时可以开启多线程进行,大大提高了运行速度

5.3.2 优缺点

优点

1. 利用了二阶梯度来对节点进行划分,相对其他GBM来说,精度更加高。

2. 在损失函数中加入了L1/L2项,控制模型的复杂度,提高模型的鲁棒性。

3. 提供并行计算能力,主要是在树节点求不同的候选的分裂点的Gain Infomation(分裂后,损失函数的差值)

4. 算法的运算速度快利用局部近似算法对分裂节点的贪心算法优化,取适当的eps时,可以保持算法的性能且提高算法的运算速度。

5.  支持自定义损失函数,既可以用来分类又可以用来回归

 

缺点

1. 需要pre-sorted,这个会耗掉很多的内存空间(2 * #data * # features)

2. 数据分割点上,由于XGB对不同的数据特征使用pre-sorted算法而不同特征其排序顺序是不同的,所以分裂时需要对每个特征单独做依次分割,遍历次数为#data * #features来将数据分裂到左右子节点上。

3. 处理粒度太细了,尽管使用了局部近似计算

4. 在寻找特征分裂点时(level-wise),会产生大量的cache随机访问。

5.4 lightGBM

5.4.1

https://www.jianshu.com/p/3daf08229d78

 

传统的boosting算法需要对每一个特征都要扫描所有的样本点来选择最好的切分点,这是非常的耗时。为了解决这种在大样本高纬度数据的环境下耗时的问题,Lightgbm使用了如下两种解决办法:

一是GOSS(Gradient-based One-Side Sampling, 基于梯度的单边采样),不是使用所用的样本点来计算梯度,而是对样本进行采样来计算梯度;

二是EFB(Exclusive Feature Bundling, 互斥特征捆绑) ,这里不是使用所有的特征来进行扫描获得最佳的切分点,而是将某些特征进行捆绑在一起来降低特征的维度,是寻找最佳切分点的消耗减少。这样大大的降低的处理样本的时间复杂度,但在精度上,通过大量的实验证明,在某些数据集上使用Lightgbm并不损失精度,甚至有时还会提升精度。


 

因此LightGBM针对这些缺点进行了相应的改进。

1. LightGBM基于histogram算法代替pre-sorted所构建的数据结构,利用histogram后,会有很多有用的tricks。例如histogram做差,提高了cache命中率(主要是因为使用了leaf-wise)。

2. LightGBM利用了GOSS来做采样算法。在机器学习当中,我们面对大数据量时候都会使用采样的方式(根据样本权值)来提高训练速度。又或者在训练的时候赋予样本权值来关于于某一类样本(如Adaboost)。

3. 由于histogram算法对稀疏数据的处理时间复杂度没有pre-sorted好。因为histogram并不管特征值是否为0。因此采用了EFB来预处理稀疏数据。


 

六、朴素贝叶斯

朴素贝叶斯属于生成式模型(关于生成模型和判别式模型,主要还是在于是否是要求联合分布)

 

6.1 优缺点:

优点

1. 对小规模的数据表现很好,能处理多分类任务,适合增量式训练;

2. 对缺失数据不太敏感,算法也比较简单,常用于文本分类。

缺点:

1. 需要计算先验概率;

2. 分类决策存在错误率;

3. 对输入数据的表达形式很敏感。

 

七、最近邻算法——KNN

KNN即最近邻算法,其主要过程为:

1. 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);

2. 对上面所有的距离值进行排序;

3. 选前k个最小距离的样本;

4. 根据这k个样本的标签进行投票,得到最后的分类类别;

如何选择一个最佳的K值,这取决于数据。一般情况下,在分类时较大的K值能够减小噪声的影响。但会使类别之间的界限变得模糊。一个较好的K值可通过各种启发式技术来获取,比如,交叉验证。另外噪声和非相关性特征向量的存在会使K近邻算法的准确性减小。

近邻算法具有较强的一致性结果。随着数据趋于无限,算法保证错误率不会超过贝叶斯算法错误率的两倍。对于一些好的K值,K近邻保证错误率不会超过贝叶斯理论误差率。

7.1 优缺点

优点

1. 可以用来做分类也可以用来做回归;

2. 可用于非线性分类;

3. 训练时间复杂度为O(n);

4. 对数据没有假设,准确度高,对outlier不敏感;

 

缺点

1. 计算量大;

2. 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);

3. 需要大量的内存;

 

五、梯度下降

 

梯度下降解决函数最优化问题的算法,是对所有未知数求偏导,所得偏导函数组成的向量.

梯度下降是让梯度中所有偏导函数都下降到最低点的过程


 

参考:

https://blog.csdn.net/u010159842/article/details/52918815

 

你可能感兴趣的:(机器学习)