XGBoost与LightGBM文本分类

article/2025/8/17 18:18:14

目录

用户评论情感极性判别

一、数据准备

二、数据预处理

三、文本特征提取

四、将数据转换为DMatrix类型

五、构建XGBoost模型

1、XGBoost模型主要参数

(1)通用参数

(2)Booster参数

(3)学习目标参数

2、XGBoost模型

(1)基于XGBoost原生接口的分类

(2)基于Scikit-learn接口的分类

六、使用XGBoost做预测,并对模型进行评估

七、LightGBM文本分类


用户评论情感极性判别

一、数据准备

训练集:data_train.csv ,样本数为82025,情感极性标签(0:负面、1:中性、2:正面) 

测试集:data_test.csv ,样本数为35157

评论数据主要包括:食品餐饮类,旅游住宿类,金融服务类,医疗服务类,物流快递类;部分数据如下:

二、数据预处理

主要进行中文分词停用词过滤

预处理后训练集:clean_train_data.csv

预处理后测试集:clean_test_data.csv

预处理后的部分数据如下:

数据集预处理部分代码如下:

import pandas as pd
import jieba
#去除停用词,返回去除停用词后的文本列表
def clean_stopwords(contents):contents_list=[]stopwords = {}.fromkeys([line.rstrip() for line in open('data/stopwords.txt', encoding="utf-8")]) #读取停用词表stopwords_list = set(stopwords)for row in contents:      #循环去除停用词words_list = jieba.lcut(row)words = [w for w in words_list if w not in stopwords_list]sentence=' '.join(words)   #去除停用词后组成新的句子contents_list.append(sentence)return contents_list
# 将清洗后的文本和标签写入.csv文件中
def after_clean2csv(contents, labels): #输入为文本列表和标签列表columns = ['contents', 'labels']save_file = pd.DataFrame(columns=columns, data=list(zip(contents, labels)))save_file.to_csv('data/clean_data_test.csv', index=False, encoding="utf-8")if __name__ == '__main__':train_data = pd.read_csv('data/data_test.csv', sep='\t',names=['ID', 'type', 'review', 'label']).astype(str)labels=[]for i in range(len(train_data['label'])):labels.append(train_data['label'][i])contents=clean_stopwords(train_data['review'])after_clean2csv(contents,labels)

三、文本特征提取

使用sklearn计算训练集的TF-IDF,并将训练集和测试集分别转换为TF-IDF权重矩阵,作为模型的输入。

# coding=utf-8
import pandas as pd
import xgboost as xgb
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn import metrics
from sklearn.model_selection import train_test_splitif __name__ == '__main__':train_data = pd.read_csv('data/clean_data_train.csv', sep=',', names=['contents', 'labels']).astype(str)cw = lambda x: int(x)train_data['labels']=train_data['labels'].apply(cw)x_train, x_test, y_train, y_test = train_test_split(train_data['contents'], train_data['labels'], test_size=0.1)# 将语料转化为词袋向量,根据词袋向量统计TF-IDFvectorizer = CountVectorizer(max_features=5000)tf_idf_transformer = TfidfTransformer()tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))x_train_weight = tf_idf.toarray()  # 训练集TF-IDF权重矩阵tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))x_test_weight = tf_idf.toarray()  # 测试集TF-IDF权重矩阵

四、将数据转换为DMatrix类型

XGBoost 的二进制的缓存文件,加载的数据存储在对象 DMatrix 中。

    # 将数据转化为DMatrix类型dtrain = xgb.DMatrix(x_train_weight, label=y_train)dtest = xgb.DMatrix(x_test_weight, label=y_test)# 保存测试集数据,以便模型训练完成直接调用# dtest.save_binary('data/dtest.buffer')

五、构建XGBoost模型

XGBoost有两大类接口:XGBoost原生接口 和 scikit-learn接口 ,并且XGBoost能够实现 分类 和 回归 两种任务。

1、XGBoost模型主要参数

XGBoost所有的参数分成了三类:通用参数:宏观函数控制;Booster参数:控制每一步的booster;目标参数:控制训练目标的表现。

(1)通用参数

  • booster[默认gbtree]:gbtree:基于树的模型、gbliner:线性模型
  • silent[默认0]:值为1时,静默模式开启,不会输出任何信息
  • nthread[默认值为最大可能的线程数]:这个参数用来进行多线程控制,应当输入系统的核数。 如果你希望使用CPU全部的核,那就不要输入这个参数,算法会自动检测它

(2)Booster参数

