python实现随机森林、逻辑回归和朴素贝叶斯的新闻文本分类

实现本文的文本数据可以在THUCTC下载也可以自己手动爬虫生成,

本文主要参考:https://blog.csdn.net/hao5335156/article/details/82716923

nb表示朴素贝叶斯

rf表示随机森林

lg表示逻辑回归

初学者(我)通过本程序的学习可以巩固python基础,学会python文本的处理,和分类器的调用。方便接下来的机器学习的学习。

各个参数直观的含义:

# -*- coding: utf-8 -*-
"""
Created on Thu Nov 29 13:00:46 2018

@author: caoqu
"""
import matplotlib.pyplot as plt
import random
import os
import jieba

from sklearn.naive_bayes import MultinomialNB as NB
from sklearn.linear_model.logistic import LogisticRegression as LR
from sklearn.ensemble import RandomForestClassifier as RF 

# 文本处理 --> 生成训练集 测试集 词频集
def text_processor(text_path, test_size=0.2):
    folder_list = os.listdir(text_path)
    data_list=[]        # 每个元素均为一篇文章
    class_list=[]       # 对应于每篇文章的类别
    # 一个循环读取一个类别的文件夹
    for folder in folder_list:
        new_folder_path = os.path.join(text_path, folder)     # 类别列表
        # 由于THUCTC文本巨多,所以我从每个类别的文本列表中随机抽取200个文本用于训练和测试,可以自行修改
        files = random.sample(os.listdir(new_folder_path), 200)
        # 一个循环读取一篇文章
        for file in files:
            with open(os.path.join(new_folder_path, file), ‘r‘, encoding=‘UTF-8‘) as fp:
                raw = fp.read()
            word_cut = jieba.cut(raw, cut_all=False)    #精确模式切分文章
            word_list = list(word_cut)      # 一篇文章一个 word_list
            data_list.append(word_list)
            class_list.append(folder.encode(‘utf-8‘))
    # 划分训练集和测试集
    # data_class_list[[word_list_one[], 体育], [word_list_two[], 财经], ..., [...]]
    data_class_list = list(zip(data_list, class_list))
    random.shuffle(data_class_list)     # 打乱顺序
    index = int(len(data_class_list) * test_size) + 1   # 训测比为 8:2

    train_list = data_class_list[index:]
    test_list = data_class_list[:index]

    train_data_list, train_class_list = zip(*train_list)    # (word_list_one[],...), (体育,...)
    test_data_list, test_class_list = zip(*test_list)

    # 统计词频 all_words_dict{"key_word_one":100, "key_word_two":200, ...}
    all_words_dict = {}
    for word_list in train_data_list:
        for word in word_list:
            if all_words_dict.get(word) != None:
                all_words_dict[word] += 1
            else:
                all_words_dict[word] = 1

    all_words_tuple_list = sorted(all_words_dict.items(), key=lambda f: f[1], reverse=True)     # 按值降序排序
    all_words_list = list(list(zip(*all_words_tuple_list))[0])      # all_words_list[word_one, word_two, ...]  

    return all_words_list, train_data_list, test_data_list, train_class_list, test_class_list

# 选取特征词
def words_dict(all_words_list, deleteN, stopwords_set=set()):
    feature_words = []
    n = 1
    for t in range(deleteN, len(all_words_list), 1):
        if n > 1000:    # 维度最大1000
            break
        # 非数字 非停用词 长度 1-4 之间
        if not all_words_list[t].isdigit() and all_words_list[t] not in stopwords_set and 1 < len(all_words_list[t]) < 5:
            feature_words.append(all_words_list[t])
            n += 1
    return feature_words

# 文本特征
def text_features(train_data_list, test_data_list, feature_words):
    def text_feature_(text, feature_words):
        text_words = set(text)
        features = [1 if word in text_words else 0 for word in feature_words]
        return features
    train_feature_list = [text_feature_(text, feature_words) for text in train_data_list]
    test_feature_list = [text_feature_(text, feature_words) for text in test_data_list]
    return train_feature_list, test_feature_list

# 对停用词去重
def make_word_set(words_file):
    words_set = set()
    with open(words_file, ‘r‘, encoding=‘UTF-8‘) as fp:
        for line in fp.readlines():
            word = line.strip()
            if len(word)>0 and word not in words_set:
                words_set.add(word)
    return words_set

# 列表求均值
def average(accuracy_list):
    sum = 0
    for i in accuracy_list:
        sum += i
    return round(sum/len(accuracy_list),3)

