基于微调BERT的中文评论情感分类模型
迁移中文bert模型(chinese-bert-wwm),完成对20000余条评论数据的情感分类,分为0-很好,1-一般,2-较差。
学习到bert模型的强大之后,不禁感叹,之前比赛用的模型太垃圾了,完全不够看,思考用bert训练模型来模拟比赛,
于是该bert模型在自己的数据集上进行了迁移和训练
采用ktrain库进行文本分类
0.分配GPU(CPU版略过)
%reload_ext autoreload
%autoreload 2
%matplotlib inline
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID";
os.environ["CUDA_VISIBLE_DEVICES"]="0"; #指定GPU
配置GPU移步
1.win10环境下python3.7+cuda10.1+cudnn7.6+tensorflow-gpu1.13的安装
3.TensorFlow-GPU版本、cuda版本和python等版本对应下载
结合这三篇下载安装
1.加载数据
#0-很好 1-一般 2-差
import pandas as pd
import numpy as np
train = pd.read_excel('D:/python相关/数据/train_sentiment.xls')
test = pd.read_excel('D:/python相关/数据/test_sentiment.xls')
2.打乱数据
X_data=train.content
y_data=np.asarray(train.cls, dtype=np.float32)
x_data_test=test.content
y_data_test=np.asarray(test.cls, dtype=np.float32)
nums = []
nums_ = []
x_train = []
y_train = []
x_test = []
y_test = []
nums = np.arange(9999)
np.random.shuffle(nums)
for i in nums:
x_train.append(X_data[i])
y_train.append(y_data[i])
nums_ = np.arange(3602)
np.random.shuffle(nums_)
for i in nums_:
x_test.append(x_data_test[i])
y_test.append(y_data_test[i])
y_train=np.asarray(y_train, dtype=np.int)
y_test=np.asarray(y_test, dtype=np.int)
3.预处理数据并构造一个中文trasnformer模型
import ktrain
from ktrain import text
MODEL_NAME = 'hfl/chinese-bert-wwm'
t = text.Transformer(MODEL_NAME, maxlen=300, class_names=[0,1,2])#300有点小,可以设置400/500
trn = t.preprocess_train(x_train, y_train)
val = t.preprocess_test(x_test, y_test)
model = t.get_classifier()
learner = ktrain.get_learner(model, train_data=trn, val_data=val, batch_size=1)
#GPU容量限制,参数尽量调小了,结果相应会受到影响
*[preprocessing train…
language: zh-cn
Is Multi-Label? False
preprocessing test…
language: zh-cn]
估计一个较好的学习率
对于transformer模型来讲,结合经验和大神测试总结,学习率(learning rate)取2e-5 - 5e-5 会取得较好的性能. 这里,我们可以利用lr_find方法尝试在特定数据及寻找一个较好的学习率
这里为我们只运行1个epoch(因为时间太久,GPU的同学可以试试其他参数)
learner.lr_find(show_plot=True, max_epochs=1)
用损失函数确定最好学习率,loss越小越好
训练模型
参数设置:learning_rate = 2e-5, epochs = 4
CPU时间特别久,GPU是CPU十倍以上
learner.fit_onecycle(2e-5, 4)
评估模型
learner.validate(class_names=t.get_classes())
类别:0 的准确率明显低于其他两类的原因可能是数据量问题
在新的数据上进行测试
找到loss最大的样本
learner.view_top_losses(n=1, preproc=t)
#id:397 | loss:7.4 | true:0 | pred:2)
* #查看错误情况,这个错误原因很明确是因为数据标注错误,这是一个反例(类别2:差评)*
说明模型还是挺不错的。
print(x_test[397])
#1、由于键盘的设计,某些键按起来不是很方便。2、摄像头的镜头没有保护,裸露在外,如果镜头表面不小心留下划痕,会影响到拍照的效果。3、手机稍微大了点,重了点,携带不是特别方便。4、机身附带的音箱效果不是很好,音量较大时会有一些杂音。5、电池的使用时间稍微有点
在新的数据上进行测试
predictor = ktrain.get_predictor(learner.model, preproc=t)
predictor.predict('怎么成现在这样儿了……就是抄好莱坞结构,也不至于啊!“7天假”啊,“春节第一天”啊,明显是投机这个档期。煽情点呢,死两个长辈')
2 #结果(评价较差)
predictor.explain('怎么成现在这样儿了……就是抄好莱坞结构,也不至于啊!“7天假”啊,“春节第一天”啊,明显是投机这个档期。煽情点呢,死两个长辈')
保存模型,以便之后调用
predictor.save('/my_commentgroup_predictor')
reloaded_predictor = ktrain.load_predictor('/my_commentgroup_predictor')
结果分析
利用bert模型实现中文评论情感分类,数据来自某次比赛案例数据,共20000条,硬件问题,训练难度高,于是减小到训练数据9999条,测试数据3602条可能是数据本身不够准确和调参的问题,准确率结果为88%。利用英文模型对英文分类的案例中展示的结果更好。在进行预训练之前查看不少博客,学习了过程,但是上手仍然有难度。电脑GPU容量较小,不支持更大的模型训练,也直接造成模型参数的可调性。
实验总结
结果用作比赛还可以做优化,难度主要在模型预训练的调试上,电脑CPU训练较慢,过程中有不少坑,于是配置GPU环境,但是一直报错,还是遇到很多坑,踩得心累。环境配置好了,但是算力和容量限制,这次实验暂时到这里吧。进一步提醒了自己的能力,前路漫漫,加油!