数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17221 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

21丨朴素贝叶斯分类(下):如何对文档进行分类?

陈旸 2019-01-30
我们上一节讲了朴素贝叶斯的工作原理,今天我们来讲下这些原理是如何指导实际业务的。
朴素贝叶斯分类最适合的场景就是文本分类、情感分析和垃圾邮件识别。其中情感分析和垃圾邮件识别都是通过文本来进行判断。从这里你能看出来,这三个场景本质上都是文本分类,这也是朴素贝叶斯最擅长的地方。所以朴素贝叶斯也常用于自然语言处理 NLP 的工具。
今天我带你一起使用朴素贝叶斯做下文档分类的项目,最重要的工具就是 sklearn 这个机器学习神器。

sklearn 机器学习包

sklearn 的全称叫 Scikit-learn,它给我们提供了 3 个朴素贝叶斯分类算法,分别是高斯朴素贝叶斯(GaussianNB)、多项式朴素贝叶斯(MultinomialNB)和伯努利朴素贝叶斯(BernoulliNB)。
这三种算法适合应用在不同的场景下,我们应该根据特征变量的不同选择不同的算法:
高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度。
多项式朴素贝叶斯:特征变量是离散变量,符合多项分布,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的 TF-IDF 值等。
伯努利朴素贝叶斯:特征变量是布尔变量,符合 0/1 分布,在文档分类中特征是单词是否出现。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(41)

  • szm 置顶
    需要完整代码,不然看不明白!

    编辑回复: 完整代码已上传到 https://github.com/cystanford/text_classification
    你也可以参考下专栏评论中其他人写的代码

    2019-01-30
    1
    30
  • 北方 置顶
    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    # __author__ = '北方姆Q'
    # __datetime__ = 2019/2/14 14:04

    import os
    import jieba
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.naive_bayes import MultinomialNB
    from sklearn import metrics

    LABEL_MAP = {'体育': 0, '女性': 1, '文学': 2, '校园': 3}
    # 加载停用词
    with open('./text classification/stop/stopword.txt', 'rb') as f:
        STOP_WORDS = [line.strip() for line in f.readlines()]


    def load_data(base_path):
        """
        :param base_path: 基础路径
        :return: 分词列表,标签列表
        """
        documents = []
        labels = []

        for root, dirs, files in os.walk(base_path): # 循环所有文件并进行分词打标
            for file in files:
                label = root.split('\\')[-1] # 因为windows上路径符号自动转成\了,所以要转义下
                labels.append(label)
                filename = os.path.join(root, file)
                with open(filename, 'rb') as f: # 因为字符集问题因此直接用二进制方式读取
                    content = f.read()
                    word_list = list(jieba.cut(content))
                    words = [wl for wl in word_list]
                    documents.append(' '.join(words))
        return documents, labels


    def train_fun(td, tl, testd, testl):
        """
        构造模型并计算测试集准确率,字数限制变量名简写
        :param td: 训练集数据
        :param tl: 训练集标签
        :param testd: 测试集数据
        :param testl: 测试集标签
        :return: 测试集准确率
        """
        # 计算矩阵
        tt = TfidfVectorizer(stop_words=STOP_WORDS, max_df=0.5)
        tf = tt.fit_transform(td)
        # 训练模型
        clf = MultinomialNB(alpha=0.001).fit(tf, tl)
        # 模型预测
        test_tf = TfidfVectorizer(stop_words=STOP_WORDS, max_df=0.5, vocabulary=tt.vocabulary_)
        test_features = test_tf.fit_transform(testd)
        predicted_labels = clf.predict(test_features)
        # 获取结果
        x = metrics.accuracy_score(testl, predicted_labels)
        return x


    # text classification与代码同目录下
    train_documents, train_labels = load_data('./text classification/train')
    test_documents, test_labels = load_data('./text classification/test')
    x = train_fun(train_documents, train_labels, test_documents, test_labels)
    print(x)

    编辑回复: 正确,大家可以看下这份代码
    通过load_data加载数据,得到documents, labels
    通过train_fun进行训练和预测,得到测试集的准确率。

    2019-02-14
    22
  • Python 置顶
    老师,能不能在答疑的时候给这道题的完整代码看看

    编辑回复: 已上传到 https://github.com/cystanford/text_classification
    也有同学自己写出来了,你可以都运行一下。

    2019-01-30
    15
  • 姜戈
    看过很多朴素贝叶斯原理和分类的讲解文章,很少能像前辈这样既有理论,又有实战的讲解,让大家既了解了理论知识,又有相应实际的操作经验可学,真的好棒,这个专栏,必须多多点赞,为老师加油!!!
    2019-01-30
    11
  • 听妈妈的话
    # 由于评论不支持markdown,代码放在https://pastebin.com/kqjXgy0c

    train_contents=[]
    train_labels=[]
    test_contents=[]
    test_labels=[]
    # 导入文件
    import os
    import io
    start=os.listdir(r'text classification/train')
    for item in start:
        test_path='text classification/test/'+item+'/'
        train_path='text classification/train/'+item+'/'
        for file in os.listdir(test_path):
            with open(test_path+file,encoding="GBK") as f:
                test_contents.append(f.readline())
                #print(test_contents)
                test_labels.append(item)
        for file in os.listdir(train_path):
            with open(train_path+file,encoding='gb18030', errors='ignore') as f:
                train_contents.append(f.readline())
                train_labels.append(item)
    print(len(train_contents),len(test_contents))

    # 导入stop word
    import jieba
    from sklearn import metrics
    from sklearn.naive_bayes import MultinomialNB
    stop_words = [line.strip() for line in io.open('text classification/stop/stopword.txt').readlines()]

    # 分词方式使用jieba,计算单词的权重
    tf = TfidfVectorizer(tokenizer=jieba.cut,stop_words=stop_words, max_df=0.5)
    train_features = tf.fit_transform(train_contents)
    print(train_features.shape)

    模块 4:生成朴素贝叶斯分类器
    # 多项式贝叶斯分类器
    clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)

    模块 5:使用生成的分类器做预测
    test_tf = TfidfVectorizer(tokenizer=jieba.cut,stop_words=stop_words, max_df=0.5, vocabulary=tf.vocabulary_)
    test_features=test_tf.fit_transform(test_contents)

    print(test_features.shape)
    predicted_labels=clf.predict(test_features)
    print(metrics.accuracy_score(test_labels, predicted_labels))

    # 最终结果0.925
    2019-03-21
    5
  • 池边的树
    https://github.com/yourSprite/AnalysisExcercise/tree/master/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB
    2019-02-12
    4
  • 上官
    print('不重复的词:', tfidf_vec.get_feature_names())
    运行结果: 不重复的词: ['and', 'bayes', 'document', 'is', 'one', 'second', 'the', 'third', 'this']
    这明明就是打印所有词啊,有重复的啊
    2019-01-31
    2
    3
  • Jack
    #!/usr/bin/env python
    # coding: utf-8

    import os
    import jieba
    import pandas as pd
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.naive_bayes import MultinomialNB
    # 1. 加载数据
    # 加载停用词表
    l_stopWords = set()
    with open('./text_classification/text_classification/stop/stopword.txt', 'r') as l_f:
        for l_line in l_f:
            l_stopWords.add(l_line.strip())

    l_labelMap = {'体育': 0, '女性': 1, '文学': 2, '校园': 3}
    # 加载训练数据和测试数据
    def LoadData(filepath):
        l_documents = []
        l_labels = []
        for root, dirs, files in os.walk(filepath):
            for l_file in files:
                l_label = root.split('/')[-1]
                l_filename = os.path.join(root, l_file)
                
                with open(l_filename, 'r') as l_f:
                    l_content = l_f.read()
                    l_wordlist = list(jieba.cut(l_content))
                    l_words = [item for item in l_wordlist if item not in l_stopWords]
                    l_documents.append(' '.join(l_words))
                    l_labels.append(l_labelMap[l_label])
                    
        return l_documents, l_labels

    l_trainDocuments, l_trainLabels = LoadData('./text_classification/text_classification/train')
    l_testDocuments, l_testLabels = LoadData('./text_classification/text_classification/test')

    # # 2. 计算权重矩阵
    l_tfidfVec = TfidfVectorizer(max_df=0.5)
    l_tfidfMatrix = l_tfidfVec.fit_transform(l_trainDocuments)

    # for item in l_tfidfVec.get_feature_names():
    # print item
    # print l_tfidfVec.get_feature_names()
    # print l_tfidfVec.vocabulary_
    print l_tfidfMatrix.toarray().shape

    # # 3. 朴素贝叶斯模型
    # ## 3.1 模型训练
    l_clf = MultinomialNB(alpha=0.001)
    l_clf.fit(l_tfidfMatrix, l_trainLabels)

    # ## 3.2 模型预测
    l_testTfidf = TfidfVectorizer(max_df=0.5, vocabulary=l_tfidfVec.vocabulary_)
    l_testFeature = l_testTfidf.fit_transform(l_testDocuments)
    l_hats = l_clf.predict(l_testFeature)

    # ## 3.3 模型评估
    from sklearn.metrics import accuracy_score
    print accuracy_score(l_hats, l_testLabels)
    2019-02-14
    2
  • 几何
    老师,弱弱的说一句,代码感觉能看明白,但是不明白的是模型是如何使用的, 比如上一节和本节,都是只知道了准确率,但是对于有新的要处理的数据,如何做,怎么做好总是感觉差一点点东西。

    作者回复: 我们做的大部分工作都是数据预处理,使用模型到是不复杂,这些分类模型使用的方式都差不多。
    你可以多做练习,先针对一个数据集,采用不同的分类算法看下准确率。这样就会理解,当数据确定的情况下,如何使用不同的分类算法。
    然后再针对不同的数据集,进行数据预处理:数据加载,数据探索,数据规范化等。数据预处理的技巧比较多,需要遇到不同的数据集,多做练习

    2019-09-08
    1
  • 最后面的代码太乱,很多都不知道从哪里来的,无法顺着看下去~~~
    2019-04-17
    1
    1
  • 王彬成
    # -*- coding:utf8 -*-
    # 系统:mac

    # 1. 加载数据
    # 加载停用词表

    l_stopWords = [line.strip() for line in open('./text_classification-master/text classification/stop/stopword.txt', 'r', encoding='utf-8').readlines()]
       
    l_labelMap = {'体育': 0, '女性': 1, '文学': 2, '校园': 3}
    # 加载训练数据和测试数据
    def LoadData(filepath):
        l_documents = []
        l_labels = []
        
        for root, dirs, files in os.walk(filepath):
            for l_file in files:
                if l_file=='.DS_Store':
                    continue
                l_label = root.split('/')[-1]
                l_filename = os.path.join(root, l_file)
                
                with open(l_filename, 'r',encoding='gbk') as l_f:
                    try:
                        l_content = l_f.read()
                    except Exception as err:
                        print(err)
                        print(l_filename)
                        continue
                    generator = jieba.cut(l_content)
                    words = ' '.join(generator)
                    l_wordlist=words.split(' ')
                    l_words = [item for item in l_wordlist if item not in l_stopWords]
                    l_documents.append(' '.join(l_words))
                    l_labels.append(l_labelMap[l_label])
                    
        return l_documents, l_labels

    l_trainDocuments, l_trainLabels = LoadData('./text_classification-master/text classification/train')
    l_testDocuments, l_testLabels = LoadData('./text_classification-master/text classification/test')

    # # 2. 计算权重矩阵
    l_tfidfVec = TfidfVectorizer(max_df=0.5)
    l_tfidfMatrix = l_tfidfVec.fit_transform(l_trainDocuments)

    print (l_tfidfMatrix.toarray().shape)

    # # 3. 朴素贝叶斯模型
    # ## 3.1 模型训练
    l_clf = MultinomialNB(alpha=0.001)
    l_clf.fit(l_tfidfMatrix, l_trainLabels)

    # ## 3.2 模型预测
    l_testTfidf = TfidfVectorizer(max_df=0.5, vocabulary=l_tfidfVec.vocabulary_)
    l_testFeature = l_testTfidf.fit_transform(l_testDocuments)
    l_hats = l_clf.predict(l_testFeature)

    # ## 3.3 模型评估
    from sklearn.metrics import accuracy_score
    print (accuracy_score(l_hats, l_testLabels))
    2019-04-05
    1
  • 叮当猫
    #-coding=utf-8
    import os
    import pandas as pd
    import jieba
    from sklearn import metrics
    from sklearn.naive_bayes import MultinomialNB
    from sklearn.feature_extraction.text import TfidfVectorizer

    def load_data(path):
        l_labels = []
        l_documents = []
        #os.walk返回三元组(root, dirs, files)
        #root指的是当前正在遍历的这个文件夹本身的地址
        #dirs是一个list,内容是该文件夹中所有的目录的名字
        #files是一个list,内容是该文件夹中所有的文件,不包含子目录
        for root, dirs, files in os.walk(path):
            print root, dirs, files
            for l_file in files:
                l_label = root.split('/')[-1]
                l_filepath = os.path.join(root, l_file)
                with open(l_filepath, 'r') as l_f:
                    l_content = l_f.read()
                    l_words = ' '.join(list(jieba.cut(l_content)) )
                    l_labels.append(l_label)
                    l_documents.append(l_words)
        return l_documents, l_labels

    #第一步:对文档进行分词
    train_documents, train_labels = load_data('./text classification/train/')
    test_documents, test_labels = load_data('./text classification/test/')

    #第二步:加载停用词
    STOP_WORDS = [line.strip() for line in open('./text classification/stop/stopword.txt' ,'r').readlines()]

    #第三步:计算单词的权重
    tf = TfidfVectorizer(stop_words=STOP_WORDS, max_df=0.5)
    train_features = tf.fit_transform(train_documents)

    #第四步:生成朴素贝叶斯分类器
    clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)

    #第五步:使用生成的分类器做预测
    test_tf = TfidfVectorizer(stop_words=STOP_WORDS, max_df=0.5, vocabulary=tf.vocabulary_)
    test_features = test_tf.fit_transform(test_documents)

    predict_labels = clf.predict(test_features)

    #第六步:计算准确率
    print metrics.accuracy_score(test_labels, predict_labels)
    2019-03-16
    1
  • 滨滨
    适合用高斯朴素贝叶斯。因为身高、体重、鞋码是连续变量。
    停用词的作用是去除无关词,减少重复计算。
    2019-03-02
    1
  • wzhan366
    建议 大家先做英文版本,因为中文的unicode encode和decode不是很好弄,不利于中间步骤的可视化。如果对代码有疑惑,可以试试这个pipeline, sklearn 的。 不过,这个没有用NTLK。
    2019-02-06
    1
  • 王小王
    能不能讲解下本堂课的练习题?
    2019-02-02
    1
  • Rickie
    老师,token_pattern里的正则中(?u)是什么意思呀?
    2019-01-30
    1
  • Answer Liu
    思考题,应该是用高斯朴素贝叶斯,停用词对任何分类都没有参考价值,所有应该去除。
    2019-11-21
  • Ronnyz
    练习题:
    acc_score : 0.755 比老师的代码运行的结果差了许多,不知道是什么原因呢
    思考题:
    身高、体重 :这是连续型变量,适合高斯贝叶斯
    鞋码、外貌 :这个一般用离散取值,适合多项式贝叶斯
    2019-11-12
  • HHH
    贝叶斯分类从举的例子来看应该是监督学习的,有在非监督学习下应用的场景么?
    2019-10-27
  • 羊小看
    用朴素贝叶斯做文本分类时,是把各文档中各单词的Tfidf值作为特征值的,然后测试样本以同样的单词顺序来生成特征值,再计算概率。
    2019-10-24
收起评论
41
返回
顶部