2023.10.12学习-贝叶斯分类器

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(yx)P(x)=P(xy)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(yx)=P(x)p(xy)P(y)=ip(xyi)p(yi)p(xy)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(yix)
风险(犯错的概率),即结果取另一类别的概率
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(errx)={P(y2x)    if决策为y1P(y1x)    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(errx)=min[P(y1x),P(y2x)]

损失 λ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(yix)=j=1nλijP(yjx)
0-1条件风险
R ( y i ∣ x ) = 1 − P ( y i ∣ x ) R(y_i|\boldsymbol x)=1-P(y_i|\boldsymbol x) R(yix)=1P(yix)
贝叶斯最优分类
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 maxyYP(yx)

朴素贝叶斯分类器

条件:属性条件独立性假设。即各个维度之间的概率是相互独立的、无关的

这也是“朴素”的由来

因为属性条件独立性假设,所以(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(cx)=P(x)P(c)P(xc)=P(x)P(c)i=1nP(xic)
因为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=1nP(xic)

通过概念上的学习,我认为朴素贝叶斯分类器的思路是,

对于已有多分类多维训练数据及其分类标签,这些多维的属性对于最终分类标签都有影响,如何面对新的数据快速得到其所属分类呢?

贝叶斯分类器要求出训练数据中,各维属性对于分类标签的条件概率,如果各属性独立,那么该数据分到某一类别的概率便是这些条件概率的乘积,其中较大值的那个便是所属类别。

朴素贝叶斯的算法过程

(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=1NI(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)=ajlY=ck)=i=1NI(yi=ck)i=1NI(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=1nP(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=1nP(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+NDc+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 (xic)=D+NiDc,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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值