# 分类 同时输出准确率等
def text_classifier(train_feature_list, test_feature_list, train_class_list, test_class_list, flag):
    if flag == ‘nb‘:
        # 朴素贝叶斯分类器 拟合 默认拉普拉斯平滑 不指定先验概率先验概率
        classifier = NB().fit(train_feature_list, train_class_list)
    if flag == ‘lg‘:
        # 逻辑回归分类器 指定liblinear为求解最优化问题的算法 最大迭代数 多分类问题策略
        classifier = LR(solver=‘liblinear‘,max_iter=5000, multi_class=‘auto‘).fit(train_feature_list, train_class_list)
    if flag == ‘rf‘:
        # 随机森林分类器
        classifier = RF(n_estimators=200).fit(train_feature_list, train_class_list)
    test_accuracy = classifier.score(test_feature_list, test_class_list)        # 测试准确率
    return test_accuracy

def start(flag):
    folder_path = ‘D:/WorkSpace/THUCTC/THUCNews/‘     # 请修改成自己的路径
    all_words_list, train_data_list, test_data_list, train_class_list, test_class_list = text_processor(folder_path, test_size=0.2)
    stopwords_set = make_word_set(‘D:/WorkSpace/tmp/py/stop_words_cn.txt‘)
    # 文本特征的提取和分类
    deleteNs = range(0,1000,20)
    test_accuracy_list = []

    # 每循环一次,去除前 20 个最高词频,直到去除 980 个最高词频为止
    for deleteN in deleteNs:
        feature_words = words_dict(all_words_list, deleteN, stopwords_set)
        train_feature_list, test_feature_list = text_features(train_data_list, test_data_list, feature_words)
        if flag == ‘nb‘:
            test_accuracy = text_classifier(train_feature_list, test_feature_list, train_class_list, test_class_list, flag=‘nb‘)
        if flag == ‘lg‘:
            test_accuracy = text_classifier(train_feature_list, test_feature_list, train_class_list, test_class_list, flag=‘lg‘)
        if flag == ‘rf‘:
            test_accuracy = text_classifier(train_feature_list, test_feature_list, train_class_list, test_class_list, flag=‘rf‘)
        test_accuracy_list.append(test_accuracy)
    print(flag + ‘平均准确度:‘, average(test_accuracy_list))
    print(flag + ‘最大准确度:‘, round(max(test_accuracy_list), 3))
    return deleteNs, test_accuracy_list

if __name__ == "__main__":
    plt.figure(figsize=(13, 11))
    for i in range(5):
        # 1
        flag = ‘nb‘
        nb_deleteNs, nb_accuracy_list = start(flag)
        flag = ‘lg‘
        lg_deleteNs, lg_accuracy_list = start(flag)
        flag = ‘rf‘
        rf_deleteNs, rf_accuracy_list = start(flag)

        # 绘图
        plt.title(‘Relationship of deleteNs and test_accuracy‘)
        plt.xlabel(‘deleteNs‘)
        plt.ylabel(‘test_accuracy‘)
        plt.grid()
        plt.plot(nb_deleteNs, nb_accuracy_list, ‘b‘, label=‘nb‘)
        plt.plot(lg_deleteNs, lg_accuracy_list, ‘k‘, label=‘lg‘)
        plt.plot(rf_deleteNs, rf_accuracy_list, ‘r‘, label=‘rf‘)
        plt.annotate(‘大‘, xy=((nb_accuracy_list.index(max(nb_accuracy_list))-1)*20, max(nb_accuracy_list)))
        plt.annotate(‘大‘, xy=((lg_accuracy_list.index(max(lg_accuracy_list))-1)*20, max(lg_accuracy_list)))
        plt.annotate(‘大‘, xy=((rf_accuracy_list.index(max(rf_accuracy_list))-1)*20, max(rf_accuracy_list)))

    plt.legend()
    plt.show()

运行结果:

其他参数请自行修改

原文地址:https://www.cnblogs.com/melonman/p/10059378.html

时间: 2024-10-14 16:22:14

python实现随机森林、逻辑回归和朴素贝叶斯的新闻文本分类的相关文章

朴素贝叶斯-基于概率的分类方法

决策树.knn算法都是结果确定的分类算法,数据示实例最终被明确的划分到某个分类中 贝叶斯:不能完全确定数据实例应该划分到某个类,湖综合只能给出数据实例属于给定分类的概率 *引入先验概率与逻辑推理来处理不确定命题 *(扩展命题),另一种叫频数概率,从数据本身出发得到结论,不考了逻辑推理及先验知识. 朴素贝叶斯:整个形式化过程中制作最原始,最简单的假设 python文本能力:将文本划分为词向量,利用词向量对文本分类 朴素贝叶斯:选择高概率对应的类别 优点:在数据较少的情况下仍然有效,可以处理多类别问

Bayes 朴素贝叶斯实现垃圾邮件分类