这里只介绍tree booster,因为它的表现远远胜过linear booster,所以linear booster很少用到

  • eta[默认0.3]:和GBM中的 learning rate 参数类似。 通过减少每一步的权重,可以提高模型的鲁棒性。常用的值为0.2, 0.3
  • max_depth[默认6]:这个值为树的最大深度。max_depth越大,模型会学到更具体更局部的样本。常用的值为6
  • gamma[默认0]:Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关。
  • subsample[默认1]:这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 常用的值:0.7-1
  • colsample_bytree[默认1]:用来控制每棵随机采样的列数的占比(每一列是一个特征)。 常用的值:0.7-1

(3)学习目标参数

  • objective[默认reg:linear]:这个参数定义需要被最小化的损失函数。binary:logistic二分类的逻辑回归,返回预测的概率。multi:softmax 使用softmax的多分类器,返回预测的类别。这种情况下,还需要多设一个参数:num_class(类别数目)。 multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。
  • eval_metric[默认值取决于objective参数的取值]:对于有效数据的度量方法。 对于回归问题,默认值是rmse,对于分类问题,默认值是error。其他的值:rmse 均方根误差; mae 平均绝对误差;logloss 负对数似然函数值;error 二分类错误率(阈值为0.5); merror 多分类错误率;mlogloss 多分类logloss损失函数;auc 曲线下面积。
  • seed[默认0]:随机数的种子 设置它可以复现随机数据的结果。

2、XGBoost模型

(1)基于XGBoost原生接口的分类

 #基于XGBoost原生接口的分类#xgboost模型构建param = {'silent': 0, 'eta': 0.3, 'max_depth': 6, 'objective': 'multi:softmax', 'num_class': 3, 'eval_metric': 'merror'}  # 参数evallist = [(dtrain, 'train'), (dtest, 'test')]num_round = 100  # 循环次数xgb_model = xgb.train(param, dtrain, num_round,evallist)# 保存训练模型# xgb_model.save_model('data/xgb_model')# xgb_model=xgb.Booster(model_file='data/xgb_model') #加载训练好的xgboost模型

(2)基于Scikit-learn接口的分类

#基于Scikit-learn接口的分类# 训练模型model = xgb.XGBClassifier(max_depth=6, learning_rate=0.1, n_estimators=100, silent=True, objective='multi:softmax')model.fit(x_train_weight, y_train)y_predict=model.predict(x_test_weight)

六、使用XGBoost做预测,并对模型进行评估

    '''#利用训练完的模型直接测试xgb_model = xgb.Booster(model_file='data/xgb_model')  # init model #加载模型dtest = xgb.DMatrix('data/test.buffer')  #加载数据xgb_test(dtest,xgb_model)'''y_predict = xgb_model.predict(dtest)  # 模型预测label_all = ['负面', '中性','正面']confusion_mat = metrics.confusion_matrix(y_test, y_predict)df = pd.DataFrame(confusion_mat, columns=label_all)df.index = label_allprint('准确率:', metrics.accuracy_score(y_test, y_predict))print('confusion_matrix:', df)print('分类报告:', metrics.classification_report(y_test, y_predict))

模型分类结果如下:

七、LightGBM文本分类

# coding=utf-8
import pandas as pd
import numpy as np
from sklearn import metrics
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import lightgbm as lgb
from sklearn.model_selection import train_test_splitif __name__ == '__main__':train_data = pd.read_csv('data/clean_data_train.csv', sep=',', names=['contents', 'labels']).astype(str)'''test_data = pd.read_csv('data/clean_data_test.csv', sep=',', names=['contents', 'labels']).astype(str)cw = lambda x: int(x)x_train = train_data['contents']y_train = np.array(train_data['labels'].apply(cw))x_test = test_data['contents']y_test = np.array(test_data['labels'].apply(cw))'''x_train, x_test, y_train, y_test = train_test_split(train_data['contents'], train_data['labels'], test_size=0.1)cw = lambda x: int(x)x_train = x_trainy_train = np.array(y_train.apply(cw))x_test = x_testy_test = np.array(y_test.apply(cw))# 将语料转化为词袋向量,根据词袋向量统计TF-IDFvectorizer = CountVectorizer(max_features=5000)tf_idf_transformer = TfidfTransformer()tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))x_train_weight = tf_idf.toarray()  # 训练集TF-IDF权重矩阵tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))x_test_weight = tf_idf.toarray()  # 测试集TF-IDF权重矩阵# 创建成lgb特征的数据集格式lgb_train = lgb.Dataset(x_train_weight, y_train)lgb_val = lgb.Dataset(x_test_weight, y_test, reference=lgb_train)# 构建lightGBM模型params = {'max_depth': 5, 'min_data_in_leaf': 20, 'num_leaves': 35,'learning_rate': 0.1, 'lambda_l1': 0.1, 'lambda_l2': 0.2,'objective': 'multiclass', 'num_class': 3, 'verbose': -1}# 设置迭代次数,默认为100,通常设置为100+num_boost_round = 1000# 训练 lightGBM模型gbm = lgb.train(params, lgb_train, num_boost_round, verbose_eval=100, valid_sets=lgb_val)# 保存模型到文件# gbm.save_model('data/lightGBM_model')# 预测数据集y_pred = gbm.predict(x_test_weight, num_iteration=gbm.best_iteration)y_predict = np.argmax(y_pred, axis=1)  # 获得最大概率对应的标签label_all = ['负面', '中性', '正面']confusion_mat = metrics.confusion_matrix(y_test, y_predict)df = pd.DataFrame(confusion_mat, columns=label_all)df.index = label_allprint('准确率:', metrics.accuracy_score(y_test, y_predict))print('confusion_matrix:', df)print('分类报告:', metrics.classification_report(y_test, y_predict))

