python sklearn中分类算法的理解及简单应用:朴素贝叶斯、支持向量机(SVM)与决策树

本阶段的学习目的,主要是了解各种算法,并从中选择准确率最高的一种。用到的库是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(AB)=P(A)P(B)P(BA)
其中,P(B|A)/P(B)被称为"可能性函数"(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。
所以,条件概率可以理解成下面的式子:
后 验 概 率 = 先 验 概 率 × 调 整 因 子 后验概率=先验概率 \times 调整因子 =×
贝叶斯推断的含义。我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。

在这里,如果"可能性函数" P ( B ∣ A ) P ( B ) > 1 \frac{P(B|A)}{P(B)}>1 P(B)P(BA)>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(H1E)=P(H1)P(E)P(EH1)
P ( E ∣ H 1 ) = 30 30 + 10 = 0.75 P(E|H_1) = \frac{30}{30+10} = 0.75 P(EH1)=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(H1E)=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(EH1)=1.21,表明取出水果糖之后(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)=xixj):主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。

    • 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(γxixj2),γ>0):可以处理非线性的情况,linear kernel可以是RBF kernel的特殊情况;sigmoid kernel又在某些参数下和RBF很像。

    • sigmoid核(S函数, K ( x i , x j

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值