NLP修炼之旅(Day5)

朴素贝叶斯算法解析
本文深入探讨了朴素贝叶斯算法的原理,包括其基于条件概率的计算方式,以及如何应用于分类问题。文章详细解释了算法流程,从先验概率的计算到条件概率的求解,再到实例分类的实现过程。同时,文中还提到了算法的优点和缺点,以及在Python中使用sklearn库进行朴素贝叶斯分类的实际案例。

朴素贝叶斯的原理

  1. 利用“反向概率”的原理,贝叶斯建立了贝叶斯原理:在我们不了解所有的客观事实的情况下,同样可以估计一个值,然后根据实际效果不断进行修正
  2. 贝叶斯原理是基于条件概率,通过P(A|B)来求P(B|A):P(B∣A)=P(B)P(A∣B)P(A)P(B | A)=\frac{P(B) P(A | B)}{P(A)}P(BA)=P(A)P(B)P(AB)其中,分母P(A),可以根据全概率公式分解为:P(A)=∑i=1nP(Bi)P(A∣Bi)P(A)=\sum_{i=1}^{n} P\left(B_{i}\right) P\left(A | B_{i}\right)P(A)=i=1nP(Bi)P(ABi)
  3. 朴素贝叶斯是一种简单但是及其强大的预测建模算法,之所以称为朴素贝叶斯,就是因为他假设每个输入变量是独立的,这是个强硬的假设,实际情况并不一样,但是这项技术对于绝大多数的复杂问题仍然有效,若输入变量是相关的,则会出现问题

朴素贝叶斯的应用场景

假设训练集有m个样本n个维度,如下:(x1(1),x2(1),…xn(1),y1),(x1(2),x2(2),…xn(2),y2),(x1(m),x2(m),…xn(m),ym)\left(x_{1}^{(1)}, x_{2}^{(1)}, \ldots x_{n}^{(1)}, y_{1}\right),\left(x_{1}^{(2)}, x_{2}^{(2)}, \ldots x_{n}^{(2)}, y_{2}\right),\left(x_{1}^{(m)}, x_{2}^{(m)}, \ldots x_{n}^{(m)}, y_{m}\right)(x1(1),x2(1),xn(1),y1),(x1(2),x2(2),xn(2),y2),(x1(m),x2(m),xn(m),ym)共有K个特征输出类别,分别为C1,C2,…,CKC_{1}, C_{2}, \dots, C_{K}C1,C2,,CK,每个特征输出类别的样本个数为m1,m2,…,mKm_{1}, m_{2}, \ldots, m_{K}m1,m2,,mK,在第k个类别中,若是离散特征,则特征XjX_{j}Xj各个类别取值为mjlm_{j l}mjl,其中l取值为1,2,…Sj,Sj1,2, \ldots S_{j}, S_{j}1,2,Sj,Sj为特征j不同的取值数,输出为实例X(test)X^{(t e s t)}X(test)的分类

