策略分享

量化机器学习系列分享(四)更多种类的分类模型

由dontbelazy创建,最终由dontbelazy 被浏览 25 用户

我们今天分享的四种模型,包括上次分享的逻辑回归,都是一些轻量级的分类模型,适用于数据量少,特征量少的分类任务

\

1. 支持向量机(SVM)

1.1 SVM的概念

支持向量机(Support Vector Machine)是在神经网络流行之前最强大的机器学习算法

SVM在二分类问题上的逻辑原理是:

  • 假设我们的样本中有两个类别,我们可以把样本画到图上
  • 如果切一刀下去,怎样切可以尽可能地把两个类别尽可能地分开

比方说以下图像中

  • 横轴是第一个特征,纵轴是第二个特征,红蓝颜色是标签(红色为一个类别,蓝色为另一个类别)
  • 如果我们想画一条直线,把红蓝两个标签尽可能地分开,我们就可以画如图的那条斜线

如何做到尽可能地分开两个类别呢,这个其实是一个几何的思维,比方说在以下的例子中,我们像把圆圈和五角星尽可能地分开

  • 如果是绿色的线,就太靠近圆圈类了
  • 如果是蓝色的线,就太靠近五角星类了
  • 如果是粉色的线,就既靠近圆圈类,也靠近五角星类了
  • 最好的是红色的线,离圆圈类,离五角星类都比较远

离两个类别都尽可能地远,做到的目标是最大化间隔(Maximum Margin)

  • 类似于逻辑回归,这个优化目标也无法通过求导解方程的方式来完成
  • SVM的优化需要梯度下降,而且这个训练过程通常要比其他模型慢很多

其实在SVM分类的时候,我们会发现一个有趣的现象

  • 在决定这个分类边界的时候,我们主要看的是靠近边界的数据点,而远离边界的数据点并不是那么重要
  • 好比我们在分类的时候,把那些模棱两可的搞明白了,分类就清晰了
  • 这些靠近边界的,模棱两可的,在分类的时候起决定作用的,就叫做支持向量(Support Vector)

\

1.2 SVM在高维数据上的应用

SVM分类的时候,分类的边界叫分割超平面(Separate Hyperplane),决定边界的点叫做支持向量(Support Vector),这些名次都是矩阵中的概念

  • 超平面的概念,比方说二维空间中,一维的直线就是超平面;三维空间中,二维的平面就是超平面;四维空间中,三维的空间就是超平面……
  • 向量其实就是一个数据点,比方说一个数据,其实是一个1 x K维度的向量,K是特征数量,就类似于数据在表格中的一行

以下是一个三维空间中的SVM示例图

  • 这个情景中,X轴是第一个特征,Y轴是第二个特征,Z轴是第三个特征,颜色表示标签分类
  • 此时要想把两个类别分开,就要用到一个平面了

\

1.3 SVM在无法线性分割情况下的解决方法

无法线性分割的情况,就好比以下图像,三角类和圆圈类,交融在一起了,一刀切下去不可能完全分开

这种情景一般有两种解决方案

  • 要么允许分类错误
  • 要么不切直线,而是切一条曲线,甚至多条曲线

\

1.3.1 软间隔SVM

软间隔SVM本质上还是要切一条直线,但是我们允许分类错误,相对地,我们之前提到的一刀下去能分清楚的其实叫做硬间隔SVM

软间隔SVM在优化的时候,既要尽可能地把两个类别分开(最大化间隔),也要尽可能少分类错一些样本(最大化负的分类误差=最小化分类误差)

软间隔SVM情景下,支持向量既包括靠近分界线的,也包括被分类为错误类别的

\

1.3.2 核方法(Kernel Method)

核方法的本质是使用核函数,将不能线性分割的数据拓展到一个更高维的空间,再在高维空间进行分割

例如下面的这个例子

  • 如果是二维空间中,我们没办法用一条直线将红绿两个类别分开
  • 但是假如我们有一个“神奇的手”,可以把中间的红色提起来,把周围的绿色压下去,再从中间切一条“二维直线”,就可以把红绿两个类别分开了
  • 在数据上运用的核函数,就是这样一个“神奇的手”

如果退回的二维空间,核函数的效果,就类似于一个曲线分割

常用的核函数有:

  • 多项式核函数(Polynomial Kernel):适用于简单的曲线分类,容易欠拟合
  • 径向基函数核(Radial Basis Function Kernel,RBF Kernel):适用于复杂的曲线分类,容易过拟合
  • 但是不用担心,SVM中其实是可以设置惩罚参数(类似于岭回归里的)来避免过拟合的

SVM中欠拟合和过拟合的示例图

\

1.4 SVM的代码实现

https://bigquant.com/codeshare/95650751-305a-4bc3-9d78-a23b88a71b82

\

2. K近邻算法(KNN)

2.1 KNN算法的概念

KNN是一种神奇的机器学习算法,它的算法逻辑是

  • 对于一个测试集数据来说,要想看它的标签是什么
  • 只需要在训练集上,看看它和现有的训练集数据哪些比较像,选出K个(一般是奇数个)和它最像的“邻居”
  • 把这K个邻居的标签的多数,赋予给这个测试数据,就可以了

