NLP修炼之旅(Day5)

朴素贝叶斯的原理

  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 = 1 n P ( B i ) P ( A ∣ B i ) 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个维度,如下: ( x 1 ( 1 ) , x 2 ( 1 ) , … x n ( 1 ) , y 1 ) , ( x 1 ( 2 ) , x 2 ( 2 ) , … x n ( 2 ) , y 2 ) , ( x 1 ( m ) , x 2 ( m ) , … x n ( m ) , y m ) \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个特征输出类别,分别为 C 1 , C 2 , … , C K C_{1}, C_{2}, \dots, C_{K} C1,C2,,CK,每个特征输出类别的样本个数为 m 1 , m 2 , … , m K m_{1}, m_{2}, \ldots, m_{K} m1,m2,,mK,在第k个类别中,若是离散特征,则特征 X j X_{j} Xj各个类别取值为 m j l m_{j l} mjl,其中l取值为 1 , 2 , … S j , S j 1,2, \ldots S_{j}, S_{j} 1,2,Sj,Sj为特征j不同的取值数,输出为实例 X ( t e s t ) X^{(t e s t)} X(test)的分类

算法流程如下:

  1. 若没有Y的先验概率,则计算Y的K个先验概率: P ( Y = C k ) = ( m k + λ ) / ( m + K λ ) P\left(Y=C_{k}\right)=\left(m_{k}+\lambda\right) /(m+K \lambda) P(Y=Ck)=(mk+λ)/(m+Kλ)否则 P ( Y = C k ) P\left(Y=C_{k}\right) P(Y=Ck)为输入的先验概率
  2. 分别计算第k个类别的第J维特征的第l个取值条件概率: P ( X j = x j l ∣ Y = C k ) P\left(X_{j}=x_{j l} | Y=C_{k}\right) P(Xj=xjlY=Ck)
  • 若是离散值: P ( X j = x j l ∣ Y = C k ) = m k j l + λ m k + S j λ 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 ( X j = x j l ∣ Y = C k ) = P ( j ∣ Y = C k ) x j l + ( 1 − P ( j ∣ Y = C k ) ( 1 − x j l ) 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 ( X j = x j ∣ Y = C k ) = 1 2 π σ k 2 exp ⁡ ( − ( x j − μ k ) 2 2 σ k 2 ) 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πσk2 1exp(2σk2(xjμk)2)
  1. 对于实例 X ( t e s t ) X^{(t e s t)} X(test),分别计算: P ( Y = C k ) ∏ j = 1 n P ( X j = x j ( t + e s t ) ∣ Y = 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) P(Y=Ck)j=1nP(Xj=xj(t+est)Y=Ck)
  2. 确定实例 X ( t e s t ) X^{(t e s t)} X(test)的分类 C result C_{\text {result}} Cresult: C result = argmax ⁡ C k ⎵ P ( Y = C k ) ∏ j = 1 n P ( X j = X j ( t e s t ) ∣ Y = C k ) 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()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值