我用LLaMA-Factory微调大模型来实现商品评论情感分析,准确率高达91.70%

本文主要是介绍我用LLaMA-Factory微调大模型来实现商品评论情感分析,准确率高达91.70%,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我是程序锅。

最近在modelscope上闲逛的时候,在数据集板块发现有一个商品评论情感预测数据集。这个数据集源自一个比赛,它的目的是为了预测电商平台顾客的评论是好评还是差评。

数据示例如下所示(其中0代表差评,1代表好评):

这个比赛是2021年7月开始举办的。那个时候还没有ChatGPT,如果需要做商品评论情感预测,是需要分词、预处理、选择模型等等一系列机器学习方法。而我最近正好在学习LLaMA-Factory,正好试一试用它来微调大模型,看看最终情感预测结果如何?

好的,首先我们先上结果。

大模型微调+提示工程大模型+提示工程
准确率91.70%79.43%

使用大模型微调相比不微调,提升12.27%

整体技术路线采用:LLaMA-Factory + Lora + Qwen1.5-7B

教程视频如下:

https://www.bilibili.com/video/BV1siuietEYX/?vd_source=d0aa621a464f99754d7108e57e32eab9

下面我们来看如何微调大模型来做商品评论情感分析。微调过程与传统深度学习方法类似。无非是准备数据、配环境、训练、最后评测。

一、数据准备

采用数据集的来自于modelscope的商品评论情感预测,其中训练数据集45366条,测试数据集5032条。

下载数据集:

from modelscope.msdatasets import MsDataset
ds_train =  MsDataset.load('DAMO_NLP/jd', subset_name='default', split='train')from modelscope.msdatasets import MsDataset
ds_val =  MsDataset.load('DAMO_NLP/jd', subset_name='default', split='validation')

下载后的数据集无法直接应用到微调,我们还需要结合提示工程,将数据集转化为大模型微调所需要的格式(即问答对的形式)

数据转化代码如下:

import json
from modelscope.msdatasets import MsDataset
from tqdm import *
ds_train =  MsDataset.load('DAMO_NLP/jd', subset_name='default', split='train')
ds_val =  MsDataset.load('DAMO_NLP/jd', subset_name='default', split='validation')
print(len(ds_train["sentence"]))
print(len(ds_val["sentence"]))
outout = []
SYSTEM_PROMPT = "我在做商品评论情感预测,需根据用户评价判断是好评还是差评,其中输出0代表差评,输出1代表好评,请严格保证输出结果为整数并且只能是0或者1。输入的用户评价为:"
for i in tqdm(range(len(ds_val["sentence"]))):sentence = ds_val["sentence"][i]if (ds_val["label"][i] == None or ds_val["sentence"][i] == None ):continuelabel = str(int(ds_val["label"][i]))outout.append({"instruction":SYSTEM_PROMPT+sentence,"input":"","output":label})  
with open("jd_val.json", "w") as json_file:json.dump(outout, json_file,ensure_ascii=False)

二、环境依赖

  • LLaMA-Factory
  • Qwen1.5-7B

可以自己去安装部署,我也准备了相应依赖pip list

具体关于LLaMA-Factory的部署、使用和自定义数据集,可以参考这篇文章:

https://zhuanlan.zhihu.com/p/696631776

三、训练

整体训练耗时2.5小时,采用lora的方式,loss图如下所示:

训练可以采用web页面训练CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui,也可以采用命令行的方式训练,具体训练执行命令如下所示:

CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \--stage sft \--do_train True \--model_name_or_path /home/guo/hub/Qwen1___5-7B-Chat \ #选择大模型下载位置--preprocessing_num_workers 16 \--finetuning_type lora \--template qwen \--flash_attn auto \--dataset_dir data \--dataset jd \ #设置为你的数据集--cutoff_len 1024 \--learning_rate 5e-05 \--num_train_epochs 3.0 \--max_samples 100000 \--per_device_train_batch_size 2 \--gradient_accumulation_steps 8 \--lr_scheduler_type cosine \--max_grad_norm 1.0 \--logging_steps 5 \--save_steps 100 \--warmup_steps 0 \--optim adamw_torch \--packing False \--report_to none \--output_dir saves/Qwen1.5-7B-Chat/lora/train_2024-05-23-14-32-35 \--fp16 True \--plot_loss True \--lora_rank 8 \--lora_alpha 16 \--lora_dropout 0 \--lora_target q_proj,v_proj

四、评测

LLaMA-Factory也支持用web界面的方式评估和预测,具体评测使用方式如下所示。

评测结束后,得到一个generated_predictions.jsonl

{"label": "1", "predict": "1"}
{"label": "0", "predict": "0"}
{"label": "1", "predict": "1"}
{"label": "1", "predict": "1"}
{"label": "0", "predict": "0"}
{"label": "1", "predict": "1"}
{"label": "1", "predict": "1"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "1", "predict": "1"}
...

自己写一个准确率计算代码Acc=(TP+TN)/(TP+TN+FP+FN)

五、最后

这是一个大模型微调入门的一个小案例,lora权重、数据集全部开源放到我的github repo。

https://github.com/GuoCoder/ai-app

后续我还会分享更多关于AI应用的案例。也欢迎大家点赞、收藏、关注我。

这篇关于我用LLaMA-Factory微调大模型来实现商品评论情感分析,准确率高达91.70%的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004727

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配