本文选取了25封垃圾邮件和25封正常邮件,随机产生了10组测试集和40组训练集,使用朴素贝叶斯方法实现了垃圾邮件的分类. Bayes公式   遍历每篇文档向量,扫描所有文档的单词,合并集合去重 ,并生成最终的词汇表 # 创建词汇表 # 输入:dataSet已经经过切分处理 # 输出:包含所有文档中出现的不重复词的列表 def createVocabList(dataSet):  # 文本去重,创建词汇表 vocabSet = set([])  # 创建一个空的集合 for document in

基于朴素贝叶斯算法的情感分类

环境 win8, python3.7, jupyter notebook 正文 什么是情感分析?(以下引用百度百科定义) 情感分析(Sentiment analysis),又称倾向性分析,意见抽取(Opinion extraction),意见挖掘(Opinion mining),情感挖掘(Sentiment mining),主观分析(Subjectivity analysis),它是对带有情感色彩的主观性文本进行分析.处理.归纳和推理的过程,如从评论文本中分析用户对"数码相机"的&qu

基于TF-IDF及朴素贝叶斯的短文本分类

概括:朴素贝叶斯分类器(Naïve Bayes classifier)是一种相当简单常见但是又相当有效的分类算法,在监督学习领域有着很重要的应用.朴素贝叶斯是建立在“全概率公式”的基础下的,由已知的尽可能多的事件A.B求得的P(A|B)来推断未知P(B|A),是的有点玄学的意思,敲黑板!!! 优点: 模型训练使用TF-IDF对训练数据做词频及概率统计: 分类使用朴素贝叶斯计算所有类目的概率; 适用于电商的短文本分类,加入部分人工干预,top3准确率可达到95%左右: 分类预测完全可解释,不存在神

&amp;lt;Machine Learning in Action &amp;gt;之二 朴素贝叶斯 C#实现文章分类

def trainNB0(trainMatrix,trainCategory): numTrainDocs = len(trainMatrix) numWords = len(trainMatrix[0]) pAbusive = sum(trainCategory)/float(numTrainDocs) p0Num = ones(numWords); p1Num = ones(numWords) #change to ones() p0Denom = 2.0; p1Denom = 2.0 #c

朴素贝叶斯

一.随机变量 可以取不同的值,不同的值有不同的概率. 看到随机变量取任何值,都要想到背后有个概率,如果是连续变量,在每一点的概率是0,连续型随机变量通常只考虑概率密度. 机器学习就是通过一堆随机变量预测另一个随机变量,先假设随机变量之间的概率分布,然后从数据中估计分布的参数. 任何概率模型的假设都是简化,不能完全刻画数据,并且每个模型都有其适用范围,比如朴素贝叶斯对于文本分类效果好. 二.贝叶斯定理 贝叶斯定理给出了从一种条件概率P(B|A)怎么推到另一种条件概率P(A|B): 这个东西有什么用

Stanford大学机器学习公开课(五):生成学习算法、高斯判别、朴素贝叶斯

(一)生成学习算法 在线性回归和Logistic回归这种类型的学习算法中我们探讨的模型都是p(y|x;θ),即给定x的情况探讨y的条件概率分布.如二分类问题,不管是感知器算法还是逻辑回归算法,都是在解空间中寻找一条直线从而把两种类别的样例分开,对于新的样例,只要判断在直线的哪一侧即可:这种直接对问题求解的方法可以称为判别学习方法. 而生成学习算法则是对两个类别分别进行建模,用新的样例去匹配两个模板,匹配度较高的作为新样例的类别,比如分辨大象(y=1)和狗(y=0),首先,观察大象,然后建立一个大

朴素贝叶斯(naive bayes)

朴素贝叶斯(naive bayes) 主要参考资料:<机器学习实战><统计学习方法> 1.朴素贝叶斯分类原理 朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设(称为朴素的原因)的分类方法.先看看维基百科中贝叶斯定理的描述: 贝叶斯定理(维基百科) 通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A的条件下的概率是不一样的:然而,这两者是有确定的关系,贝叶斯定理就是这种关系的陈述. 公式描述如下: P(A|B)=P(A|B)P(A)P(B) 其中P(A|B)是在B发生的情况下

机器学习笔记:朴素贝叶斯方法(Naive Bayes)原理和实现

本文主要描述了朴素贝叶斯分类方法,包括模型导出和学习描述.实例部分总结了<machine learning in action>一书中展示的一个该方法用于句子感情色彩分类的程序. 方法概述 学习(参数估计) 实现:朴素贝叶斯下的文本分类 模型概述 朴素贝叶斯方法,是指 朴素:特征条件独立 贝叶斯:基于贝叶斯定理 根据贝叶斯定理,对一个分类问题,给定样本特征x,样本属于类别y的概率是 p(y|x)=p(x|y)p(y)p(x)......(1) 在这里,x是一个特征向量,将设x维度为M.因为朴素