暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

算法-3 分类:高斯、多项式、伯努利朴素贝叶斯

Rhonin晴朗台风天 2021-10-11
2956

 分类算法的核心就是在于经验不断积累,不断迭代自己的规则,从而得到最好的答案。





01


贝叶斯推理、贝叶斯分类器、朴素贝叶斯


我们之前在统计-9 一切概率皆条件概率一文中,谈过贝叶斯推理、公式及逆概率问题,有兴趣的同学可以回去查看。
三者区别:已知现象求原因没法研究因果,只能给因果的研究提供线索理就是解决这类概率问题的。在这个理论基础从而设计出贝叶斯分类器朴素贝叶斯分类是贝叶斯分类器中的一种,也是最简单,最常用的分类器也就是说朴素贝叶斯分类器是一个以贝叶斯为基础的多分类的分类器。
朴素贝叶斯白话版:【对于给出的未知物体想要进行分类,就需要求解在这个未知物体出现的条件下各个类别出现的概率,哪个最大,就认为这个未知物体属于哪个分类。】所以朴素贝叶斯模型由两种类型的概率组成,每个类别的概率和每个属性的条件概率。一句话版:【给出训练数据及分类,从而计算出类别概率和条件概率后,即可预测新数据  。】  
为啥叫朴素,是因为它假设每个输入变量是独立的。当然在我们这个现实世界,这是不切实际的,不过好在对大部分复杂问题同样有效。


02



工作流程


朴素贝叶斯常用于文本分类,特别英文,实际应用在垃圾文本过滤、情感预测、推荐系统等,主要是自然语言处理 NLP。

  • 准备阶段:人工确定特征属性,分类器质量很大程度上由特征属性、特征属性划分及训练样本质量决定。

  • 训练阶段:生成分类器,输入是特征属性和训练样本,输出是分类器。计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率

  • 应用阶段:输入是分类器和新数据,输出是新数据的分类结果。




03



Python sklearn 文档分类步骤


由于近期主要以理解算法原理为先,暂无过多实操所以并没有深入进行代码练习,只是浅尝辄止。

1、库调用

朴素贝叶斯分类算法分为:

  • 高斯朴素贝叶斯(GaussianNB):连续特征变量,符合高斯分布(比如说人的身高,物体的长度这种自然界的现象)

    from sklearn.naive_bayes import GaussianNB
    • 多项式朴素贝叶斯(MultinomialNB):离散特征变量,符合多项分布,以单词为粒度计算在某个文件中的具体次数或单词的TF-IDF 值等。

      from sklearn.naive_bayes import MultinomialNB
      • 伯努利朴素贝叶斯(BernoulliNB):布尔特征变量,符合 0/1 分布,以文件为粒度单词在某文件中出现为 1,否为 0

        from sklearn.naive_bayes import BernoulliNB

        后两种主要用于文档分类。


        2、TF-IDF 解析

        TF-IDF=TF*IDF(乘积):评估某个词语对于一个文件集或文档库中的其中一份文件的重要程度

          from sklearn.feature_extraction.text import TfidVectorizer

          词频 TF 计算了一个单词在文档中出现的次数

          逆向文档频率 IDF,是指一个单词在文档中的区分度。它认为一个单词出现在的文档数越少,就越能通过这个单词把该文档和其他文档区分开。IDF 越大就代表该单词的区分度越大。

          3、对文档分词

          英文NTLK 

            import nltk
            word_list = nltk.word_tokenize(text) #分词
            nltk.pos_tag(word_list) #标注单词的词性

            中文jieba(之前学过,请回顾:Python 38 之六 PyInstaller库和jieba库

              import jieba
              word_list = jieba.cut (text) #中文分词

              4、加载停用词

              从网上可以找到中文常用的停用词保存在 stop_words.txt,然后利用 Python 的文件读取函数读取文件,保存在 stop_words 数组中

                stop_words = [line.strip().decode('utf-8') for line in io.open('stop_words.txt').readlines()]


                5、计算单词权重

                创建 TfidfVectorizer→fit_transform拟合→TF*IDF空间 features

                  tf = TfidfVectorizer(stop_words=stop_words, token_pattern=token_pattern,max_df=0.5)
                  features = tf.fit_transform(train_contents)


                  6、生成分类器

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

                    其中alpha为平滑参数,如果一个单词在训练样本中没有出现,这个单词的概率就会被计算为 0。但训练集样本只是整体的抽样情况,我们不能因为一个事件没有观察到,就认为整个事件的概率为 0。为了解决这个问题,我们需要做平滑处理。

                     alpha=1 时,使用的是 Laplace 平滑。Laplace 平滑就是采用加 1 的方式

                    当 0<alpha<1 时,使用的是 Lidstone 平滑,可以设置 alpha 为 0.001。

                    这里留个疑问,什么时候用Laplace 平滑,什么时候用 Lidstone 平滑


                    7、分类器做预测

                    获取测试集特征矩阵 test_features

                      test_tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5, vocabulary=train_vocabulary)
                      test_features=test_tf.fit_transform(test_contents)

                      对新数据预测

                        predicted_labels=clf.predict(test_features)

                        8、计算准确率

                          from sklearn import metrics
                          print metrics.accuracy_score(test_labels, predicted_labels)

                                                                                                ——以上参考数据分析实战-陈旸


                          文章转载自Rhonin晴朗台风天,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论