分类结果如下:

项目实战:XGBoost与LightGBM文本分类源代码及数据集资源下载:

XGBoost与LightGBM文本分类源代码及数据集.zip-机器学习文档类资源-CSDN下载

参考:

1、安装包下载网址

2、XGBoost学习文档

3、XGBoost和LightGBM的参数以及调参

4、XGBoost数据比赛之调参

5、LightGBM调参笔记

6、kaggle——泰坦尼克之灾(基于LGBM)

本人博文NLP学习内容目录:

一、NLP基础学习

1、NLP学习路线总结

2、TF-IDF算法介绍及实现

3、NLTK使用方法总结

4、英文自然语言预处理方法总结及实现

5、中文自然语言预处理方法总结及实现

6、NLP常见语言模型总结

7、NLP数据增强方法总结及实现

8、TextRank算法介绍及实现

9、NLP关键词提取方法总结及实现

10、NLP词向量和句向量方法总结及实现

11、NLP句子相似性方法总结及实现

12、NLP中文句法分析

二、NLP项目实战

1、项目实战-英文文本分类-电影评论情感判别

2、项目实战-中文文本分类-商品评论情感判别

3、项目实战-XGBoost与LightGBM文本分类

4、项目实战-TextCNN文本分类实战

5、项目实战-Bert文本分类实战

6、项目实战-NLP中文句子类型判别和分类实战

交流学习资料共享欢迎入群:955817470(群一),801295159(群二)


http://chatgpt.dhexx.cn/article/tmdsMw2A.shtml

相关文章

文本分类概念类大总结(机器学习+深度学习)

基础普及: https://zhuanlan.zhihu.com/p/25928551 综述类(有不同算法在各数据集上的性能对比):   Deep Learning Based Text Classification:A Comprehensive Review(20.04)   A Survey on Text Class…

新闻个性化推荐综述

MIND: A Large-scale Dataset for News Recommendation ACL 2020 0. 摘要 新闻推荐是实现个性化新闻服务的一项重要技术。与已经被广泛研究的产品推荐和电影推荐相比,新闻推荐的研究非常有限,主要是因为缺乏高质量的基准数据集。本文提出了一个名为MI…

新基建之数据中心

绪论 4月20日上午,国家发展改革委通过网上方式举行4月份新闻发布会。会上回答了彭博社记者关于新型基础设施建设的提问。内容如下: 目前来看,新型基础设施主要包括3个方面内容: 一是信息基础设施。主要是指基于新一代信息技术演…

机器学习案例实战:Python文本数据分析新闻分类任务