算法流程如下:

  1. 若没有Y的先验概率,则计算Y的K个先验概率:P(Y=Ck)=(mk+λ)/(m+Kλ)P\left(Y=C_{k}\right)=\left(m_{k}+\lambda\right) /(m+K \lambda)P(Y=Ck)=(mk+λ)/(m+Kλ)否则P(Y=Ck)P\left(Y=C_{k}\right)P(Y=Ck)为输入的先验概率
  2. 分别计算第k个类别的第J维特征的第l个取值条件概率:P(Xj=xjl∣Y=Ck)P\left(X_{j}=x_{j l} | Y=C_{k}\right)P(Xj=xjlY=Ck)
  • 若是离散值:P(Xj=xjl∣Y=Ck)=mkjl+λmk+SjλP\left(X_{j}=x_{j l} | Y=C_{k}\right)=\frac{m_{k j l}+\lambda}{m_{k}+S_{j} \lambda}P(Xj=xjlY=Ck)=mk+Sjλmkjl+λ
  • 若是稀疏二项离散值:P(Xj=xjl∣Y=Ck)=P(j∣Y=Ck)xjl+(1−P(j∣Y=Ck)(1−xjl)P\left(X_{j}=x_{j l} | Y=C_{k}\right)=P\left(j | Y=C_{k}\right) x_{j l}+\left(1-P\left(j | Y=C_{k}\right)\left(1-x_{j l}\right)\right.P(Xj=xjlY=Ck)=P(jY=Ck)xjl+(1P(jY=Ck)(1xjl)
  • 若是连续值不需要计算各个l的取值概率,直接求正态分布的参数:P(Xj=xj∣Y=Ck)=12πσk2exp⁡(−(xj−μk)22σk2)P\left(X_{j}=x_{j} | Y=C_{k}\right)=\frac{1}{\sqrt{2 \pi \sigma_{k}^{2}}} \exp \left(-\frac{\left(x_{j}-\mu_{k}\right)^{2}}{2 \sigma_{k}^{2}}\right)P(Xj=xjY=Ck)=2πσk21exp(2σk2(xjμk)2)
  1. 对于实例X(test)X^{(t e s t)}X(test),分别计算:P(Y=Ck)∏j=1nP(Xj=xj(t+est)∣Y=Ck)P\left(Y=C_{k}\right) \prod_{j=1}^{n} P\left(X_{j}=x_{j}^{(t+e s t)} | Y=C_{k}\right)P(Y=Ck)j=1nP(Xj=xj(t+est)Y=Ck)
  2. 确定实例X(test)X^{(t e s t)}X(test)的分类CresultC_{\text {result}}Cresult:Cresult=argmax⁡Ck⎵P(Y=Ck)∏j=1nP(Xj=Xj(test)∣Y=Ck)C_{\text {result}}=\underbrace{\operatorname{argmax}_{C_{k}}} P\left(Y=C_{k}\right) \prod_{j=1}^{n} P\left(X_{j}=X_{j}^{(t e s t)} | Y=C_{k}\right)Cresult=argmaxCkP(Y=Ck)j=1nP(Xj=Xj(test)Y=Ck)

朴素贝叶斯的的优缺点

  • 优点:
  1. 算法逻辑简单,而且易于实现
  2. 分类过程时空开销小
  • 缺点:
    还是之前说的,假设的条件太严苛,实际情况往往很难符合,在属性个数较多或者属性相关性较大时,分类效果不好

朴素贝叶斯sklearn参数学习

# 多项式贝叶斯分类器
from sklearn.naive_bayes import MultinomialNB  
clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)

利用朴素贝叶斯模型结合TF-IDF算法进行文本分类

from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
import jieba


def get_stop_words():
    with open("../data/stopwords/中文停用词表.txt", encoding="utf-8") as file:
        stopwords_lines = file.readlines()
    stopwords = [line.strip() for line in stopwords_lines]
    return stopwords


def get_data():
    with open("../data/cnews/cnews.train.txt", encoding='utf-8') as data:
        lines = data.readlines()
    train_data = {" ".join(jieba.cut(line[2:].strip())): line[0:2] for line in lines}  # 将训练集分词,并与其label数据存入字典
    train_x = train_data.keys()
    train_y = train_data.values()
    return train_x, train_y


def main():
    x, y = get_data()
    train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.5)
    stopwords = get_stop_words()

    train_tf = TfidfVectorizer(stop_words=stopwords, max_df=0.5)
    train_x = train_tf.fit_transform(train_x)

    clf = MultinomialNB(alpha=0.001)
    clf.fit(train_x, train_y)

    test_tf = TfidfVectorizer(stop_words=stopwords, max_df=0.5, vocabulary=train_tf.vocabulary_)
    test_x = test_tf.fit_transform(test_x)

    predicted_y = clf.predict(test_x)
    score = accuracy_score(test_y, predicted_y)
    print(score)


if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值