上一篇文章主要学习了以下机器学习算法的大致框架,这篇文章就来简要的介绍监督学习中的常见分类算法。
一句话介绍:在特征空间中,从训练样本集中选取特征与待分类样本最接近的K个样本,其中出现频率最高的分类标签作为待分类样本的预测分类,k值大小的选择没有理论选择最优,往往是结合K-折交叉验证得到最优k值选择。
优:
1.对数据没有假设,理论简单,可用于非线性分类;
缺:
1.在样本不平衡情况下很难奏效;
2.计算量大,需要大量内存,每次分类都要进行一次全局计算,
重点:
1) 闵可夫斯基距离(Minkowski Distance) :表示一类距离,基于以下公式,其中点x=(x1,x2,x3,,,xn),点y=(y1,y2,y3,,,yn),公式表示对两点的各个维度的数据分别进行计算并聚合,p=2是欧氏,p=1是曼哈顿,p趋向正无穷是切比雪夫。
a)欧氏距离(又称之为欧几里得度量):欧几里得空间中最常见的两点之间的距离表示法,二维形象表达:走直线。
b)曼哈顿距离(城市街区距离(City Block distance)):标明两个点在标准坐标系上的绝对轴距总和,依赖路径,像街区两个建筑物间的行驶路程,二维形象表达:走直角边。
c)切比雪夫距离(又称“棋盘距离”):二个点之间的距离定义是其各维坐标数值差绝对值的最大值,国际棋盘上两点间到达最快步数(可斜着走)。
2)标准化欧氏距离 (Standardized Euclidean distance,加权欧氏距离 ):优化欧氏距离,克服欧氏距离中各维度数据分布不一样的缺点,首先将各维度的数据分别进行标准化,比如两个n维样本点x=(x1,x2,x3,,,xn),y=(y1,y2,y3,,,yn),比如第一维,mu1=(x1+y1)/2,s1为x1和y1的标准差,对x1,y1分别进行标准化,均值被抵消,标准差直接通分了,最后结果如下:
标准化欧氏距离的优点是排除了量纲的影响,缺点是没有考虑到各维度间的相关性。
3)马氏距离(Mahalanobis Distance):表示数据的协方差距离,依然是在改进欧氏距离,与标准化欧氏距离不同的是它考虑到各维度之间的联系,其中Σ是多维随机变量的协方差矩阵,如果协方差矩阵是单位向量,也就是各维度独立同分布,马氏距离就变成了欧氏距离。(x=(x1,x2,x3,,,xn),y=(y1,y2,y3,,,yn),协方差矩阵是(x1,y1)(x2,y2),,,(xn,yn)这n维向量之间的协方差组成的n*n的矩阵,当然这里包括之前都是拿两个非原点举例,各维度的均值mu1=(x1+y1)/2都被化简掉了,如果是单样本算距离,那就与原点距离,这时候mu就会表现在公式里了)
马氏距离的优点是排除了量纲、相关性的影响;缺点是夸大了变化微小的变量的作用
4)巴氏距离(Bhattacharyya Distance):度量两个概率分布的相似性,与Bhattacharyya系数密切相关,后者是两个统计样本或总体之间重叠量的度量。
5)汉明距离(Hamming distance):汉明距离就是按照位置对应比较,两个码中不同的数的个数。
6)夹角余弦(Cosine):对于两个n维样本点x=(x1,x2,x3,,,xn)和y=(y1,y2,y3,,,yn),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。
夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。
7)杰卡德相似系数(Jaccard similarity coefficient)
杰卡德相似系数:两个集合A和B的交集元素在A,B的并集中所占的比例,是衡量两个集合的相似度一种指标。
杰卡德距离:与杰卡德相关系数相反,用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度
8)皮尔逊系数(Pearson Correlation Coefficient)
1)混淆矩阵(也称误差矩阵,Confusion Matrix):
第一象限:真实值是negative,模型认为是positive的数量(False Positive=FP)
第二象限:真实值是positive,模型认为是positive的数量(True Positive=TP)
第三象限:真实值是positive,模型认为是negative的数量(False Negative=FN)
第四象限:真实值是negative,模型认为是negative的数量(True Negative=TN)
2)ROC曲线(受试者工作特征曲线):横轴为"实际为0却被预测为1的概率”(False positive rate),纵轴为“实际为1且被预测为1的概率”(True positive rate) 。ROC曲线上的一系列点,代表选取一系列的阈值(threshold)产生的结果(阈值表示对分类器结果的概率值进行划分的数值分界点)。我们希望TPR大,而FPR小,在图上就是曲线尽量往左上角贴近。45度的直线一般被常用作Benchmark,即基准模型,我们的预测分类模型的ROC要能优于45度线。
3)AUC面积:ROC曲线下的面积,取值在0与1之间,越大表示分类器预测效果越好。
4)RECALL(召回率):在测试集中为正类的数据中,有多少数据被正确预测(预测结果是正类)
5)PRECISION(精确率):在预测结果为正类的数据中,有多少数据被正确预测(原本就是正类)
6)Accuracy(准确率):正确分类的样本数与样本总数之比,就称为准确率
此处的2、3两步是所有分类算法的一般步骤。
假设各维度属性相互独立,以贝叶斯定理为基础的简单分类器,在已知先验概率情况下,求最大后验概率。朴素贝叶斯的思想基础是:对于给出的待分类项的特征,求解在此种特征出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。在不用到贝叶斯概率或者任何贝叶斯模型的情况下,朴素贝叶斯模型也能奏效。
优点:
1.朴素贝叶斯仅需要较少的训练样本集,性能较好;
2.预测快(对项目的训练和分类仅仅是特征概率的数学运算而已),对大数量训练和查询具有较高的速度;
3.对缺失数据不太敏感;
4.结果解释容易理解;
5.适用于多类别预测、文本分析、情感分析;
缺点:
1.“所有特征彼此独立”在现实中不太可能成立,但是它可以大大简化计算(先验概率连乘),而且有研究表明对分类结果的准确性影响不大;
2.如果某个分类没有在训练样本集中出现,那么模型无法对其进行预测,往往采用拉普拉斯平滑法;
3.它没有办法考虑特征之间的相互关系,比如我喜欢A和B各自的电影,但是它不知道我不喜欢他们在一起演的电影。
Logistic Regression 是一种分类模型,并常用于二分类。Logistic 分布是一种连续型的概率分布,分布函数为:
其中,是位置参数,>0是形状参数
Logistic 分布的形状与正态分布的形状相似,但是 Logistic 分布的尾部更长,所以我们可以使用 Logistic 分布来建模比正态分布具有更长尾部和更高波峰的数据分布。
对于二分变量,形象的来说,在n维特征空间中用一个决策边界函数(超平面)将所有样本点划分在两个阵营里(线性可分),这个决策边界函数往往是各维度变量的线性组合,,(x是一个向量,w是系数)如果>0那么判断为类别1,这里需要将决策边界函数和分类概率P(Y=1)联系起来,通过比较概率P(Y=1|x)来判断类别。
对于二分类数据集:
用下面的方程解决离散值和连续值之间的连接问题:
关系式为:
求解参数的方法:梯度下降、牛顿法,优化的目标是找到一个方向,使得朝着这个方向能将损失函数(logistic模型中,最小化损失函数和最大化似然函数是一样的)不断减小,往往借助一阶或二阶偏导的各种组合,迭代次数的选择有两种,一是设定阈值,二是设定最大迭代次数。
优点:
1.logistic是线性模型,在相同的条件下线性模型的稳定要优于非线性模型;
2.logistic模型的效果评价除了验证数据集外,还有统计学的验证,感觉更严谨;
3.模型参数的解释更科学,比如某变量的影响直接用发生比就能解释;
缺点:可能存在过拟合
SVM(support vector machines, SVM)是一种二分类模型,它的基本模型是找到定义在特征空间上的最大间隔超平面,以此进行样本划分。使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个具有稀疏性和稳健性的分类器 。SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一 。
线性可分:D0和 D1 是 n 维欧氏空间中的两个点集。如果存在 n 维向量 w 和实数 b,使得所有属于 D0 的点 x_i都有 w_i+b>0 ,而对于所有属于 D1 的点 x_j 则有 wx_j+b<0 ,则我们称 D0 和 D1 线性可分。
最大间隔超平面(决策边界函数):在特征空间中,将两类点集D0和D1完全正确划分开的线性函数就是一个超平面。以最大间隔把两类样本分开的超平面叫做最大间隔超平面。
SVM尝试寻找一个最优决策边界,即最大间隔超平面,即各类样本点到超平面的距离最远。
由二维空间点到直线距离公式推广除n维空间里点x=(x1,x2,x3,,,xn)到直线 的距离为:
决策树的主要工作,就是自上而下递归,以信息熵(不确定性)为度量构造一棵熵值下降最快的树,每个节点都要选取最优特征、划分该节点上的数据集,直到分支的样本数据都属于同一类别,即叶子节点的熵值需为0。如何选取特征:ID3算法(J. Ross Quinlan于1986年提出)采用信息增益最大的特征;C4.5算法(J. Ross Quinlan于1993年提出)采用信息增益比选择特征;CART算法(Breiman等人于1984年提出)利用基尼指数最小化准则。
优点:
1.决策树的思想简单易于理解,可以轻松处理特征之间的关系;
2.分类效率高;并且可调,不需要像支持向量机一样调很多参数,效果也比支持向量机好一点;
3.且是非参数的方法,不用担心是否有异常值,是否线性可分;
4.几乎不用做数据预处理,比如归一;可以处理连续值和离散值;
5.可以处理多维度输出的分类问题;
缺点:
1.处理大数据集时,构建决策树会耗费大量时间,但是用决策树对新数据进行分类是非常快速的,所以可以将构造好的决策树存起来,需要分类时再读取出来。
2.但它不支持在线学习,一旦加入新样本,决策树需要全部重建;
3.容易出现过拟合(随机森林可以很大程度上减少过拟合),可以通过交叉验证、剪枝来选择模型,提高泛化能力;
4.对于复杂关系,决策树很难学习,比如“或”;
通常停止分裂的条件:增益(损失函数下降的程度)小于阈值、限定树的最大深度、当叶节点的样本量过少少于固定值。
ID3:以信息熵和信息增益为衡量标准,寻找最优划分特征。计算每一个特征的信息增益,选取具有较高信息增益特征作为给定的测试属性,即最优特征。
样本集D的类别信息熵:
其中p_i表示样本集D中的个分类标签的比重。样本集D有n个分类标签,类别信息熵表示样本集的纯度,信息熵越小,样本集的纯度越高,信息不确定性越小,比如一个二分类样本集的纯度肯定低于只有一个分类标签的样本集(信息熵为0);由于p_i在0到1之间,所以信息增益一定是大于等于0的;我们用决策树进行的每次划分,都希望分支节点的样本尽可能属于同一类,即“纯度”越来越高。
某个属性信息熵(条件熵:表示在某种属性的条件下,属性的各类别出现的不确定性之和):假设属性s有m个可能的取值{s1,s2,s3,...,sm},则属性s的信息熵:属性s的每个分支的类别信息熵与权重(该分支的样本数除以总样本数)的乘积:
某个属性划分样本集获得的信息增益:( 类别信息熵 - 属性信息熵 )表示信息不确定性减少的程度。某个属性的信息增益越大,这个属性就可以更好地减少划分后样本的不确定性,即模型的纯度越高,就可以更快地完成分类目标。
缺点:
1.ID3算法计算信息增益的结果会偏向取值比较多的特征(因为假设某个属性的分支特别多,每个分支都只有一个样本,那么属性信息熵就是0,那么信息增益肯定最大,但这不合理,并不能选择最优特征,进而才有C4.5做改进);
2.仅仅适用于处理离散属性样本;
3.没有考虑缺失值;
4.没有考虑过拟合问题;
5.仅仅可以做分类;
6.构建的是多叉树,运算效率不如二叉树。
C4.5:以信息增益率为选择最优特征的标准,信息增益率 = 信息增益 / 内在信息
内在信息(属性分裂信息):某个属性特征的分支数量信息和尺寸信息,信息增益率以内在信息为分母,就是平衡了ID3算法中的属性偏向缺陷,如果这个属性本身分支多,不确定性就很大,那就越不倾向于选取它,这是对单纯用信息增益的补偿。
其中,q_k是该属性的第k个分支拥有样本量的比重。
信息增益率:
C4.5对ID3的改进除了以上一点,还有另外两点:
1.缺失值处理:一种情况是,没有选定最优划分特征时,样本中存在特征A的缺失,这时,可将样本划分为两类,一类是无特征A缺失的样本D1,一类是有特征A缺失的样本D2,然后正常对D1计算信息增益比,最后乘上一个系数,这个系数是无特征A确实样本加权后站加权样本的比重。另一种情况是,已经选定了最优特征,可以将所有特征A缺失的样本都划入所有所有子节点,只不过要按各个子节点样本比例加权分配。
2.连续特征的处理:连续特征离散化,m个样本取相邻两个样本均值,一共有m-1个划分点,对比这m-1个划分点作为该连续属性划分点的信息增益,取最大信息增益对应的点,则该点就是将该连续属性划分成离散属性的点,再按照ID3算法的逻辑选最优特征。
缺点:
1.同ID3,C4.5也只能用于分类;
2.熵模型有大量耗时的对数运算,如果有连续值就还要有大量排序运算;
3.对于过拟合问题,C4.5虽然有剪枝处理,但剪枝仍有优化空间;
4.构建的也是多叉树,运算效率不如二叉树。
CART算法(分类与回归树classification and regression tree):(使用基尼系数来代替信息增益比,基尼系数代表模型的不纯度,基尼系数越小,模型越纯,特征越好。)它也是由上而下递归,构造二叉树。对于每个节点的数据集,都要以最小化基尼系数为衡量标准,选择最优特征的最优特征值,以最优特征的最优特征值为依据将该节点上的数据集划分为两个部分,放到该节点的左右子节点上去,再重复以上步骤进行新一轮的划分,直到某个节点的数据集的基尼系数小于阈值(包括基尼系数为0,即所有样本都属于同一分类这一理想情况),或者数据集中的样本个数小于阈值,或者数据集中没有特征了,才停止递归。对生成的决策树做预测的时候,假如测试集里的样本A落到了某个叶子节点,而节点里有多个训练样本。则对于A的类别预测采用的是这个叶子节点里概率最大的类别。
样本数据集D的基尼系数:对于样本D,样本量为|D|,假设有k个分类,第k个分类的样本量为|Dk|则样本D的基尼系数为
在特征A取某个特征值A_i的条件下,样本数据集D的基尼系数:假设特征A有m个取值,分别为A_1、A_2、A_3、,,,A_m,对于某个特征值A_i可以将样本集D分为两个类D1和D2,则
计算特征A的所有特征值的基尼系数,选最小的作为特征A的最小基尼系数,将所有特征的最小基尼系数做对比,再选最小的作为该节点的划分标准。
CART对离散特征处理:不断地二分离散特征(如概念中介绍的,选择最优特征的最有特征值作为标准将样本数据集二分,分为取该特征值的样本、不取该特征值的样本(二叉树)。于ID3和C4.5不同,每个离散特征可能会多次参与节点的建立,ID3和C4.5中每个离散特征仅参加一次节点的建立,即所有的分支对应每个特征值(多叉树))
CART对连续特征处理:同C4.5,只不过是用最小化基尼系数的逻辑来选择划分点。
CART算法还可以做回归,以最小平方误差作为划分样本的依据,采用叶子节点数据集的均值或中位数来输出结果。
CART算法的剪枝处理:自下而上比较各个非叶子节点剪枝与不剪枝的误差,如果剪枝后的误差小,则将该节点变成叶节点。
优点:
1.对比基尼系数和熵模型的表达式,二次运算比对数简单很多,基尼系数可以做为熵模型的一个近似替代;
2.构造的是二叉树,运算效率比多叉树高;
3.CART算法可以做回归;
4.剪枝处理可以应对过拟合。
监督学习算法常常会得到有偏好的模型,称为弱监督模型(仅在某些情况下表现较好),集成学习就是组合多个弱监督模型,进而得到一个更好更全面的强监督模型,即使组合中某个弱监督模型得到错误的预测,也可以通过组合中所有模型的结果投票,对其进行纠正。
从结构上,集成学习分为三类:Bagging(并行)、Boosting(串行)、Stacking(树形)
从组合成份上,集成学习分为:组合不同模型、组合不同参数的同一模型、组合不同数据集的同一模型
从组合方式上,集成学习分为:少数服从多数的投票制、加权求和制
从数据拆分上,集成学习分为:按行拆分数据集(数据集抽样),按列拆分特征(特征抽样)
先介绍一下bootstrap(自助法):一种有放回的抽样方法,从样本量为n的原始数据集中有放回抽取n个训练样本,进行k轮抽取,得到k个样本训练集,这k个训练集之间是相互独立的。
Bagging(bootstrap averaging):并行法,首先随机抽取k个样本数据集,分别建模,预测结果投票制
BaggingClassifier:首先从原始样本集中用bootstrap方法抽取k个样本数据集,用相同的算法对每个样本数据集训练出不同的模型,预测结果采用投票制。
RandomForestClassifier(随机森林):以随机的方式建多个决策树,预测结果采用投票制,其中个随机的方式有两层含义,一层是bootstrap随机抽取k个样本训练集,一层是随机抽取特征,即子树在分裂的时候都是基于随机抽取出来的部分特征,这样保证了各个子树的多样性。
VotingClassifier:对样本数据集采用多个不同算法训练出不同的模型,预测结果采用投票制。
Boosting(逐步提升):串行法,不用抽样,仅对原始训练数据集,后建的模型给前面模型预测错的样本以更大的权重(存在过拟合风险),预测结果是根据各个模型错误率算权重,加权组合制。
AdaBoost(自适应提升算法,标准的Adaboost仅支持二分类问题):本质是加法模型,前向分布算法,提高前一轮弱监督模型中分类错误的样本的权重,降低分类正确的样本的权重。因此,在后面的训练中,接下来的分类器就更加“关注”那些分错的样本点,这样,多个弱分类器组合起来就是Adaboost。
GBDT((Gradient Boosting Decision Tree)梯度提升决策树):
1.gbdt 也是通过采用加法模型,每次迭代基于上一个弱监督模型的残差,对其进行拟合,减小训练过程产生的残差来达到将数据分类或者回归的算法;
2.弱监督模型必须采用CART,对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度;
3.预测结果是各个弱分类器的加权平均;
XGBoost(改进版的GBDT):
1.加入正则项防止过拟合;
2.GBDT每次使用全部数据,而XGBOOST采用boostrap进行随机采样,类似随机森林;
3.GBDT采用CART作为弱分类器,XGBoost支持多种类型的弱分类器,比如线性分类器;
4.前者只使用代价函数一阶导,后者使用二阶泰勒展开;
Stacking:是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为训练集进行再训练,从而得到完整的stacking模型。