朴素贝叶斯
算法概念
朴素贝叶斯是基于贝叶斯定理与特征条件独立假设的分类算法。对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布。然后基于此基础,对给定的输入
x
x
x,使用贝叶斯定理求出后验概率最大的输出
y
y
y。
算法优点:实现简单,学习和预测效率高,精确度高 算法缺点:无法进行调参
算法原理
首先定义
X
X
X,
Y
Y
Y是随机向量,
P
(
X
,
Y
)
P(X,Y)
P(X,Y)是
X
X
X和
Y
Y
Y的联合概率分布。数据集假定是独立同分布的。
基于条件独立性假设,可以得到:
P
=
(
X
=
x
∣
Y
=
c
k
)
=
P
(
x
(
1
)
=
x
(
1
)
,
?
?
,
x
(
n
)
=
x
(
n
)
∣
Y
=
c
k
)
P=(X=x|Y=c_{k})=P(x^{(1)}=x^{(1)},\cdots,x^{(n)}=x^{(n)}|Y=c_{k})
P=(X=x∣Y=ck?)=P(x(1)=x(1),?,x(n)=x(n)∣Y=ck?)
=
∏
j
=
1
n
P
(
X
(
j
)
=
x
(
j
)
∣
Y
=
c
k
)
=\prod^{n}_{j=1}P(X^{(j)}=x^{(j)}|Y=c_{k})
=j=1∏n?P(X(j)=x(j)∣Y=ck?)
基于贝叶斯公式有
P
(
Y
=
c
k
∣
X
=
x
)
=
P
(
X
=
x
∣
Y
=
c
k
)
P
(
Y
=
c
k
)
P
(
X
=
x
)
P(Y=c_{k}|X=x)=\frac{P(X=x|Y=c_{k})P(Y=c_{k})}{P(X=x)}
P(Y=ck?∣X=x)=P(X=x)P(X=x∣Y=ck?)P(Y=ck?)?
根据全概率公式
P
(
X
=
x
)
=
P
(
X
=
x
∣
Y
=
c
1
)
P
(
Y
=
c
1
)
+
?
+
P
(
X
=
x
∣
Y
=
c
n
)
P
(
Y
=
c
n
)
P(X=x)=P(X=x|Y=c_{1})P(Y=c_{1})+\cdots+P(X=x|Y=c_{n})P(Y=c_{n})
P(X=x)=P(X=x∣Y=c1?)P(Y=c1?)+?+P(X=x∣Y=cn?)P(Y=cn?)
=
∑
i
=
1
n
P
(
X
=
x
∣
Y
=
c
i
)
=\sum_{i=1}^{n}P(X=x|Y=c_{i})
=i=1∑n?P(X=x∣Y=ci?)
所以可以得到
P
(
Y
=
c
k
∣
X
=
x
)
=
P
(
X
=
x
∣
Y
=
c
k
)
P
(
Y
=
c
k
)
∑
i
=
1
n
P
(
X
=
x
∣
Y
=
c
i
)
P
(
Y
=
c
k
)
P(Y=c_{k}|X=x)=\frac{P(X=x|Y=c_{k})P(Y=c_{k})}{\sum_{i=1}^{n}P(X=x|Y=c_{i})P(Y=c_{k})}
P(Y=ck?∣X=x)=∑i=1n?P(X=x∣Y=ci?)P(Y=ck?)P(X=x∣Y=ck?)P(Y=ck?)?
又由于所有情况的分母都为
∑
i
=
1
n
P
(
X
=
x
∣
Y
=
c
i
)
\sum_{i=1}^{n}P(X=x|Y=c_{i})
∑i=1n?P(X=x∣Y=ci?),且由于特征数据是假设独立的,故得到最后的公式为
P
(
Y
=
c
k
∣
X
=
x
)
=
P
(
Y
=
c
k
)
∏
j
P
(
X
(
j
)
=
x
(
j
)
∣
Y
=
c
k
)
P(Y=c_{k}|X=x)=P(Y=c_{k})\prod_{j}P(X^{(j)}=x^{(j)}|Y=c_{k})
P(Y=ck?∣X=x)=P(Y=ck?)j∏?P(X(j)=x(j)∣Y=ck?)
最终得到朴素贝叶斯法分类器可以表示为
y
=
f
(
x
)
=
a
r
g
max
?
c
k
P
(
Y
=
c
k
)
∏
j
P
(
X
(
j
)
=
x
(
j
)
∣
Y
=
c
k
)
y=f(x)=arg\max_{c_{k}}P(Y=c_{k})\prod_{j}P(X^{(j)}=x^{(j)}|Y=c_{k})
y=f(x)=argck?max?P(Y=ck?)j∏?P(X(j)=x(j)∣Y=ck?)
拉普拉斯平滑
在朴素贝叶斯算法中,容易出现预测的数据中,存在零概率的情况,使得整个数据的结果为0,故对其进行拉普拉斯修正,也就是拉普拉斯平滑。
例子如下: 将
P
(
X
=
x
i
∣
Y
=
c
i
)
=
统
计
(
X
=
x
i
∣
Y
=
c
i
)
统
计
(
Y
=
c
i
)
P(X=x_{i}|Y=c_{i})=\frac{统计(X=x_{i}|Y=c_{i})}{统计(Y=c_{i})}
P(X=xi?∣Y=ci?)=统计(Y=ci?)统计(X=xi?∣Y=ci?)? 改为
P
(
X
=
x
i
∣
Y
=
c
i
)
=
统
计
(
X
=
x
i
∣
Y
=
c
i
)
+
λ
统
计
(
Y
=
c
i
)
+
N
?
λ
P(X=x_{i}|Y=c_{i})=\frac{统计(X=x_{i}|Y=c_{i})+\lambda}{统计(Y=c_{i})+N*\lambda}
P(X=xi?∣Y=ci?)=统计(Y=ci?)+N?λ统计(X=xi?∣Y=ci?)+λ? 其中
N
N
N为超参数,
λ
\lambda
λ为数据的特征个数。
代码实现
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
news = fetch_20newsgroups(subset="all")
data = news['data']
label = news["target"]
x_train,x_test,y_train,y_test = train_test_split(data,label,test_size=0.3,random_state=1234)
tf = TfidfVectorizer()
x_train = tf.fit_transform(x_train)
x_test = tf.transform(x_test)
nb = MultinomialNB(alpha=1)
nb.fit(x_train,y_train)
print("模型的准确率",nb.score(x_test,y_test)) #85.03%
y_pre = nb.predict(x_test)
print("模型的F1值为",classification_report(y_test,y_pre))
|