如何建设个人网站凡科怎么样,wp_head wordpress,国产系统2345,wordpress怎么集成码支付宝原文链接#xff1a;https://tecdat.cn/?p38181 自然语言处理#xff08;NLP#xff09;领域在近年来发展迅猛#xff0c;尤其是预训练模型的出现带来了重大变革。其中#xff0c;BERT 模型凭借其卓越性能备受瞩目。然而#xff0c;对于许多研究者而言#xff0c;如何高… 原文链接https://tecdat.cn/?p38181 自然语言处理NLP领域在近年来发展迅猛尤其是预训练模型的出现带来了重大变革。其中BERT 模型凭借其卓越性能备受瞩目。然而对于许多研究者而言如何高效运用 BERT 进行特定任务的微调及应用仍存在诸多困惑点击文末“阅读原文”获取完整代码数据。 本文聚焦于此旨在为读者详细剖析基于 Pytorch 的 BERT 模型在自然语言处理任务中的微调方法与实际应用。通过从数据准备、模型微调、训练过程到结果分析等一系列环节的阐述并结合如 CoLA 数据集等具体示例展示如何借助 BERT 及相关工具构建高质量 NLP 模型以助力该领域的研究与实践。 基于BERTopic模型对 20 Newsgroups 数据集的分析与可视化 本文详细阐述了运用 BERTopic 模型对从 sklearn 库中获取的 20 Newsgroups 数据集进行主题建模、分析以及可视化的过程。通过展示代码实现过程和相关结果呈现了如何利用该模型挖掘数据中的潜在主题结构并以直观的方式展示各主题的分布及相关信息为文本数据的主题分析提供了实践参考。 在文本数据分析领域主题建模是一项重要任务它有助于我们从大量文本数据中发现潜在的主题结构进而更好地理解数据内容。BERTopic 模型作为一种先进的主题建模工具结合了多种技术优势能够有效地对文本进行处理并提取出有意义的主题信息。本文将以 20 Newsgroups 数据集为例展示如何使用 BERTopic 模型进行主题分析及可视化操作。 数据获取与初步观察 一数据集获取 我们首先从 sklearn 库中获取 20 Newsgroups 数据集该数据集是一个广泛用于文本分类、文本挖掘和信息检索研究的国际标准数据集。以下是获取数据集的代码 from sklearn.datasets import fetch_20newsgroupsdocs fetch_20newsgroups(subsetall)\[data\] 在上述代码中通过fetch_20newsgroups函数并指定subsetall我们获取了整个数据集的文本内容并将其存储在docs变量中。 二数据规模与示例观察 获取到数据集后我们可以查看其规模以及具体的文本示例内容。通过以下代码 print(len(docs)) 我们得到数据集的文本数量为 18846 条。进一步通过查看具体的文本示例如 print(docs\[0\])
print(docs\[44\]) 可以了解到数据集中文本的大致格式和内容范围。例如docs[0]展示了关于 “Pens fans reactions” 的相关讨论内容而docs[44]则包含了 “NHL ALLTIME SCORING LEADERS” 等详细的体育赛事相关信息。这些示例文本反映了数据集涵盖的丰富主题领域为后续的主题建模分析提供了基础。 BERTopic 模型应用 一模型初始化与主题提取 接下来我们引入 BERTopic 模型并对获取到的数据集进行主题提取操作。 在上述代码中首先导入BERTopic类然后初始化一个BERTopic模型实例model。通过调用fit_transform方法对数据集docs进行处理该方法会在拟合模型的同时将数据转换为主题表示形式返回得到每个文本对应的主题编号topics以及相关的概率probs。 二主题频率与信息查看 为了进一步了解提取出的主题情况我们可以查看各个主题在数据集中出现的频率以及相关详细信息。 通过以下代码获取主题频率信息 model.get\_topic\_freq() 其返回结果以表格形式呈现展示了每个主题的编号以及对应的出现次数例如部分结果如下 这里需要注意的是主题编号为 -1 的情况可能表示一些未被明确分类或特殊处理的文本情况其出现次数较多可能与数据本身的特性或模型处理方式有关。 进一步通过代码 model.get\_topic\_info() 可以获取更详细的主题信息包括每个主题的编号、出现次数以及根据主题内高频词汇生成的主题名称例如部分结果如下 这些主题名称能够帮助我们初步了解每个主题大致涵盖的内容领域为后续深入分析提供了直观的参考。 主题可视化 一可视化准备 为了更直观地展示主题在数据集中的分布情况以及各主题之间的关系我们对提取出的主题进行可视化操作。首先进行一些必要的准备工作包括导入相关库以及对数据进行预处理以便于绘图。 在上述代码中我们导入了numpy、pandas、UMAP、matplotlib等相关库。通过调用model._extract_embeddings方法获取文本的嵌入表示embeddings然后利用UMAP算法对嵌入数据进行降维和可视化处理将结果转换为二维坐标形式存储在df数据框中并添加topic列用于标记每个数据点所属的主题。 二绘制主题可视化图 接下来我们根据预处理后的数据进行主题可视化图的绘制。 在上述代码中我们首先设置了一些绘图参数如要展示的主题数量top_n和字体大小fontsize。然后对数据进行切片处理将不属于前top_n个主题的数据标记为 outliers异常值其余为 non_outliers非异常值。接着我们定义了一个颜色映射cmap用于为不同主题的数据点分配不同颜色。通过matplotlib的scatter函数分别绘制异常值和非异常值的数据点并根据主题进行颜色区分。最后我们计算每个主题的中心点坐标并在图上添加主题名称标注。 点击标题查阅往期内容 NLP自然语言处理—主题模型LDA案例挖掘人民网留言板文本数据 左右滑动查看更多 01 02 03 04 总结 通过以上对 20 Newsgroups 数据集运用 BERTopic 模型进行主题建模、分析以及可视化的完整过程展示我们可以看到 BERTopic 模型能够有效地从文本数据中提取出有意义的主题信息并以直观的可视化方式呈现出来。这为我们深入理解文本数据的内在结构和主题分布提供了有力的工具和方法在文本数据分析、信息检索等诸多领域具有重要的应用价值。 len(topics) 我们再次确认了主题编号列表topics的长度与数据集文本数量一致均为 18846这也验证了模型对每个文本都进行了主题分配操作。 Pytorch基于BERT 的自然语言处理模型微调及应用 自然语言处理NLP领域在 2018 年取得了突破性进展。迁移学习以及诸如 Allen AI 的 ELMO、OpenAI 的 Open - GPT 和谷歌的 BERT 等模型的出现使得研究人员能够通过极少的特定任务微调就打破多项基准测试并为 NLP 领域的其他研究者提供了预训练模型。这些预训练模型能够在数据量和计算时间要求相对较低的情况下经过微调并应用从而产生最先进的成果。然而对于许多刚涉足 NLP 领域的人员甚至一些有经验的从业者来说这些强大模型的理论和实际应用仍未被很好地理解。 本文将以 BERTBidirectional Encoder Representations from Transformers双向编码器表征来自变换器模型为例它于 2018 年末发布。我们将通过对其进行微调等操作为读者提供在 NLP 中使用迁移学习模型的更好理解和实践指导。可以利用 BERT 从文本数据中提取高质量的语言特征也可以使用自己的数据针对特定任务如分类、实体识别、问答等对其进行微调以产生最先进的预测结果。本文将详细阐述如何修改和微调 BERT 来创建一个强大的 NLP 模型使其能快速给出最先进的成果。 微调的优势 一更快的开发速度 我们在本教程中将使用 BERT 来训练一个文本分类器。具体做法是获取预训练的 BERT 模型在其末尾添加一个未训练的神经元层然后针对我们的分类任务训练这个新模型。之所以这样做而不是去训练一个专门针对特定 NLP 任务如卷积神经网络 CNN、双向长短期记忆网络 BiLSTM 等的深度学习模型原因如下 首先预训练的 BERT 模型权重已经编码了大量关于我们语言的信息。因此训练微调后的模型所花费的时间要少得多。这就好比我们已经对网络的底层进行了大量的训练现在只需要在将其输出作为分类任务的特征时对它们进行轻微的调整即可。实际上作者建议在针对特定 NLP 任务微调 BERT 时只需进行 2 - 4 个轮次的训练相比之下从头开始训练原始的 BERT 模型或长短期记忆网络 LSTM 则需要数百个 GPU 小时。 二所需数据量更少 此外同样重要的是由于预训练的权重这种方法允许我们在比从头开始构建模型所需的数据集小得多的数据集上对任务进行微调。从头开始构建 NLP 模型的一个主要缺点是为了使网络训练到合理的精度我们通常需要一个非常大的数据集这意味着需要在数据集创建上投入大量的时间和精力。通过微调 BERT我们现在能够在少得多的训练数据量的情况下使模型达到良好的性能。 三更好的结果 最后这种简单的微调过程通常是在 BERT 之上添加一个全连接层并进行几个轮次的训练已被证明对于各种各样的任务如分类、语言推理、语义相似度、问答等只需进行极少的特定任务调整就能实现最先进的结果。相比于实现那些针对特定任务表现良好但有时较为复杂晦涩的自定义架构简单地微调 BERT 被证明是一种更好或至少同等的选择。 NLP 领域的转变 这种向迁移学习的转变与几年前计算机视觉领域发生的转变类似。为计算机视觉任务创建一个良好的深度学习网络可能需要数百万个参数并且训练成本非常高。研究人员发现深度网络学习的是分层的特征表示最低层是简单的特征如边缘随着层数的增加特征逐渐变得更加复杂。因此不必每次都从头开始训练一个新网络而是可以将一个训练好的具有通用图像特征的网络的底层复制并转移到另一个具有不同任务的网络中使用。很快下载一个预训练的深度网络并针对新任务快速重新训练它或在其之上添加额外的层就成为了一种常见的做法这比从头开始训练一个网络的昂贵过程要优越得多。对于许多人来说2018 年深度预训练语言模型如 ELMO、BERT、ULMFIT、Open - GPT 等的引入标志着 NLP 领域也发生了向迁移学习的同样转变。 设置 一使用 Colab GPU 进行训练 谷歌 Colab 提供免费的 GPU 和 TPU。由于我们要训练一个大型神经网络最好利用这一资源在本例中我们将使用 GPU否则训练将会花费很长时间。 可以通过以下步骤添加 GPU进入菜单选择 “→笔记本设置→硬件加速器→GPU”。 二安装 Hugging Face 库 接下来我们要安装 Hugging Face 的transformers包它将为我们提供一个用于处理 BERT 的 PyTorch 接口。该库还包含用于其他预训练语言模型如 OpenAI 的 GPT 和 GPT - 2 的接口。我们选择 PyTorch 接口是因为它在高级 API使用方便但无法深入了解其工作原理和 TensorFlow 代码包含很多细节但当我们的目的是研究 BERT 时往往会让我们偏离主题去学习关于 TensorFlow 的知识之间取得了很好的平衡。 目前Hugging Face 库似乎是用于处理 BERT 的最广泛接受且功能强大的 PyTorch 接口。除了支持各种不同的预训练变换器模型外该库还包括针对特定任务对这些模型进行的预构建修改。例如在本教程中我们将使用.BertForSequenceClassification。 该库还包括用于标记分类、问答、下一句预测等特定任务的类。使用这些预构建的类可以简化为满足您的需求而对 BERT 进行修改的过程。 安装代码如下 !pip install transformers 加载 CoLA 数据集 一下载与解压 我们将使用语言可接受性语料库CoLA数据集进行单句分类。它是一组被标记为语法正确或不正确的句子。该数据集于 2018 年 5 月首次发布是 “GLUE 基准测试” 中的一项测试BERT 等模型正在该基准测试中竞争。 首先我们使用wget包将数据集下载到 Colab 实例的文件系统中。 !pip install wget wget安装输出示例 Collecting wgetDownloading https://files.pythonhosted.org/packages/47/6a/62e288da7bcda82b935ff0c6cfe542970f04e29c756b0e147251b2fb251f/wget-3.2.zip
Building wheels for collected packages: wgetBuilding wheel for wget (setup.py)... \[?25l\[?25hdoneCreated wheel for wget: filenamewget-3.2-cp36-none-any.whl size9681 sha256988b5f3cabb3edeed6a46e989edefbdecc1d5a591f9d38754139f994fc00be8dStored in directory: /root/.cache/pip/wheels/40/15/30/7d8f7cea2902b4db79e3fea550d7d7b85ecb27ef992b618f3f
Successfully built wget
Installing collected packages: wget
Successfully installed wget-3.2 数据集 import wget
import osprint(正在下载数据集...)# 数据集压缩文件的URL。
url https://nyu-mll.github.io/CoLA/cola\_public\_1.1.zip# 下载文件如果尚未下载
if not os.path.exists(./cola\_public\_1.1.zip):wget.download(url, ./cola\_public\_1.1.zip) 运行结果示例 正在下载数据集... 然后将数据集解压到文件系统中。您可以在左侧边栏中浏览 Colab 实例的文件系统。 # 解压数据集如果尚未解压
if not os.path.exists(./cola_public/):!unzip cola\_public\_1.1.zip 解压输出示例 Archive: cola\_public\_1.1.zipcreating: cola_public/inflating: cola_public/READMEcreating: cola_public/tokenized/inflating: cola\_public/tokenized/in\_domain_dev.tsvinflating: cola\_public/tokenized/in\_domain_train.tsvinflating: cola\_public/tokenized/out\_of\_domain\_dev.tsvcreating: cola_public/raw/inflating: cola\_public/raw/in\_domain_dev.tsvinflating: cola\_public/raw/in\_domain_train.tsvinflating: cola\_public/raw/out\_of\_domain\_dev.tsv 二解析 从文件名可以看出数据有tokenized已标记化和raw原始两种版本。 我们不能使用预标记化的版本因为为了应用预训练的 BERT我们必须使用模型提供的标记器。这是因为1模型有一个特定的、固定的词汇表2BERT 标记器有其特定的处理词汇表外单词的方式。 我们将使用 pandas 来解析 “域内” 训练集并查看它的一些属性和数据点。 import pandas as pd# 将数据集加载到pandas数据框中。
df pd.read\_csv(./cola\_public/raw/in\_domain\_train.tsv, delimiter\\t, headerNone, names\[sentence\_source, label, label\_notes, sentence\])# 报告训练句子的数量。
print(训练句子的数量{:,}\\n.format(df.shape\[0\]))# 显示数据中的10个随机行。
df.sample(10) 运行结果示例 训练句子的数量8,551 我们真正关心的两个属性是句子sentence及其标签label标签被称为 “可接受性判断”0 不可接受1 可接受。 以下是五个被标记为语法上不可接受的句子示例。请注意与情感分析等任务相比这个任务要困难得多 df.loc\[df.label 0\].sample(5)\[\[sentence, label\]\] 最后我们将训练集的句子和标签提取为 numpy ndarrays。 # 获取句子及其标签的列表。
sentences df.sentence.values
labels df.label.values 基于 BERT 模型的自然语言处理任务实践与分析 自然语言处理NLP领域近年来取得了显著进展其中BERTBidirectional Encoder Representations from Transformers模型发挥了重要作用。它通过预训练能够学习到丰富的语言知识在此基础上针对特定任务进行微调可以快速构建出高质量的模型。本文将围绕一个具体的NLP任务详细介绍如何运用BERT模型完成从数据准备到模型评估的完整流程。 数据预处理 一标记化与输入格式调整 在这部分我们要将数据集转化为适合BERT模型训练的格式。 1. BERT标记器Tokenizer 为了将文本输入给BERT模型首先需要将文本分割成标记tokens然后把这些标记映射到标记器词汇表中的索引。我们使用BERT自带的标记器以下是相关代码 from transformers import BertTokenizer# 加载BERT标记器
print(加载BERT标记器...)
tokenizer BertTokenizer.from\_pretrained(bert-base-uncased, do\_lower_caseTrue) 上述代码会下载并加载bert-base-uncased版本的BERT标记器它会将文本转换为小写形式do_lower_caseTrue。 为了查看标记器的输出效果我们可以对一个句子进行应用 # 打印原始句子
print(原始: , sentences\[0\])# 打印分割成标记后的句子
print(标记化: , tokenizer.tokenize(sentences\[0\]))# 打印映射到标记ID后的句子
print(标记ID: , tokenizer.convert\_tokens\_to_ids(tokenizer.tokenize(sentences\[0\]))) 当实际处理所有句子时我们会使用tokenize.encode函数来同时处理标记化和映射到ID这两个步骤而不是分别调用tokenize和convert_tokens_to_ids。 但在这之前我们需要了解BERT模型的一些格式要求。 2. 所需的格式调整 BERT模型对输入数据有特定的格式要求主要包括以下几点 特殊标记Special Tokens [SEP]在每个句子末尾需要添加[SEP]特殊标记。这个标记在涉及两个句子的任务中有其作用比如判断句子A中的问题答案是否能在句子B中找到。即使我们这里是单句输入任务也需要添加该标记。[CLS]对于分类任务必须在每个句子开头添加[CLS]特殊标记。这个标记具有特殊意义BERT由12个Transformer层组成每个Transformer层接收一系列标记嵌入并输出相同数量的嵌入但特征值会改变。在最后第12个Transformer层的输出中只有对应[CLS]标记的第一个嵌入会被分类器使用。 句子长度与注意力掩码Sentence Length Attention Mask数据集中的句子长度各不相同BERT模型对此有如下约束 所有句子必须被填充padding或截断truncate到一个固定长度。最大句子长度为512个标记。 “注意力掩码Attention Mask”是一个由1和0组成的数组用于指示哪些标记是填充标记哪些不是。它告诉BERT模型中的“自注意力Self-Attention”机制不要将这些[PAD]标记纳入对句子的理解中。 二标记化数据集 transformers库提供了encode函数来帮助我们完成大部分的数据解析和预处理步骤。 在对文本进行编码之前我们需要确定一个用于填充/截断的最大句子长度。以下代码会对数据集进行一次标记化操作以测量最大句子长度 max_len 0# 对每个句子进行操作
for sent in sentences:# 对文本进行标记化并添加\[CLS\]和\[SEP\]标记input\_ids tokenizer.encode(sent, add\_special_tokensTrue)# 更新最大句子长度max\_len max(max\_len, len(input_ids))print(最大句子长度: , max_len) 这里我将最大长度设置为64以防止可能出现的较长测试句子。 然后我们使用tokenizer.encode_plus函数来进行实际的标记化操作它会为我们合并多个步骤包括 分割句子成标记。添加[CLS]和[SEP]特殊标记。将标记映射到它们的ID。将所有句子填充或截断到相同长度。创建注意力掩码以明确区分真实标记和填充标记。 三训练集与验证集划分 我们将训练集划分为90%用于训练10%用于验证。以下是相关代码实现 from torch.utils.data import TensorDataset, random_split# 将训练输入组合成一个TensorDataset
dataset TensorDataset(input\_ids, attention\_masks, labels)# 创建一个90-10的训练-验证集划分
# 计算每个集合中要包含的样本数量
train_size int(0.9 * len(dataset))
val\_size len(dataset) - train\_size# 通过随机选择样本划分数据集
train\_dataset, val\_dataset random\_split(dataset, \[train\_size, val_size\])print({:5,} 训练样本.format(train_size))
print({:5,} 验证样本.format(val_size)) 我们还会使用torch的DataLoader类为数据集创建一个迭代器这样在训练过程中可以节省内存。 三、模型微调 一BertForSequenceClassification 对于我们的任务首先需要修改预训练的BERT模型以输出适合分类的结果然后在我们的数据集上继续训练该模型使其完全适用于我们的任务。 huggingface的pytorch实现提供了一系列用于各种NLP任务的接口。我们将使用BertForSequenceClassification它是在普通BERT模型基础上添加了一个用于分类的单层线性层可作为句子分类器使用。 二优化器与学习率调度器 加载模型后我们需要从存储的模型中获取训练超参数。 根据微调的目的参考[BERT论文](https://arxiv.org/pdf/1810.04805.pdf BERT论文)中的建议我们选择了以下超参数 批次大小Batch size32在创建DataLoaders时已设置学习率Learning rate2e-5训练轮数Epochs4 以下是创建AdamW优化器和学习率调度器的代码 # 注意AdamW是huggingface库中的一个类与PyTorch不同我认为W代表Weight Decay fix
optimizer AdamW(model.parameters(),lr2e-5, # args.learning_rate - 默认是5e-5我们这里设置为2e-5eps1e-8 # args.adam_epsilon - 默认是1e-8)from transformers import get\_linear\_schedule\_with\_warmup# 训练轮数。BERT作者建议在2到4之间
epochs 4# 总训练步数是\[批次数量\]×\[训练轮数\]注意这和训练样本数量不同
total\_steps len(train\_dataloader) * epochs# 创建学习率调度器
scheduler get\_linear\_schedule\_with\_warmup(optimizer,num\_warmup\_steps0, # run_glue.py中的默认值num\_training\_stepstotal_steps) 三训练循环 下面是我们的训练循环主要包括训练阶段和验证阶段。 训练阶段 解包数据输入和标签。将数据加载到GPU上以加速训练。清除上一轮计算的梯度。进行前向传播将输入数据通过网络。进行反向传播反向传播算法。使用optimizer.step()告诉网络更新参数。跟踪变量以监控训练进度。 验证阶段 解包数据输入和标签。将数据加载到GPU上以加速验证。进行前向传播将输入数据通过网络。计算验证数据上的损失并跟踪变量以监控验证进度。 训练过程 一准备工作 在开始训练之前需要进行一些准备工作包括导入必要的库等。 上述代码的作用是导入了 random 和 numpy 库并设置了随机种子值 seed_val 为 42这一步骤的目的是为了在后续的训练过程中当涉及到随机操作时如数据的随机打乱等能够保证每次运行得到相同的结果便于模型的复现和调试。 二训练阶段 接下来进入正式的训练阶段训练过程会按轮次epoch进行。 在每一轮训练epoch中首先进行训练步骤包括对每个批次的数据进行前向传播、计算损失、反向传播、更新参数等操作。同时每40个批次会输出一次训练进度信息。之后进入验证步骤将模型设置为评估模式对验证集数据进行类似的前向传播操作但不进行梯度计算以评估模型在验证集上的性能最后记录本轮次的各项训练和验证统计信息。 三训练结果总结 训练完成后可以对训练过程的结果进行总结查看 运行上述代码后可以得到一个展示各轮次训练损失、验证损失、验证准确率、训练时间和验证时间等信息的表格便于直观了解训练过程中模型性能的变化情况。 结果分析 从训练结果的表格中可以发现随着轮次的增加训练损失在逐渐下降但验证损失却呈现出上升的趋势这表明我们可能对模型的训练时间过长导致模型在训练数据上出现了过拟合现象。这里参考的数据是使用了7,695个训练样本和856个验证样本。验证损失相比于准确率是一种更精确的衡量指标因为准确率只关注预测结果是否落在阈值的某一侧而不关心具体的输出值。如果我们预测的答案是正确的但置信度较低那么验证损失能够反映出这种情况而准确率则无法体现。 为了更直观地展示训练损失和验证损失的变化趋势还可以绘制学习曲线代码如下 import matplotlib.pyplot as plt
% matplotlib inline
import seaborn as sns
# 使用seaborn的绘图样式
sns.set(styledarkgrid)
# 增大绘图尺寸和字体大小
sns.set(font_scale1.5)
plt.rcParams\[figure.figsize\] (12, 6)
# 绘制学习曲线
plt.plot(df_stats\[Training Loss\], b-o, labelTraining)
plt.plot(df_stats\[Valid. Loss\], g-o, labelValidation)
# 给图表添加标签
plt.title(Training Validation Loss)
plt.xlabel(Epoch)
plt.ylabel(Loss)
plt.legend()
plt.xticks(\[1, 2, 3, 4\])
plt.show() 通过上述代码绘制出的学习曲线如所示可以更清晰地看到训练损失和验证损失随轮次的变化情况进一步验证了模型可能存在过拟合的问题。 测试集上的性能评估 一数据准备 在对测试集进行评估之前需要先对测试数据进行准备使其格式与训练数据一致以便能够应用训练好的模型进行预测。代码首先将测试数据集加载到 pandas 数据框中然后对数据集中的每个句子进行分词、添加特殊标记、映射词ID、创建注意力掩码等操作最后将处理好的数据转换为张量并创建数据加载器以便后续进行批量预测。 二在测试集上进行预测 准备好测试数据后就可以使用微调后的模型在测试集上进行预测了 在上述代码中首先将模型设置为评估模式然后对测试数据加载器中的每个批次数据进行处理包括将数据移动到GPU上、执行前向传播计算预测值、将预测结果和真实标签移动到CPU上并进行存储等操作最终完成对整个测试集的预测。 三评估指标及结果 在CoLA基准测试中准确率是通过“马修斯相关系数”MCC来衡量的。由于数据集中的类别是不平衡的如代码中所示正样本占比为68.60%所以这里使用MCC作为评估指标更为合适。以下是计算每个批次的MCC以及最终整体MCC的代码 print(Positive samples: %d of %d (%.2f%%) % (df.label.sum(), len(df.label), (df.label.sum() / len(df.label) * 100.0)))from sklearn.metrics import matthews_corrcoef
matthews_set \[\]
# 计算每个批次的马修斯相关系数
print(Calculating Matthews Corr. Coef. for each batch...)for i in range(len(true_labels)):# 对于每个批次的预测结果选取具有最高值的标签并将其转换为0和1的列表形式pred\_labels\_i np.argmax(predictions\[i\], axis1).flatten()# 计算并存储本批次的系数matthews matthews\_corrcoef(true\_labels\[i\], pred\_labels\_i)matthews_set.append(matthews)# 创建一个柱状图展示每个批次测试样本的MCC分数
ax sns.barplot(xlist(range(len(matthews\_set))), ymatthews\_set, ciNone)
plt.title(MCC Score per Batch)
plt.ylabel(MCC Score (-1 to 1))
plt.xlabel(Batch #)
plt.show() 通过上述代码可以计算出每个批次的MCC分数并绘制出如所示的柱状图直观展示各批次之间MCC分数的变化情况。 批次结果合并与最终MCC分数计算 在完成对各个批次数据在测试集上的预测之后接下来需要对所有批次的结果进行整合处理进而计算出最终的马修斯相关系数MCC分数以此来全面评估模型在整个测试集上的性能表现。 经上述计算流程最终得到的MCC分数为0.498 。 模型性能分析与讨论 值得一提的是在未进行任何超参数调整诸如调整学习率、训练轮次、批次大小、ADAM优化器相关属性等操作的情况下仅耗费约半小时的时间我们便能够获得这样一个相对不错的分数。 然而需要注意的是为了尽可能提高模型的评估分数一种可行的策略是去除用于辅助确定训练轮次的“验证集”并直接基于整个训练集来开展训练工作。正如相关库文档在此处所记载的此基准测试的预期准确率约为.49.23。同时感兴趣的读者还可通过此处查阅官方的排行榜信息。 另外由于本实验所采用的数据集规模相对较小在不同的运行过程中模型的准确率可能会出现较为显著的波动变化情况。 研究结论 综上所述本篇论文通过相关实验及分析充分表明借助预训练的BERT模型并基于PyTorch接口开展工作无论研究者所关注的具体自然语言处理NLP任务为何均能够以极小的工作量和训练时长快速且有效地创建出一个高质量的模型。这一结论为后续相关NLP任务的开展及模型构建提供了有力的参考依据展示了预训练模型结合特定接口在实际应用中的优势与潜力。 本文中分析的数据、代码分享到会员群扫描下面二维码即可加群 资料获取 在公众号后台回复“领资料”可免费获取数据分析、机器学习、深度学习等学习资料。 点击文末“阅读原文” 获取全文完整代码数据资料。 本文选自《Pytorch用BERT对CoLA、新闻组文本数据集自然语言处理NLP主题分类建模微调可视化分析》。 点击标题查阅往期内容 Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集 自然语言处理NLP主题LDA、情感分析疫情下的新闻文本数据 R语言对NASA元数据进行文本挖掘的主题建模分析 R语言文本挖掘、情感分析和可视化哈利波特小说文本数据 Python、R对小说进行文本挖掘和层次聚类可视化分析案例 用于NLP的Python使用Keras进行深度学习文本生成 长短期记忆网络LSTM在时间序列预测和文本分类中的应用 用Rapidminer做文本挖掘的应用情感分析 R语言文本挖掘tf-idf,主题建模情感分析,n-gram建模研究 R语言对推特twitter数据进行文本情感分析 Python使用神经网络进行简单文本分类 用于NLP的Python使用Keras的多标签文本LSTM神经网络分类 R语言文本挖掘使用tf-idf分析NASA元数据的关键字 R语言NLP案例LDA主题文本挖掘优惠券推荐网站数据 Python使用神经网络进行简单文本分类 R语言自然语言处理NLP情感分析新闻文本数据 Python、R对小说进行文本挖掘和层次聚类可视化分析案例 R语言对推特twitter数据进行文本情感分析 R语言中的LDA模型对文本数据进行主题模型topic modeling分析 R语言文本主题模型之潜在语义分析LDA:Latent Dirichlet Allocation