有监督学习——支持向量机、朴素贝叶斯分类
1. 支持向量机
支持向量机(Support Vector Machine, SVM)最初被用来解决线性问题,加入核函数后能够解决非线性问题。主要优点是能适应小样本数量
高维度特征
的数据集,甚至是特征维度数高于训练样本数的情况。
先介绍几个概念:
最优超平面
:Hyperplane,SVM通过学习数据空间中的超平面达到二值分类。在预测中,在超平面一侧被认为是一个类型的数据,另一侧被认为是另一种类型数据。
超平面在一维空间中是一个点;在二维中是一条线;三维中是一个平面。在更高维度只能描述为“超平面”。普通线性可分问题中,符合分类要求的超平面会有无穷多个。
软间隔
:Soft Margin,是为了解决因噪声数据导致的过拟合,允许计算超平面时在训练集上存在错误数据。
有时,在当下维度,无论如何都找不到合适的超平面分割两类数据,这就是所谓的非线性问题
。但是,任何有限维度的非线性问题在更高维度的空间里总可以变换成线性可分问题。
SVM可以拉格朗日乘子法(Lagrange Multiplier)实现对超平面求解问题的升维。通过拉格朗日乘子法将求超平面参数的目标
转换为用高维中数据点向量两两点积(dot-product)值求解
二次规划问题,SVM无须将所有训练数据映射到高维空间,而只需要知道这些数据在高维空间里的点积。
核函数
:Kernel Function,输入为两个低维空间向量,输出高维空间点积的函数。SVM选择核函数既可以选择一些通用核函数,也可以自定义。
核函数
一些常用的核函数如下:
- 线性核(linear):直接返回输入向量的点积,速度最快。因为实际并没有升维,适合于本身特征维度较高、样本数量很大的场景。
- 多项式核(ploynomial):\(k(p,q)=(p \cdot q+1)\times d\),其中超参数\(d\)是提升到的维度。
- 高斯径向基核(Gaussian radial basis function):\(k(p,q)=exp(-\gamma||p-q||^2)\),应用最广泛的SVM核,\(\gamma\)参数值越大越容易拟合。
- Sigmoid核:\(k(p,q)=tanh(a\times p\cdot q + r)\),其中\(tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}\)也是一种非线性核,有两个超参数\(a\)、\(r\)可以调整。
scikit-learn中的SVM
在sklearn.svm中提供了三种分类/回归封装类。
- SVC/SVR:最普通的SVM分类器/回归器,可通过kernel参数设置使用的核函数,使用C参数配置松弛因子。
- NuSVC/NuSVR:带有nu参数的分类器/回归器,nu参数的作用与C参数类似,都是用来配置模型对训练数据的拟合程度的。
- LinearSVC/LinearSVR:使用liblinear库的线性核函数分类器/回归器,其在模型中加入了线性回归惩罚参数。
以SVC类为例:
from sklearn import svm # 引入SVM包
X = [[0, 0], [2, 2]] # 训练数据
y = [1, 2]
clf = svm.SVC(kernel='rbf') # 初始化使用径向基核分类器
clf.fit(X, y) # 训练
t = [[2, 1], [0, 1]] # 测试集
clf.predict(t)
# array([2, 1])
clf.decision_function(t)
# array([ 0.52444566, -0.52444566])
训练和预测方法与之前的模型差别较小,注意decision_function()
函数,他返回的是输入的数据集与模型超平面之间的距离,正负关系表示超平面的哪一测,另外,距离绝对值越大则分类的可靠性越高。
名称 | 解释 | SVC/SCR | NuSVC/NuSVR | LinearSVC/LinearSVR |
---|---|---|---|---|
C | 松弛因子,取值\(0 - \infty\) | √ | √ | |
kernel | 取值"linear" "poly" "rbf" "sigmoid"等 | √ | √ | |
gamma | "ploy" "rbf" "sigmoid" 三种核的超参数 | √ | √ | |
tol | SMO算法中的停止阈值 | √ | √ | √ |
nu | 取值0~1,控制对训练数据的拟合程度 | √ | ||
penalty | 线性模型惩罚项,"l1"或"l2" | √ |
2. 朴素贝叶斯分类
朴素贝叶斯(Naive Bayes)是一种非常简单的分类算法。优点在于可以对预测标签给出理论上完美的可能性估计,但要求数据多维特征之间相互独立。
基础概率
- 概率值常用\(P\)表示,古典概率取值范围为[0,1],e.g.事件A一定不会发生,则有概率\(P(A)=0\)
- 条件概率:用\(P(A|B)\)表达,意为:若发生B,发生A的概率为多少。
- 联合概率:表示两件事同时发生的概率,表达式包括:\(P(AB)\)、\(P(A,B)\)、\(P(A\bigcap B)\)。意为:事件A、B同时发生的概率为多少。
- 事件之间并的概率:\(P(A\bigcup B)\),意为:事件A或B至少一个事件发生的概率。
- 加法原理:\(P(A\bigcup B)=P(A)+P(B)-P(A\bigcap B)\)
- 乘法原理:\(P(A\bigcap B)=P(B)\cdot P(A|B)=P(A)\cdot P(B|A)\)
- 两事件独立的充分必要条件:\(P(A\bigcap B)=P(A)\cdot P(B)\),即事件B发生对事件A是否没有任何影响,即\(P(A|B)=P(A)\),反之亦然。
- 贝叶斯定理:\(P(A|B)=\frac{P(A)P(B|A)}{P(B)}\),其中:
- \(P(A|B)\):后验概率,是指在得到“结果”的信息后重新修正的概率,是“执果寻因”问题中的"果"。例如,如果我们从红色盒子和蓝色盒子中随机抽取一个水果,发现是苹果,那么这个苹果来自蓝色盒子的概率就是一个后验概率。
- \(P(A)\):先验概率,是指根据以往经验和分析得到的概率,如全概率公式。它是在实验或采样前就可以得到的概率。例如,我们知道骰子每个面出现的概率都是1/6,这就是一个先验概率。
- \(P(B|A)\):似然度,是用来度量模型和数据之间的相似度的一个函数。它是给定模型参数下,观察到数据的概率。例如,如果我们假设硬币朝上的概率是p,那么抛5次看到3次朝上的似然度就是\(L(p) = C(5,3) * p^3 * (1-p)^2\)。
- \(P(B)\):标准化常量,是贝叶斯公式中的一个分母,用来保证后验概率的和为1。它等于全概率公式的结果,即所有可能的原因导致结果的概率之和。
举例讲解下贝叶斯定理的使用:
有两个袋子:
- a袋:4个红球,3个绿球,3个黄球
- b袋:2个红球,7个绿球,11个黄球
任取一袋,再从中取出一颗巧克力发现其为红色,那么它来自a的概率是多少?
根据问题定义:
- 事件A:取到a袋
- 事件B:取到红球
计算贝叶斯定理中的各项:
- 先验概率:取到a袋的概率,\(P(A)=\frac{1}{2}\)
- 似然度:在a袋中取红球的概率\(P(B|A)=\frac{4}{4+3+3}=\frac{2}{5}\)
- 标准化常量:即取红球的概率,取到红球的=取a袋中的红球的概率+取b袋中的红球的概率,\(P(B)=\frac{1}{2}\times \frac{4}{10}+\frac{1}{2}\times\frac{2}{20}=\frac{1}{4}\)
- 后验概率(最后的答案):\(P(A|B)=\frac{P(A)P(B|A)}{P(B)}=\frac{(1/2)\times(2/5)}{1/4}=\frac{4}{5}\)
贝叶斯分类原理
在有监督学习中,朴素贝叶斯定义公式\(P(A|B)=\frac{P(A)P(B|A)}{P(B)}\)中的事件\(A\)看成被分类标签,事件\(B\)看成数据特征。通常数据特征是\(n\)维的,因此\(P(B)\)演变为\(n\)个特征的联合概率,因此在机器学习中,贝叶斯公式为:
\(x_1,x_2,...x_n\)是数据的\(n\)维特征,\(y\)是预测标签。
- 预测:在给定特征情况下,使用贝叶斯公式计算每个标签的后验概率。最后获得最高概率的标签便是预测标签。此外,不仅是最可能的标签,也能给出其他标签的概率。
- 训练:对于训练来说关注的是贝叶斯公式中右侧的先验概率和似然度。
- 先验概率:可由训练者根据经验直接给出,也可自动计算:统计训练数据中每个标签的出现次数,除以训练总数就可直接得到每个标签的先验概率\(P(y)\)。
- 似然度:假定\(n\)维特征的条件概率符合某种联合分布,根据训练样本估计该分布的参数。比如对于高斯分布来说,学习参数有期望值和方差。
- 独立假设:朴素贝叶斯假设所有\(n\)维特征之间是相互独立的(所以叫naive)。这简化了计算难度,事件独立性的充分必要条件有:
似然函数为:
高斯朴素贝叶斯(Gaussian Naive Bayes)
高斯朴素贝叶斯使用的高斯分布就是常说的正态分布,假定所有特征条件分布符合:
其中\(\mu_y\)、\(\sigma_y\)被学习的模型参数特征期望值和方差。
from sklearn import datasets # scikit-learn资料数据库
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB # 引入高斯朴素贝叶斯模型
gnb = GaussianNB() # 初始化模型对象
gnb.fit(iris.data, iris.target) # 训练
gnb.class_prior_ # 查看模型先验概率
# array([0.33333333, 0.33333333, 0.33333333]) # 有三种标签,先验概率各自为1/3
gnb.class_count_ # 查看训练集标签数量
# array([50., 50., 50.]) # 训练集每种标签有50个样本
# 由于数据有四维特征,且有三种标签,因此训练后产生3*4=12个高斯模型
gnb.theta_ # 查看高斯模型期望值
# array([[5.006, 3.428, 1.462, 0.246],
# [5.936, 2.77 , 4.26 , 1.326],
# [6.588, 2.974, 5.552, 2.026]])
gnb.var_ # 查看高斯模型方差
# array([[0.121764, 0.140816, 0.029556, 0.010884],
# [0.261104, 0.0965 , 0.2164 , 0.038324],
# [0.396256, 0.101924, 0.298496, 0.073924]])
多项式朴素贝叶斯(Multinomial Naive Bayes)
多项式朴素贝叶斯是用多项分布(Multinomial Distribution)作为似然度概率模型的分类器。衡量的是特征在不同标签之间的分布比例关系,因此特别适合文本分类场景(每个单词在不同类型文章中有一定的分布比例)。
多项式分布的概念:假设某件事件的结果有\(k\)种可能,在实验了\(n\)次之后,每种结果出现了若干。
多项式便是用于描述在试验了\(n\)次之后每种结果发生次数概率的分布。
e.g.普通的骰子有6面,掷骰子的结果便是\(k=6\)的多项式分布。
scikit-learn中的MultinomialNB实现了多项式朴素贝叶斯,使用与高斯朴素贝叶斯相似。
伯努利朴素贝叶斯(Bernoulli Naive Bayes)
伯努利贝叶斯使用伯努利分布(Bernoulli Distribution),所谓伯努利分布也称二值分布,用来描述一次实验只可能出现两种结果的事件概率分布。在学习该模型中要求数据中的所有特征都是布尔/二值类型。贝叶斯公式中第\(i\)个特征的似然度:
其中\(P(i|y)\)是第\(i\)个特征在所有该标签训练数据中出现的比。
from sklearn.naive_bayes import BernoulliNB
# 参数binarize是一个阈值,将非二值转化为二值
clf = BernoulliNB(binarize=1) # 设置特征阈值为1
X = [[0.3, 0.2], [1.3, 1.2], [1.1, 1.2]]
Y = [0, 1, 1]
clf.fit(X, Y) # 训练
clf.predict([[0.99, 0.99]]) # 预测
# array([0])
由于阈值为1的缘故,特征[0.99, 0.99]被认为与[0.3, 0.2]一类,而不是与在数值上与[1.1, 1.2]为同一类标签。
参考文献
[1]刘长龙. 从机器学习到深度学习[M]. 1. 电子工业出版社, 2019.3.