这个过程当中,其实根本没有任何的训练过程,所以KNN也被称为“懒算法”

这当中有一个超参数需要选择,就是K,涉及到使用验证集去做超参数选择

在决定K个邻居的多数标签是什么的时候,其实就是一个投票的过程,这个投票机制有两个思路

  • 一个是等权投票:所有邻居都占1票
  • 一个是加权投票:离得越近的邻居,所占的权重越大

\

2.2 数据间距离的衡量

为了选出邻居,我们要对数据间的距离进行衡量

衡量距离的方法主要有三种:

  • 曼哈顿距离:L1距离
  • 欧几里得距离:L2距离
  • 余弦距离:角距离 / 弧度距离

\

2.3 KNN代码实现

https://bigquant.com/codeshare/7c5bb889-b5ef-42a6-8ece-8fa57be69e78

\

3. 朴素贝叶斯方法

3.1 朴素贝叶斯方法的概念

朴素贝叶斯是一个典型的概率算法,回顾一下我们在学校里学的贝叶斯公式

贝叶斯的公式的思想是

  • 如果我们想求的是,已知B情况下A的概率,它和已知A情况下B的概率是成正比的
  • 当然这当中还有两个重要元素,就是A自身的无条件概率与B自身的无条件概率

利用之一思想,我们把A比做标签,B比做特征(比方说只有B这一个特征)

  • P(B|A)就是,已知标签的情况下,特征的概率,这个可以从训练数据上求得,比方说P(B=0|A=1),其实就是训练集中标签为1的数据中,特征为0的比例为多少,比方说这一数字是0.6
  • P(A)就是标签的无条件概率,也可以从训练数据上求得,比方说P(A=1),其实就是训练集中标签为1的比例为多少,比方说这一比例是0.4
  • P(B)就是特征的无条件概率,也可以从训练数据上求得,比方说P(B=0),其实就是训练集中特征为0的比例为多少,比方说这一比例是0.5
  • P(A|B)其实就是,已知特征的情况下标签的概率,其实就是我们的预测目标,比方说新样本的特征为0,那么这个样本标签为1的比例就是P(A=1|B=0) = P(B=0|A=1) x P(A=1) / P(B=0) = 0.6 x 0.4 / 0.5 = 0.48,如果以0.5为分界线的话,我们认为这个新样本的标签不应该是1

这是一个特征的版本,我们将它拓展到多个特征的版本,公式为

  • 这个公式的推导中,有一个重要的假设就是特征之间X1,X2,……Xn是相互独立的
  • 这个假设是否成立,可以利用我们之前分享中提到的,特征间的相关性检验,相关性热力图来判断

朴素贝叶斯分为两个版本:

  • 一个是非参数型(sklearn.naive_bayes.CategoricalNB),适用于特征是名义类型的,估计方法就是用频率代替概率,训练过程其实就是数数
  • 一个是参数型(sklearn.naive_bayes.GaussianNB),适用于特征是数字类型的,我们假设P(特征|标签)服从正态分布,训练过程有真正的参数调优

\

3.2 平滑处理

普通的朴素贝叶斯方法,没有办法应对未知特征的问题

  • 当我们的测试集中,出现了一个特征值,是之前从来没见过的,比方说B=2在训练集中从来没出现过,那么P(B=2)与P(B=2|A)都无法计算
  • 那么这个样本的标签我们就无法预测了

为了避免这样的事情,我们可以在训练的时候使用平滑处理的方法,常用的平滑处理方法叫做拉普拉斯平滑处理

  • 对于训练样本中出现过的概率,它的计算方法为:

  • 对于样本当中没出现过的概率,它会计算为,是一个假的人定的概率

\

3.3 朴素贝叶斯的代码实现

https://bigquant.com/codeshare/0f4d0333-9a63-490e-b0a1-646664949ebe

\

4. 感知机(Perceptron)

4.1 感知机的概念

感知机(Perceptron)是神经网络算法的基本单元

  • 很多个感知机放在一起就是大名鼎鼎的深度学习神经网络算法
  • 一个感知机单独拿出来也可以做一些分类任务

感知机的运算公式是:

  • 假设我们有F个特征,每个特征一个参数,特征X这个时候也可以叫做输入
  • 我们先给特征和参数来一个线性组合:Z = theta0 + theta1 X1 + theta2 X2 + …… + thetaF XF
  • 之后把线性组合套在一个激活函数中,Y = f(Z),最终的结果Y我们叫做输出,输出其实并不局限于二分类,多分类和回归也是支持的
  • 这个套路其实我们并不陌生
    • 如果激活函数是线性函数,它的公式就和线性回归是一样的
    • 如果激活函数是逻辑函数,它的公式就和逻辑回归是一样的

感知机的设计灵感,就是仿照人类的神经元

  • 信息由树突进入神经元
  • 之后在细胞里通过放电做到信息处理
  • 最后由轴突输出信息

\

4.2 感知机的代码实现

https://bigquant.com/codeshare/e77df795-3c9a-4683-8650-645894ddb5cf

\