本阶段的学习目的,主要是了解各种算法,并从中选择准确率最高的一种。用到的库是scikit-learn,即sklearn。
朴素贝叶斯
定义
在机器学习中,朴素贝叶斯分类器是一系列以假设特征之间强(朴素)独立下运用贝叶斯定理为基础的简单概率分类器。
通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的,其中:
- B事件发生之前,A事件的概率(A的先验概率),以P(A)表示。
- A事件发生之前,B事件的概率(B的先验概率),以P(B)表示。
- 已知B发生后A的条件概率(A的后验概率),以P(A|B)表示。
- 已知A发生后B的条件概率(B的后验概率),以P(B|A)表示。
如果我们已经知道A、B的先验概率和B的后验概率,希望求得A的后验概率,可以用以下公式:
P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A|B)=P(A)\frac{P(B|A)}{P(B)} P(A∣B)=P(A)P(B)P(B∣A)
其中,P(B|A)/P(B)被称为"可能性函数"(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。
所以,条件概率可以理解成下面的式子:
后 验 概 率 = 先 验 概 率 × 调 整 因 子 后验概率=先验概率 \times 调整因子 后验概率=先验概率×调整因子
贝叶斯推断的含义。我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。
在这里,如果"可能性函数" P ( B ∣ A ) P ( B ) > 1 \frac{P(B|A)}{P(B)}>1 P(B)P(B∣A)>1,意味着"先验概率"被增强,事件A的发生的可能性变大;如果"可能性函数"=1,意味着B事件无助于判断事件A的可能性;如果"可能性函数"<1,意味着"先验概率"被削弱,事件A的可能性变小1。
【例子】水果糖问题
假设有两个一模一样的碗,一号碗有30颗水果糖和10颗巧克力糖,二号碗有水果糖和巧克力糖各20颗。现在随机选择一个碗,从中摸出一颗糖,发现是水果糖。请问这颗水果糖来自一号碗的概率有多大?
以 H 1 H_1 H1表示一号碗, H 2 H_2 H2表示二号碗。由于这两个碗是一样的,所以P( H 1 H_1 H1)=P( H 2 H_2 H2),两个碗被选中的概率相同。因此,P( H 1 H_1 H1)=0.5,即选中一号碗的概率是0.5。
再假定,E表示水果糖,题目问题就变成了在已知E的情况下,来自一号碗的概率有多大,即求P( H 1 H_1 H1|E)。
P ( H 1 ∣ E ) = P ( H 1 ) P ( E ∣ H 1 ) P ( E ) P(H_1|E) = P(H_1)\frac{P(E|H_1)}{P(E)} P(H1∣E)=P(H1)P(E)P(E∣H1)
P ( E ∣ H 1 ) = 30 30 + 10 = 0.75 P(E|H_1) = \frac{30}{30+10} = 0.75 P(E∣H1)=30+1030=0.75
P ( E ) = 30 + 20 30 + 10 + 20 + 20 = 0.625 P(E) = \frac{30+20}{30+10+20+20} = 0.625 P(E)=30+10+20+2030+20=0.625
将数字代入原方程,得到:
P ( H 1 ∣ E ) = 0.5 × 0.75 0.625 = 0.5 × 1.2 = 0.6 P(H_1|E) = 0.5\times \frac{0.75}{0.625}= 0.5 \times 1.2 = 0.6 P(H1∣E)=0.5×0.6250.75=0.5×1.2=0.6
“可能性函数” P ( E ∣ H 1 ) P ( E ) = 1.2 > 1 \frac{P(E|H_1)}{P(E)}=1.2>1 P(E)P(E∣H1)=1.2>1,表明取出水果糖之后(E), H 1 H_1 H1事件的可能性得到了增强1。
朴素贝叶斯类库的GaussianNB
如果要处理的是连续数据,一种通常的假设是这些连续数值的分布曲线将会呈两头低,中间高,左右对称的正态分布(normal distribution),即高斯分布(Gaussian distribution),所以用到的是高斯朴素贝叶斯(GaussianNB)分类算法。
class sklearn.naive_bayes.GaussianNB(*, priors=None, var_smoothing=1e-09)
其中priors为该类的先验概率,var_smoothing为所有特征的最大方差部分默认为1e-9。
In [1]:
import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
In [2]:
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(X, Y) # 根据X,y拟合高斯朴素贝叶斯
In [3]:
print(clf.predict([[-0.8, -1]])) # 对向量X进行分类
Out[3]: [1]
In [4]: print(clf.score([[-0.8, -1]], [1])) # 返回给定X和y的平均准确度。
Out[4]: 1.0
支持向量机
定义
假设某些给定的数据点各自属于两个类之一,我们需要确定新数据点将在哪个类中。如果这些点在一个二维的平面上,支持向量机(support vector machines, SVM)就是划分这两类数据的一条直线。
如上图所示,尽管另一条线能使其他点与线的间隔最大化,但支持向量机首先考虑分类的正确。
不过,SVM在无法区隔时也会忽略异常值,采用折中的方案,SVM的参数决定它如何应对新的异常值。
核(Kernel)
有时,折中的方案的直线也不能很好的分类,如下图:
如果我们想用SVM把上图红蓝点区分开来,需要新建一个变量 z = x 2 + y 2 z=x^2+y^2 z=x2+y2,然后再将z与y区分开来:
这就是SVM的核,它将低维度的特征值(x,y),映射到高维度空间,获得解后再返回原始空间,得到一个非线性的分隔线。
-
sklearn.svm库中默认的核函数是’RBF’(radial basis function, 径向基函数核, 又称为高斯核函数)。
-
实际工作中一般用线性核(Linear)和RBF核:
-
Linear核( K ( x i , x j ) = x i ⋅ x j K(x_i,x_j)=x_i⋅x_j K(xi,xj)=xi⋅xj):主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。
-
RBF核( K ( x i , x j ) = e x p ( − γ ∣ ∣ x i − x j ∣ ∣ 2 ) , γ > 0 K(x_i , x_j ) = exp(−γ||x_i − x_j||^2 ), γ > 0 K(xi,xj)=exp(−γ∣∣xi−xj∣∣2),γ>0):可以处理非线性的情况,linear kernel可以是RBF kernel的特殊情况;sigmoid kernel又在某些参数下和RBF很像。
-
sigmoid核(S函数, K ( x i , x
-