您可以使用三个不同系列的强分类算法来训练自己的文本分类模型:
- 使用 SVM(支持向量机)进行经典机器学习
- 使用 CNN(卷积神经网络)进行深度学习
- 基于转换器的算法,使用预先训练好的转换器模型:石板IBM基础模型
Watson自然语言处理库还提供了一个易于使用的集合分类器,它结合了不同的分类算法和多数投票法。
这些算法支持多标签和多类别任务以及特殊情况,如文档只属于一个类别(单标签任务)或二元分类任务。
训练分类模型需要大量 CPU 和内存。 根据训练数据的大小,环境可能不足以完成训练。 如果在培训过程中遇到笔记本内核问题,请创建一个具有更大 CPU 和内存容量的自定义笔记本环境,并使用该环境运行笔记本。 特别是对于基于变换器的算法,如果有基于 GPU 的环境,您应该使用它。 请参阅创建自己的环境模板。
主题部分:
- 训练输入数据格式
- 输入数据要求
- 非索引字
- 训练 SVM 算法
- 训练 CNN 算法
- 使用石板IBM基础模型训练转换器算法
- 使用 Hugging Face 提供的模型训练自定义变压器模型
- 训练集合模型
- 培训最佳做法
- 将模型应用于新数据
- 为你的使用案例选择正确的算法
训练输入数据格式
分类模块接受 CSV 和 JSON 格式的训练数据。
CSV 格式
CSV 文件不应包含页眉。 CSV 文件中的每一行都代表一个示例记录。 每条记录有一列或多列,其中第一列代表文本,后面的列代表与文本相关的标签。
注:
- SVM 和 CNN 算法不支持实例无标签的训练数据。 因此,如果您使用的是 SVM 算法、CNN 算法或包含其中一种算法的集合,则每行 CSV 必须至少有一个标签,即 2 列。
- 基于 BERT 和基于 Slate 的变换器算法支持每个实例都有 0、1 或多个标签的训练数据。
Example 1,label 1 Example 2,label 1,label 2
JSON 格式
训练数据以包含多个 JSON 对象的数组表示。 每个 JSON 对象代表一个训练实例,必须有一个文本字段和一个标签字段。 文本表示训练示例,标签存储与示例相关的标签(0、1 或多个标签)。
[ { "text": "Example 1", "labels": ["label 1"] }, { "text": "Example 2", "labels": ["label 1", "label 2"] }, { "text": "Example 3", "labels": [] } ]
注:
"labels": []
表示没有标签的示例。 SVM 和 CNN 算法不支持实例无标签的训练数据。 因此,如果您使用的是 SVM 算法、CNN 算法或包含其中一种算法的集合,每个 JSON 对象必须至少有一个标签。- 基于 BERT 和基于 Slate 的变换器算法支持每个实例都有 0、1 或多个标签的训练数据。
输入数据要求
对于 SVM 和 CNN 算法:
- 所需的最少独特标签数量:2
- 每个标签至少需要 5 个文本示例
基于 BERT 和基于板卡的变压器算法:
- 所需的最少独特标签数量:1
- 每个标签至少需要 5 个文本示例
CSV 或 JSON 格式的训练数据会在训练前转换为DataStream。 您也可以将数据流直接传递给分类模块的训练函数,而不是训练数据文件。
非索引字
您可以提供自己的停止词,这些停止词将在预处理过程中被移除。 Stopwords 文件的输入格式为标准格式:单个文本文件,每行一个短语。 可以以列表或标准格式文件的形式提供停止词。
停止词只能用于集合分类器。
训练 SVM 算法
SVM 是一种支持向量机分类器,可以使用嵌入或向量化块提供的任何类型的输入作为特征向量进行预测训练,例如 "USE
(通用句子编码器)嵌入和 "TF-IDF
向量化器。 它支持多类和多标签文本分类,并使用 Platt Scaling 生成置信度分数。
输入可用于配置 SVM 训练的所有选项:
help(watson_nlp.blocks.classification.svm.SVM.train)
训练 SVM 算法
从这些预处理步骤开始:
import watson_nlp from watson_nlp.toolkit.classification_utils.train_util import prepare_data_from_json from watson_nlp.blocks.classification.svm import SVM training_data_file = "train_data.json" # Load a Syntax model syntax_model = watson_nlp.load('syntax_izumo_en_stock') # Create datastream from training data train_stream = prepare_data_from_json(training_data_file, syntax_model) syntax_stream, labels_stream = train_stream[0], train_stream[1]
使用 USE 嵌入训练分类模型。 请参阅 "预训练的 USE 嵌入,包含在 ,查看可用的预训练区块列表。
# download embedding use_embedding_model = watson_nlp.load('embedding_use_en_stock') use_train_stream = use_embedding_model.stream(syntax_stream, doc_embed_style='raw_text') # NOTE: doc_embed_style can be changed to `avg_sent` as well. For more information check the documentation for Embeddings # Or the USE run function API docs use_svm_train_stream = watson_nlp.data_model.DataStream.zip(use_train_stream, labels_stream) # Train SVM using Universal Sentence Encoder (USE) training stream classification_model = SVM.train(use_svm_train_stream)
训练 CNN 算法
CNN 是一种简单的卷积网络架构,用于对短文进行多类和多标签文本分类。 它采用了GloVe嵌入技术。 GloVe嵌入将词级语义编码到一个向量空间中。 每种语言的GloVe嵌入都是在该语言的维基百科语料库中训练出来的。 有关使用GloVe嵌入的信息,请参阅GloVeEmbeddings。
输入可用于配置 CNN 训练的所有选项:
help(watson_nlp.blocks.classification.cnn.CNN.train)
训练 CNN 算法
import watson_nlp
from watson_nlp.toolkit.classification_utils.train_util import prepare_data_from_json
from watson_nlp.blocks.classification.cnn import CNN
training_data_file = "train_data.json"
# Load a Syntax model
syntax_model = watson_nlp.load('syntax_izumo_en_stock')
# Create datastream from training data
train_stream = prepare_data_from_json(training_data_file, syntax_model)
syntax_stream, labels_stream = train_stream[0], train_stream[1]
# Download GloVe embeddings
glove_embedding_model = watson_nlp.load('embedding_glove_en_stock')
# Train CNN
classification_model = CNN.train(watson_nlp.data_model.DataStream.zip(syntax_stream, labels_stream), embedding=glove_embedding_model.embedding)
使用IBMSlate 模型训练变换器算法
转换器算法使用预训练的石板IBM基础模型,可用于短文的多类和多标签文本分类。
输入 可用于配置变压器培训的所有选项:
help(watson_nlp.blocks.classification.transformer.Transformer.train)
有关可用 Slate 型号的列表,请参见本表:
模型 | 描述 |
---|---|
pretrained-model_slate.153m.distilled_many_transformer_multilingual_uncased |
通用、多用途模型 |
pretrained-model_slate.125m.finance_many_transformer_en_cased |
根据财务内容对模型进行预训练 |
pretrained-model_slate.110m.cybersecurity_many_transformer_en_uncased |
根据网络安全内容对模型进行预训练 |
pretrained-model_slate.125m.biomedical_many_transformer_en_cased |
根据生物医学内容预训练模型 |
训练变压器算法:
import watson_nlp
from watson_nlp.blocks.classification.transformer import Transformer
from watson_nlp.toolkit.classification_utils.train_util import prepare_stream_of_train_records
from watson_nlp import data_model as dm
training_data_file = "train_data.json"
# Create datastream from training data
train_data_stream = dm.DataStream.from_file(training_data_file)
train_record_data_stream = prepare_stream_of_train_records(train_data_stream)
# Load pre-trained slate model
pretrained_model_resource = watson_nlp.load('<pretrained Slate model>')
# Train model - note that Transformer uses Slatea by default
classification_model = Transformer.train(train_data_stream=train_record_data_stream,
pretrained_model_resource=pretrained_model_resource)
使用 Hugging Face 提供的模型训练自定义变压器模型
您可以使用 Hugging Face 中的预训练模型来训练基于变压器的自定义模型。
要使用拥抱脸模型,请在 "watson_nlp.blocks.classification.transformer.Transformer
的 "train
方法中指定模型名称作为 "pretrained_model_resource
参数。 转到https://huggingface.co/models复制模型名称。
要获取配置变压器培训的所有选项列表,请键入此代码:
help(watson_nlp.blocks.classification.transformer.Transformer.train)
有关如何训练变压器算法的信息,请参阅此代码示例:
import watson_nlp
from watson_nlp.blocks.classification.transformer import Transformer
from watson_nlp.toolkit.classification_utils.train_util import prepare_stream_of_train_records
from watson_nlp import data_model as dm
training_data_file = "train_data.json"
# Create datastream from training data
train_data_stream = dm.DataStream.from_file(training_data_file)
train_record_data_stream = prepare_stream_of_train_records(train_data_stream)
# Specify the name of the Hugging Face model
huggingface_model_name = 'xml-roberta-base'
# Train model
classification_model = Transformer.train(train_data_stream=train_record_data_stream,
pretrained_model_resource=huggingface_model_name)
训练集合模型
集合模型是这三种算法的加权集合:CNN、带有 TF-IDF 的 SVM 和带有 USE 的 SVM。 它使用置信度分数计算一组分类预测的加权平均值。 集合模型非常易于使用。
GenericEnsemble分类器允许用户更灵活地从 TFIDF-SVM、USE-SVM 和 CNN 这三种基本分类器中进行选择。 对于 50 到 1000 个字符的文本,结合使用 TFIDF-SVM 和 USE-SVM 分类器往往能在质量和性能之间取得良好的平衡。 在一些中型或长篇文档(500-1000 个字符以上)中,将 CNN 添加到 Ensemble 中有助于提高质量,但这通常会对运行性能产生重大影响(降低吞吐量并增加模型加载时间)。
有关配置 Ensemble 训练的所有选项,请输入
help(watson_nlp.workflows.classification.GenericEnsemble)
训练集合算法
import watson_nlp
from watson_nlp.workflows.classification.generic_ensemble import GenericEnsemble
from watson_nlp.workflows.classification.base_classifier import GloveCNN
from watson_nlp.workflows.classification.base_classifier import TFidfSvm
training_data_file = "train_data.json"
# Syntax model
syntax_model = watson_nlp.load('syntax_izumo_en_stock')
# GloVE Embedding model
glove_embedding_model = watson_nlp.load('embedding_glove_en_stock')
# Train classifier using the manually defined base classifier and manually defined weights¶
classification_model = GenericEnsemble.train(training_data_file,
syntax_model,
base_classifiers_params=[
TFidfSvm.TrainParams(syntax_model=syntax_model),
GloveCNN.TrainParams(syntax_model=syntax_model,
glove_embedding_model=glove_embedding_model,
)],
weights=[2,1])
开箱即用的预训练停滞词模型
识别停顿词的文本模型用于训练文档分类集合模型。
下表列出了预训练的定语模型和支持的语言代码(xx
代表语言代码)。 有关语言代码和相应语言的列表,请参阅语言代码。
资源类 | 模型名称 | 支持的语言 |
---|---|---|
text |
text_stopwords_classification_ensemble_xx_stock |
AR, DE, ES, EN, FR, IT, JA, KO |
培训最佳做法
对数据的质量和数量有一定的限制,以确保分类模型的训练能在合理的时间内完成,并满足各种性能标准。 现列举如下。 请注意,这些都不是硬性限制。 然而,越是偏离这些准则,模型训练失败或模型效果不理想的可能性就越大。
数据数量
- 分类模型测试过的最高类别数约为 1200 个。
- 用于分类的训练和测试数据的最佳文本大小约为 3000 个代码点。 不过,也可以处理较大的文本,但运行速度可能会慢一些。
- 训练时间会随着示例数量和标签数量的增加而增加。
- 推理时间将根据标签数量而增加。
数据质量
- 每个样本的大小(例如,每个训练样本中的短语数量)会影响质量。
- 阶级分化很重要。 换句话说,训练(和测试)数据中的类别应在语义上相互区分,以避免误分类。 由于Watson自然语言处理中的分类器算法依赖于单词嵌入,如果训练类中包含的文本示例语义重叠过多,可能会使高质量分类在计算上难以实现。 虽然可能存在更复杂的启发式方法来评估类之间的语义相似性,但您应该先对每个类中的几个示例进行简单的 "目测",以分辨它们似乎是否充分分离。
- 建议使用平衡数据进行训练。 理想情况下,训练数据中每个类别的示例数量应大致相等,否则分类器可能会偏向于训练数据中代表性较大的类别。
- 最好避免训练数据中的某些类别与其他类别相比代表性严重不足的情况。
局限性和注意事项:
- CNN 分类块的预定义序列长度为 1000 个代码点。 该限制可在列车运行时通过更改参数 "
max_phrase_len
进行配置。 该参数没有最大限制,但增加最大短语长度会影响 CPU 和内存消耗。 - SVM 模块对序列长度没有限制,因此可用于较长的文本。
将模型应用于新数据
在数据集上训练模型后,使用 "run()
方法在新数据上应用模型,就像在任何现有的预训练块上一样。
样本代码
对于集合模型:
# run Ensemble model on new text ensemble_prediction = ensemble_classification_model.run("new input text")
对于 SVM 和 CNN 模型,以 CNN 为例:
# run Syntax model first syntax_result = syntax_model.run("new input text") # run CNN model on top of syntax result cnn_prediction = cnn_classification_model.run(syntax_result)
为你的使用案例选择正确的算法
您需要选择最适合您使用情况的模型算法。
在 SVM、CNN 和 Transformers 之间做出选择时,请考虑以下几点:
基于变压器的石板
- 在要求高质量和有更多计算资源时选择。
CNN
- 选择合适的尺寸数据
- 选择GloVe嵌入是否适用于所需语言
- 在单标签和多标签之间做出选择
- CNN 可对嵌入进行微调,因此在处理未知术语或较新领域时性能更佳。
SVM
- 选择是否需要更容易和更简单的模型
- SVM 的训练和推理时间最快
- 如果数据集较小,请选择
如果选择 SVM,那么在选择 SVM 的各种实现方法时,需要考虑以下几点:
- SVM 可训练多标签分类器。
- 班级数量越多,培训时间越长。
- TF-IDF
- 如果数据集较小,即类别数量少、示例数量少、文本篇幅较短,例如包含较少短语的句子,则选择使用 SVM 进行 TF-IDF 向量化。
- 在分类模块中,TF-IDF 与 SVM 可以比其他算法更快。
- 如果没有所需语言的嵌入,则选择 TF-IDF。
- 使用:
- 如果数据集的输入文本中有一个或多个句子,则选择带 SVM 的通用句子编码器 (USE)。
- 在对单词或句子的上下文理解非常重要的数据集上,USE 可以发挥更好的作用。
集合模型将多个单独的(不同的)模型结合在一起,提供卓越的预测能力。 该模型类型的关键数据如下:
- 集合模型结合了 CNN、带有 TF-IDF 的 SVM 和带有 USE 的 SVM。
- 它是最容易使用的型号。
- 与单个算法相比,它能提供更好的性能。
- 它适用于各种数据集。 不过,大型数据集(超过 20000 个示例)的训练时间可能会比较长。
- 集合模型允许您设置权重。 这些权重决定了集合模型如何综合各个分类器的结果。 目前,权重的选择是一种启发式方法,需要通过反复试验来设定。 函数本身提供的默认权重是一个很好的探索起点。
父主题: 创建自己的模型