分类算法
引言
目前在做回归和分类算法的项目,整理手头用到的一些资料,有时间会逐渐更新文档。本文定位为目前常用的一些分类算法,回归的算法会重新开一个帖子(要是有时间的话~~)。还有涉及到数据清洗、文本数据处理的内容就先不放在这里了,等我啥时候理顺了逻辑再来写。
回归和分类
定量输出称为回归,或者说是连续变量预测;
定性输出称为分类,或者说是离散变量预测。
分类与回归的区别
任务 | 输出数据的类型 | 想要通过机器学习算法得到什么 | 模型的评估指标 |
---|---|---|---|
分类 | 离散数据 | 一个决策面,用于对数据进行分类 | 正确率,即预测结果中分类正确数据占总数据的比例 |
回归 | 连续数据 | 一个最优拟合线,可以很好的接近数据集中的各个点 | 调整的 R 2 R^2 R2 |
机器学习中常见的六种分类算法
机器学习中常见的六种分类算法:K近邻,决策树,朴素贝叶斯,逻辑回归,支持向量机,随机森林。
1. K近邻(KNN)
K近邻算法是K-Nearest neighbors Algorithms的简称,它采用测量不同特征值之间的距离方法进行分类,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例。这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
使用数据范围:数值型和标称型。文本数据距离的计算比较困难。
2. 决策树
决策树是一种非参监督学习方法,没有固定的参数,对数据进行分类或回归学习。决策树的目标是从已知数据中学习得到一套规则,能够通过简单的规则判断,对未知数据进行预测。
优点:计算复杂度不高, 输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。
缺点:可能会产生过度匹配的问题。
适用数据类型:数值型和标称型,有待考察
3.朴素贝叶斯
朴素贝叶斯是基于贝叶斯定理和特征条件独立假设的分类方法,它通过特征计算分类的概率,选取概率大的情况进行分类。
在sklearn
中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB
,MultinomialNB
和BernoulliNB
。其中GaussianNB
就是先验为高斯分布的朴素贝叶斯,MultinomialNB
就是先验为多项式分布的朴素贝叶斯,而BernoulliNB
就是先验为伯努利分布的朴素贝叶斯。
优点:在数据较少的情况下依然有效,可以处理多类比问题。
缺点:对于输入数据的准备方式较为敏感。
适用于数据类型:标称型数据
4.逻辑回归
逻辑回归(Logistic Regression)是一种用于解决二分类问题的统计机器学习方法。其核心是利用回归的思想解决二分类任务,并给出两个类的相应概率,即用于估计某种事物的可能性。常见的应用包括垃圾邮件判别、某用户是否购买某种商品以及点击率(CTR)预估问题。在病案首页填写中,可用来预测某病案是否存在漏填手术的可能性。逻辑回归模型形式简单,从特征的权重可以看到不同特征对最后结果的影响,因此模型有很强的解释性。
优点:计算代价不高,易于理解和实现。
缺点:容易欠拟合,分类精度可能不高,逻辑回归对文本数据的回归较容易过拟合,适用度较低。
使用数据类型:数值型和标称型数据
5.支持向量机(SVM)
支持向量机英文为Support Vector Machine,它是一种监督式学习的方法,它广泛的应用于统计分类以及回归分析中。支持向量机是一种十分常见的分类器,核心思路是通过构造分割面将数据进行分离。
优点:计算代价不高,易于理解和实现
缺点:容易欠拟合,分类精度可能不高
使用数据类型:数值型和标称型数据
6.随机森林
随机森林(Random Forest)是基于Bagging框架的决策树模型,基分类器为决策树,是一种有监督的分类算法。随机森林的基本原理是在把决策树作为基分类器构建 Bagging 集成的基础上,进一步在决策树的训练过程中引入了一种随机属性选择,作为集成学习的一个子类,最终依靠所有决策树的分类投票次数来指定最后的分类结果。集成学习通过建立几个模型组合来解决单一预测问题。集成学习简单原理是生成多个弱分类器,这些弱分类器各自独立地学习和做出预测,将多个预测结果最后结合成单预测,预测结果要优于任何一个单分类的做出预测。
随机森林算法可用于分类和回归问题,其应用非常广泛,主要的应用场景包括金融领域、医疗领域、商业零售。
优点
- 不同决策树可以由不同主机并行训练生成,训练速度快、效率高。
- 随机森林算法既继承了 CART 的优点,又将所有的决策树通过 Bagging 的形式结合起来,避免了单个决策树造成过拟合问题。
- 相同的随机森林算法或随机森林分类器可用于分类和回归任务。
- 随机森林分类器能够处理缺失值。
- 当森林里有足够多的树时,随机森林分类器不会过度拟合模型。
- 随机森林分类器可以处理分类特征,也可用于特征工程。
- 几乎无需输入准备、可实现隐式特征选择、训练速度非常快、其他模型很难超越。
缺点
- 劣势在于模型大小、是个很难去解释的黑盒子。
使用数据类型:数值型和标称型数据
Boosting
集成学习和深度学习都是机器学习的热门方向,但相比深度学习来说,集成学习能够在计算资源有限的情况下取得不错的效果,因而比较适用于大部分情况,具有很高的研究价值。 集成学习是使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法 也就是说集成的泛化能力是远大于单个学习器的泛化能力的。为了保证集成的学习能力,需要确保基学习器的准确性和多样性。
集成学习中有两个重要概念,分别为Bagging和Boosting。其中Boosting也被称为增强学习或提升法,是一种重要的集成学习方法,它能够将预测精度仅仅比随机猜测略高的弱学习器增强为预测精度很高的强学习期。这是在直接构造强学习期较为困难的情况下,为学习算法提供了一种有效的新思路和新方法。Boosting主要包括adaboost、GBDT、XGBoost、LightGBM;Bagging主要包括随机森林。
AdaBoost
1.定义
AdaBoost1AdaBoost是Adaptive Boosting(自适应增强)的缩写,是一种新的通用的学习算法,该算法是基于级联结构构建的,级联结构由多级分类器组成。它的自适应在于:被前一个基本分类器误分类的样本的权值会增大,而正确分类的样本的权值会减小,并在此用来训练下一个基本分类器。同时,在每一次迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或者预先制定的最大迭代次数再确定最后的强分类器。
该算法的基本思想是:对训练样本赋予权重分布,并通过更新样本权重来改变训练集分布,算法对错误训练样本加以重视,每次增加错分实例的权重,以使弱分类器被迫集中在训练集的难点上,最终分类判决采用加权最大投票原则来融合各个分类器的结果。在给定的训练集上,反复选出关键的分类特征并扩建弱分类器集,最终强分类器由这些弱分类器线性组合构成。
AdaBoost算法是一种投票式的分类算法,利用分类器组合的方法来提高分类精度。该算法对每个特征构造一个简单分类器,并将分类器进行训练并组合成一个强分类器,算法充分利用各个分类器的优势并避免其劣势,从而可以得到一个最佳的判别。
2.步骤
AdaBoost算法可以简化为3个步骤:
(1)首先,是初始化训练数据的权值分布。假设有 N N N个训练样本数据,则每一个训练样本最开始时,都会被赋予相同的权值: w 1 = 1 N w_1 = \frac{1}{N} w1=N1。
(2)其次,训练弱分类器。具体训练过程:如果某个训练样本点,被弱分类器准确地分类,那么再构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值的更新过的样本被用于训练下一个弱分类器,整个过程如此迭代下去。
(3)最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。
换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
3.优缺点
优点
- AdaBoost提供一种框架,在框架内可以使用各种方法构建子分类器。可以使用简单的弱分类器,不用对特征进行筛选,也不存在过拟合的现象。
- AdaBoost算法不需要弱分类器的先验知识,最后得到的强分类器的分类精度依赖于所有弱分类器。无论是应用于人造数据还是真实数据,AdaBoost都能显著的提高学习精度。
- AdaBoost算法不需要预先知道弱分类器的错误率上限,且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,可以深挖分类器的能力。AdaBoost可以根据弱分类器的反馈,自适应地调整假定的错误率,执行的效率高。
- AdaBoost对同一个训练样本集训练不同的弱分类器,按照一定的方法把这些弱分类器集合起来,构造一个分类能力很强的强分类器,即“三个臭皮匠赛过一个诸葛亮”。
缺点 - 在AdaBoost训练过程中,AdaBoost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致AdaBoost算法易受噪声干扰。此外,AdaBoost依赖于弱分类器,而弱分类器的训练时间往往很长。
- 多分类AdaBoost需要提前确定分类的数量,单纯的AdaBoost不是一种很好的多分类方法。
LightGBM
LightGBM(Light Gradient Boosting Machine)是由柯国霖老师带领开发,微软于 2017 年开源出来的一款 SOTA Boosting 算法框架,主要用于解决 GBDT 在海量数据中遇到的问题,以便其可以更好更快地用于工业实践中。它是基于 GBDT 算法的分布式梯度提升框架,为了满足缩短模型计算时间的需求,LightGBM 的设计思路主要集中在减小数据对内存与计算性能的使用,保证单个机器在不牺牲速度的情况下尽可能地用上更多的数据以及减少机器并行计算时的通讯代价,提升多机并行时的效率,实现在计算上的先行加速。
LightGBM是XGBoost的改进版,XGBoost是基于预排序方法的决策树算法,这种预排序算法的优点是能够精确地找到分割点,但也存在明显的空间复杂度过高、对 Cache 优化不友好等缺点。为了避免XGBoost的缺点,并且能够在不损害准确率的条件下加快GBDT模型的训练速度,LightGBM在传统的GBDT算法上进行优化部分为单边梯度抽样算法、直方图算法、互斥特征捆绑算法、基于最大深度的 Leaf-wise 的垂直生长算法、类别特征最优分割、特征并行和数据并行、缓存优化,这些解决方案使得LightGBM在获得与XGBoost近似精度的同时具有训练速度快、内存占用低的特点。
1.算法原理
相较于XGBoost算法,LightGBM独有的速度优化算法是单边梯度抽样算法和互斥特征捆绑算法,单边梯度抽样算法目的是通过减少数据量,而互斥特征捆绑算法通过减少特征数量来提升模型的训练速度。
(1)单边梯度抽样算法 (GOSS)
单边梯度抽样算法(Gradient-based One-Side Sampling, GOSS)是从减少数据量的角度出发,为了解决抛弃样本导致训练集的数据分布发生改变的问题,其核心思想是根据样本梯度对梯度较大的样本进行保留,对梯度较小的样本按比例进行随机抽样。
(2)互斥特征捆绑算法 (EFB)
互斥特征捆绑算法(Exclusive Feature Bunding)从减少特征的角度出发,高维数据通常是稀疏的,在稀疏特征空间中许多特征是互斥的,即它们不会同时取非零值,将互斥特征捆绑在一起形成一个新的特征,以减少特征数量,提高训练速度。
2.算法优点
- 简单易用,提供了主流的Python\C++\R语言接口,用户可以轻松使用LightGBM建模并获得相当不错得效果;高效可扩展,在处理大规模数据集时高效迅速、高准确度;支持并行化学习,对内存等硬件资源要求不高;鲁棒性强,相较于深度学习模型不需要精细调参便能取得近似的效果。
- LightGBM 直接支持缺失值与类别特征,无需对数据额外进行特殊处理。
- LightGBM 在传统的GBDT算法上进行了如下的优化:LightGBM采用基于Histogram的决策树算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度和内存消耗;在训练过程之中采用单边梯度抽样算法过滤掉梯度小的样本,减少了大量的计算量,采用互斥特征捆绑算法减少了特征数量,降低了内存消耗;采用了基于Leaf-wise算法的增长策略构建树,减少了很多不必要的计算量;采用优化后的特征并行、数据并行方法加速计算,当数据量非常大的时候还可以采用投票并行的策略;同时优化了缓存,提升了缓存命中率。
评价指标
1. 混淆矩阵
混淆矩阵(Confusion Matrix)是数据科学、数据分析和机器学习中总结分类模型预测结果的情形分析表,以矩阵形式汇总样本数据集中真实的样本属性与分类器做出的分类预测结果的实例数目。混淆矩阵进行了对分类预测模型性能更加深入的探索,提供了分类器对哪些类的预测是正确的,哪些类的预测是错误的,以及产生了什么类型的错误。
二分类混淆矩阵结构如下表所示:
真实的类 | 预测的类 | |
正类 | 负类 | |
正类 | TP(真正类) | FN(假负类) |
负类 | FP(假正类) | TN(真负类) |
混淆矩阵显示了分类学习器在测试数据集上可能正确也可能不正确的预测结果从而产生的四种情形,其中涉及的相关术语如下:
- 真正类(TP: True Positive),分类器将正类预测为正类的样本数量。
- 假负类(FN: False Negative),分类器将正类预测为负类的样本数量。
- 假正类(FP: False Positive),分类器将负类预测为正类的样本数量。
- 真负类(TN: True Negative),分类器将负类预测为负类的样本数量。
混淆矩阵中的实例数目计数可以表示为百分比的形式:
(1)真正率(True Positive Rate, TPR)或灵敏度(Sensitivity)定义为被分类器正确预测的正样本的比例,代表实际上为违约同时也被模型判断为违约的样本数量占实际所有违约的样本总量的比值,计算公式为:
T
P
R
=
T
P
T
P
+
F
N
TPR=\frac{TP}{TP+FN}
TPR=TP+FNTP
(2)真负率(True Negative Rate, TNR)或特指度(Specificity)定义为被分类器正确预测的负样本的比例,计算公式为:
T
N
R
=
T
N
T
N
+
F
P
TNR=\frac{TN}{TN+FP}
TNR=TN+FPTN
(3)假正率(False Positive Rate, FPR)定义为被预测为正类的负样本比例,代表实际上为正常但被模型判断为违约的样本数量占实际所有正常负样本的比值,计算公式为:
F
P
R
=
F
P
F
P
+
T
N
FPR=\frac{FP}{FP+TN}
FPR=FP+TNFP
(4)假负率(False Negative Rate, FNR)定义为被预测为负类的正样本比例,计算公式为:
F
N
P
=
F
N
F
N
+
T
P
FNP=\frac{FN}{FN+TP}
FNP=FN+TPFN
(5)准确率(Accuracy),是指分类器分类正确的样本数量占总样本个数的比重。一般情况下,模型的准确率越高,其性能越好。计算公式为:
A
c
c
u
r
a
c
y
=
T
P
+
T
N
T
P
+
F
N
+
T
N
+
F
P
Accuracy=\frac{TP+TN}{TP+FN+TN+FP}
Accuracy=TP+FN+TN+FPTP+TN
但针对样本类别不均衡的情况,准确率这一指标往往难以反映分类器的真实性能。考虑筛查一种相对罕见的疾病的例子,如宫颈癌,其患病率约为 10%(实际统计数据)。如果一名巴氏涂片筛查者将看到的每一张涂片都分类为“正常”,也会有着90%的准确率。但如此高的准确率完全忽略了有10%的女性确实患有这种疾病,却并没有被诊断出来。因此,分类器的性能不能仅仅靠正确分类的数量来评估。
(6)精确率(Precision),又称查准率,是针对预测结果而言的一个评估指标。在模型预测为正样本的结果中,真正是正样本所占的百分比。计算公式为:
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
Precision=\frac{TP}{TP+FP}
Precision=TP+FPTP
(7)召回率(Recall),又称查全率,是针对原始样本而言的一个评价指标。在实际为正样本中,被预测为正样本所占的百分比。计算公式为:
R
e
c
a
l
l
=
T
P
T
P
+
F
N
Recall=\frac{TP}{TP+FN}
Recall=TP+FNTP
精确率和召回率两个度量指标存在着此消彼长的关系,常被用于衡量成功预测一个类比预测其他类更加重要。
(8)
F
1
F_1
F1度量(
F
1
F_1
F1 Score),表示召回率和精确率的调和均值,一个高的
F
1
F_1
F1度量值确保精确率和召回率都比较高。与算术平均和几何平均相比,调和平均更重视较小值,计算公式为:
F
1
S
c
o
r
e
=
2
×
P
r
e
c
i
s
i
o
n
×
R
e
c
a
l
l
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
=
2
×
T
P
2
×
T
P
+
F
P
+
F
N
F_1 Score=\frac{2\times Precision \times Recall}{Precision+Recall}=\frac{2\times TP}{2\times TP+FP+FN}
F1Score=Precision+Recall2×Precision×Recall=2×TP+FP+FN2×TP
由公式可见,
F
1
F_1
F1表示召回率和精确率的调和均值,所以一个高的
F
1
F_1
F1度量值确保精确率和召回率都比较高。与算术平均和几何平均相比,调和平均更重视较小值。
F
1
F_1
F1度量的一般形式能表达出对精确率/召回率的不同偏好,计算公式为:
F
β
=
(
1
+
β
2
)
∗
P
r
e
c
i
s
i
o
n
∗
R
e
c
a
l
l
β
2
∗
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
F_{\beta}=\frac{(1+{\beta}^2)*Precision*Recall}{{\beta}^2*Precision+Recall}
Fβ=β2∗Precision+Recall(1+β2)∗Precision∗Recall
其中当参数
β
>
0
\beta>0
β>0时度量了召回率对精确率的相对重要性;当参数
β
<
1
\beta<1
β<1时精确率有着更大影响;当参数
β
=
1
\beta=1
β=1时退化为标准的
F
1
F_1
F1;当参数
β
>
1
\beta>1
β>1时召回率有着更大的影响。
2. ROC 曲线
接受者操作特征曲线(Receiver Operating Characteristic, ROC 曲线)是通过改变0到1之间用于创建混淆矩阵的临界值,从而绘制纵轴是真正率(TPR),横轴是假正率(FPR)曲线的图形化方法。
ROC曲线实际上描绘了不同阈值下TPR和FPR的轨迹,每一个预测结果在ROC曲线上用一个点来表示。大多数分类器产生一个分数,然后用这个分数作为阈值来决定分类。如果分类器产生一个介于0.0和1.0之间的分数,通常认为任何超过0.5的分数都是正的。
很明显,ROC曲线可以用来为分类器选择一个阈值,使真正率最大化,而假正率最小化。然而,不同类型的问题具有不同的最佳分类器阈值。
ROC曲线和ROC曲线下的面积AUC如下图所示,在ROC曲线中需要重点理解四个点和一条线。
- 点 F P R = 0 , T P R = 1 FPR=0,TPR=1 FPR=0,TPR=1意味着此时分类器很强大,将所有样本都进行了正确分类;
- 点 F P R = 1 , T P R = 0 FPR=1,TPR=0 FPR=1,TPR=0意味着此时分类器很糟糕,将所有样本都进行了错误分类;
- 点 F P R = T P R = 0 FPR=TPR=0 FPR=TPR=0意味着该分类器将所有样本都预测为负样本;
- 点 F P R = T P R = 1 FPR=TPR=1 FPR=TPR=1意味着该分类器将所有样本都预测为正样本。
下图(a)ROC曲线与AUC的虚线上的点表示的是一个采用随机猜测策略的分类器对样本进行分类的结果。例如表示分类器随机对一半的样本猜测为正样本,另一半的样本为负样本的分类结果。根据ROC的定义,一个好的分类模型ROC曲线应该尽可能靠近图的左上角。
3. AUC
AUC(Area Under the ROC Curve),ROC曲线下方的面积。它提供了一种评价模型平均性能的指标。AUC 同时考虑了分类器对于正样本和负样本的分类能力,在样本类别不平衡的情况下,依然能够对分类器做出合理的评估。
可以从 AUC 的取值来评估机器学习分类器性能优劣,当 AUC 取值为0.5时,表示这是一个没有预测能力的分类器,因为此时ROC曲线与对角线重合,本质上是随机猜测。完美分类器的AUC取值为1.0。大多数分类器的AUC取值介于0.5到1.0这两个值之间。当AUC取值小于0.5时,可能表明问题设置出现了错误,分类器在数据中发现了与预期相反的关系。在这种情况下,可以对整个ROC曲线进行检查来判断真正率和假正率坐标轴是不是被标反了。
在对不同类型的机器学习分类模型进行比较时,AUC可以用来作为比较两个或多个分类器的性能指标。可以选择单个阈值,比较分类器在该点上的性能,也可以考虑AUC取值来比较总体性能。分类器的AUC取值越大,表示其分类准确率越高,分类效果越好。如果一个分类模型好于另一个分类模型,那么它的ROC曲线下方的面积要大于另一个。
ROC曲线和ROC曲线下的面积AUC,在少数类样本较少的情况下,面对严重不平衡的分类问题时,仍然能够对分类器给出一个合理的分类性能评估。
参考文献
李胜,张培林,佟若雄.基于多类AdaBoost的故障诊断算法[J].电子测量技术,2011,34(08):101-105.DOI:10.19651/j.cnki.emt.2011.08.026. ↩︎