2023.10.12学习
人工智能基础学习
贝叶斯分类器
基于概率分析实施决策
先验概率(Prior Probability)
后验概率(Posterior Probability):给定观测向量x,某个特定类别的概率 P(y|x)
贝叶斯定理
P
(
y
,
x
)
=
P
(
y
∣
x
)
P
(
x
)
=
P
(
x
∣
y
)
P
(
y
)
P(y,\boldsymbol x)=P(y|\boldsymbol x)P(\boldsymbol x)=P(\boldsymbol x|y)P(y)
P(y,x)=P(y∣x)P(x)=P(x∣y)P(y)
p ( y ∣ x ) = p ( x ∣ y ) P ( y ) P ( x ) = p ( x ∣ y ) P ( y ) ∑ i p ( x ∣ y i ) p ( y i ) p(y|\boldsymbol x)=\frac {p(\boldsymbol x|y)P(y)} {P(\boldsymbol x)}=\frac {p(\boldsymbol x|y)P(y)} {\sum_ip(\boldsymbol x|y_i)p(y_i)} p(y∣x)=P(x)p(x∣y)P(y)=∑ip(x∣yi)p(yi)p(x∣y)P(y)
最大后验概率(MAP)
希望最大后验概率的类别作为预测类别,即
y
∗
=
a
r
g
m
a
x
i
P
(
y
i
∣
x
)
y^*=\mathop{arg \ max}_iP(y_i|\boldsymbol x)
y∗=arg maxiP(yi∣x)
风险(犯错的概率),即结果取另一类别的概率
P
(
e
r
r
∣
x
)
=
{
P
(
y
2
∣
x
)
i
f
决策为
y
1
P
(
y
1
∣
x
)
i
f
决策为
y
2
P(err|\boldsymbol x)=\begin{cases} P(y_2|\boldsymbol x)\ \ \ \ if决策为y_1 \\P(y_1|\boldsymbol x)\ \ \ \ if决策为y_2 \end{cases}
P(err∣x)={P(y2∣x) if决策为y1P(y1∣x) if决策为y2
P ( e r r ∣ x ) = m i n [ P ( y 1 ∣ x ) , P ( y 2 ∣ x ) ] P(err|\boldsymbol x)=min[P(y_1|\boldsymbol x),P(y_2|\boldsymbol x)] P(err∣x)=min[P(y1∣x),P(y2∣x)]
损失 λij:将一个真实标签为cj的样本误分类为ci所产生的损失
条件风险/期望损失:
R
(
y
i
∣
x
)
=
∑
j
=
1
n
λ
i
j
P
(
y
j
∣
x
)
R(y_i|\boldsymbol x)=\sum \limits^n \limits_{j=1}\lambda_{ij}P(y_j|\boldsymbol x)
R(yi∣x)=j=1∑nλijP(yj∣x)
0-1条件风险:
R
(
y
i
∣
x
)
=
1
−
P
(
y
i
∣
x
)
R(y_i|\boldsymbol x)=1-P(y_i|\boldsymbol x)
R(yi∣x)=1−P(yi∣x)
贝叶斯最优分类:
h
∗
(
x
)
=
a
r
g
m
a
x
y
∈
Y
P
(
y
∣
x
)
h^*(\boldsymbol x)=\mathop{arg\ max}_{y\in Y}P(y|\boldsymbol x)
h∗(x)=arg maxy∈YP(y∣x)
朴素贝叶斯分类器
条件:属性条件独立性假设。即各个维度之间的概率是相互独立的、无关的
这也是“朴素”的由来
因为属性条件独立性假设,所以(n为属性个数)
P
(
c
∣
x
)
=
P
(
c
)
P
(
x
∣
c
)
P
(
x
)
=
P
(
c
)
P
(
x
)
∏
i
=
1
n
P
(
x
i
∣
c
)
P(c|\boldsymbol x)=\frac {P(c)P(\boldsymbol x|c)} {P(\boldsymbol x)}=\frac {P(c)} {P(\boldsymbol x)}\prod^n_{i=1}P(x_i|c)
P(c∣x)=P(x)P(c)P(x∣c)=P(x)P(c)i=1∏nP(xi∣c)
因为P(x)不变,故贝叶斯判定准则
h
n
b
(
x
)
=
a
r
g
m
a
x
c
∈
γ
P
(
c
)
P
(
x
)
∏
i
=
1
n
P
(
x
i
∣
c
)
h_{nb}(\boldsymbol x)=\mathop{arg\ max}_{c\in \gamma}P(c){P(\boldsymbol x)}\prod^n_{i=1}P(x_i|c)
hnb(x)=arg maxc∈γP(c)P(x)i=1∏nP(xi∣c)
通过概念上的学习,我认为朴素贝叶斯分类器的思路是,
对于已有多分类的多维训练数据及其分类标签,这些多维的属性对于最终分类标签都有影响,如何面对新的数据快速得到其所属分类呢?
贝叶斯分类器要求出训练数据中,各维属性对于分类标签的条件概率,如果各属性独立,那么该数据分到某一类别的概率便是这些条件概率的乘积,其中较大值的那个便是所属类别。
朴素贝叶斯的算法过程
(1)应用极大似然估计,计算先验概率和条件概率(c为分类,共K类;N为样本总数;ajl为某一属性/维度)
P
(
y
=
c
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
)
N
,
k
=
1
,
2
,
.
.
.
,
K
P(y=c_k)=\frac {\sum \limits^N\limits_{i=1}I(y_i=c_k)} {N},\ k=1,2,...,K
P(y=ck)=Ni=1∑NI(yi=ck), k=1,2,...,K
P ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k ) , j = 1 , 2 , . . . , n ; l = 1 , 2 , . . . S j ; k = 1 , 2 , . . . , K P(X^{(j)}=a_{jl}|Y=c_k)=\frac {\sum \limits^N\limits_{i=1}I(x_i^{(j)}=a_{jl},y_i=c_k)} {\sum \limits^N\limits_{i=1}I(y_i=c_k)},j=1,2,...,n;l=1,2,...S_j;k=1, 2,...,K P(X(j)=ajl∣Y=ck)=i=1∑NI(yi=ck)i=1∑NI(xi(j)=ajl,yi=ck),j=1,2,...,n;l=1,2,...Sj;k=1,2,...,K
(2)对于给定的实例
x
=
(
x
i
(
1
)
,
x
i
(
2
)
,
.
.
.
,
x
i
(
n
)
)
T
x=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T
x=(xi(1),xi(2),...,xi(n))T
计算
P
(
Y
=
c
k
)
∏
j
=
1
n
P
(
X
(
j
)
=
x
(
j
)
∣
Y
=
c
k
)
,
k
=
1
,
2
,
.
.
.
,
K
P(Y=c_k)\prod^n_{j=1}P(X^{(j)}=x^{(j)}|Y=c_k),\ k=1, 2, ...,K
P(Y=ck)j=1∏nP(X(j)=x(j)∣Y=ck), k=1,2,...,K
(3)确定x的类别
y
=
a
r
g
m
a
x
c
k
P
(
Y
=
c
k
)
∏
j
=
1
n
P
(
X
(
j
)
=
x
(
j
)
∣
Y
=
c
k
)
y=\mathop{arg\ max}_{c_k}P(Y=c_k)\prod^n_{j=1}P(X^{(j)}=x^{(j)}|Y=c_k)
y=arg maxckP(Y=ck)j=1∏nP(X(j)=x(j)∣Y=ck)
平滑处理:
训练集中有可能一些属性未被使用,则计算出来概率为0,决策会产生较大偏差
为了解决这个问题,需要进行平滑处理:分子+1,分母+N(训练集D中的类别数label)/ Ni(第i个属性可能的取值数(考虑的维度数))
在算法中,使用参数拉普拉斯修正值
P
^
(
c
)
=
∣
D
c
∣
+
1
∣
D
∣
+
N
\widehat P(c) = \frac {|D_c|+1} {|D|+N}
P
(c)=∣D∣+N∣Dc∣+1
P ^ ( x i ∣ c ) = ∣ D c , x i ∣ + 1 ∣ D ∣ + N i \widehat P(x_i|c) = \frac {|D_{c,x_i}|+1} {|D|+N_i} P (xi∣c)=∣D∣+Ni∣Dc,xi∣+1
代码练习(文本情感分析)
import pandas as pd
import numpy as np
import jieba
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
data = pd.read_csv('data.csv', encoding='gbk') # 需要进行字符编码才能正确显示中文,否则会报错
print(data.head())
data.loc[data.loc[:, 'evaluate'] == "好评", "评论标号"] = 1 # 增加“评论标号”列,‘evaluate’=‘好评’,该列为数字1
data.loc[data.loc[:, 'evaluate'] == "差评", "评论标号"] = 0
content = data.loc[:, 'content']
print(data.head())
# 选择停用词
stopwords = []
with open('ChineseStopWords.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print(lines)
for tmp in lines:
line = tmp.strip()
# print(line)
stopwords.append(line)
stopwords = list(set(stopwords)) # 去重
# 内容处理,转化为标准格式
commet_list = []
for tmp in content:
print(tmp)
# 将完整的话切割为词
seg_list = jieba.cut(tmp, cut_all=False) # 不允许切割所有
# print(seg_list)
seg_str = ','.join(seg_list) # 分割词汇
print(seg_str)
commet_list.append(seg_str)
# 统计词的个数
con = CountVectorizer(stop_words=stopwords)
X = con.fit_transform(commet_list) # 转化为矩阵
con.get_feature_names_out()
# 准备训练集和测试集
X_train = X.toarray()[:10, :] # 前10个为训练集
y_train = data.loc[:, 'evaluate'][: 10]
print(X_train, y_train)
X_test = X.toarray()[10:, :]
y_test = data['evaluate'][10:]
# 模型训练
mb = MultinomialNB(alpha=1) # 拉普拉斯平滑系数为1
mb.fit(X_train, y_train)
y_predict = mb.predict(X_test)
print('预测值:', y_predict)
print('真实值:', y_test)
# 模型评估
score = mb.score(X_test, y_test)
print(score)