原创文章,如需转载请保留出处 本博客为唐宇迪老师python数据分析与机器学习实战课程学习笔记一. 文本分析与关键词提取 1.1 文本数据 1.2 停用词 语料中大量出现没啥大用留着过年吗 1.3 Tf-idf:关键词提取 《中国的蜜蜂养殖》:进行词频(…

音视频融合综述

文章目录 前言摘要正文1介绍音视频特征提取和融合类型融合的技术挑战依赖问题同步问题数据问题 最近的进展和研究方法异步动态加权深度学习多模态融合学习:跨模式学习:共享学习DL使用经验多视图学习 总结 个人总结与思考 前言 最近需要加强相关领域的深…

从0到1构建新闻长文本分类系统

新闻分类系统概述 新闻分类系统,顾名思义,就是对于一片新闻或者是一片文章,进行自动的分类,例如政治,财经,娱乐等等 从技术角度讲,其实属于自然语言处理中比较经典的文本分类问题。当然在一个工业级别的分…

谈文本分类

本文来自对《文本分类研究综述》汪岿的阅读 文章目录 1. 为什么要进行文本分类2. 文本分类的分类、应用3. 当前文本分类面临的挑战4. 文本分类的前景 1. 为什么要进行文本分类 在大数据时代,网络上的文本数据日益增长。采用文本分类技术对海量数据进行科学地组织和…

多模态融合技术综述和应用

文章目录 多模态技术基础1,多模态融合架构(神经网络模型的基本结构形式)1.1联合架构1.2协同架构1.3编解码架构(自监督) 2,多模态融合方法2.1早期融合2.2 晚期融合2.3混合融合 3,模态对齐方法3.1…

大数据分析案例-基于随机森林算法构建新闻文本分类模型

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集…

【数据挖掘】天池挑战赛 新闻推荐

比赛网址:https://tianchi.aliyun.com/competition/entrance/531842/introduction 项目源码:Github 一、项目知识点 数据预处理; 数据可视化; 特征工程; 模型选择; 实验结果的评价; 二、…

python-新闻文本分类详细案例-(数据集见文末链接)

文章目录 分析思路所用数据集一、导入相关包二、数据分析1.读取数据2. jieba分词并去除停用词3. TF-IDF4. 网格搜索寻最优模型及最优参数5. 预测并评估预测效果 总结 分析思路 新闻文本数据包含四类新闻,分别用1,2,3,4 表示。 &a…

NetWORK ShortCuts 创建

很多时候我们创建了很多SHARE DRIVE的SHOT CUT: 但是我们不知道他们的路径在哪里,在下一台新电脑的时候,我们又要重新创建?NONONO, 我们打开其中一个SHORT CUT 我们点一下 "Proposal_Content_RPA" 右边的空…

shortcuts实现

1.使用条件 android 7.1以上 2.功能说明 长按桌面app图标出现快捷方式列表,点击可跳转到app的指定界面,用户也可以将其作为一个单独的快捷方式 3.效果截图 3.技术实现 分为两种方式,静态xml配置和动态代码配置,二者各有优劣&#…

Android ShortCuts使用

ShortCuts是什么? Shortcuts是指在桌面长按app图标而出现的快捷方式,可以为你的app的关键功能添加更加快速的入口而不是先打开app 点击快捷方式可以访问应用功能,而且这种快捷方式也可以被拖拽到桌面的单独位置,变成单独的左面快…

Android App Shortcuts

周五了,周末还远吗?~ 加入我知识星球的人都得到了提升,可不要错过哦~ 点击阅读原文即可。 本文较长,阅读大约十分钟 ~ 我们都知道iPhone6S推出了3D Touch的功能,也算是一个大卖点,Google也后来居上&#xf…

Linux下cut命令用法详解

Linux下cut命令用法详解 原创:frozen_sucker(冰棍) 有时我们经常会遇到这样一些问题:有一页电话号码薄,上面按顺序规则地写着人名、家庭住址、电话、备注等,此时我们只想取出所有人的名字和其对应的电话号码,你有几种…

使用Dynamic Shortcuts

在看完Static Shortcuts后, 我们不相信Google仅仅给我们开发者开放了局限性如此大的使用方式, 肯定还会存在灵活性更大的API, 是的, 这就是我们马上要讲的Dynamic Shortcuts, 我把它称为动态配置. 说起动态配置, 那肯定是用java代码实现了, 那如何实现呢? 首先第一步, 我们需…

Shortcuts,让你可以在系统的桌面上为所欲为

/ 今日科技快讯 / 近日,有用户刷抖音时看到烤虾广告下单,实付款194元买了250克烤虾干,货到付款后发现是三无产品,且外形口感与广告宣传天差地别。对此抖音表示,已对此事展开相关调查,并下架涉嫌虚假宣传…

Shortcuts使用解析(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/susan_123456/article/details/93793490 Shortcuts是什么? Shortcuts是指在桌面长按App图标而出现的快捷方式,可以为你的App的关键功能添加更快速的…

是时候来了解android7了:shortcuts(快捷方式)

本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。 就在前几天的一个晚上, Google召开了它的秋季发布会, 毫无悬念的宣布了它的最新手机品牌Pixel, 与此同时我的nexus设备也从亲儿子降级成为干儿子. 不过还好Google并没…