构建垃圾评论机器学习模型

1. 准备工作

在此 Codelab 中,您将查看使用 TensorFlow 和 TensorFlow Lite Model Maker 创建的代码,以使用基于垃圾评论的数据集创建模型。Kaggle 上提供了原始数据。这些数据已收集到一个 CSV 文件中,并通过移除损坏的文本、标记、重复字词等进行了清理。让您可以更轻松地专注于模型,而不是文本。

此处提供了您要查看的代码,但我们强烈建议您参考 Google Colab 中的代码

前提条件

  • 此 Codelab 专为刚接触机器学习的有经验的开发者编写。
  • 此 Codelab 是“移动文本分类入门”开发者在线课程的一部分。如果您还没有完成之前的活动,请立即停下来先完成这些活动。

学习内容

  • 如何使用 Google Colab 安装 TensorFlow Lite Model Maker
  • 如何将数据从云服务器下载到您的设备
  • 如何使用数据加载器
  • 如何构建模型

所需条件

2. 安装 TensorFlow Lite Model Maker

打开 Colab。笔记本中的第一个单元会为您安装 TensorFLow Lite Model Maker:

!pip install -q tflite-model-maker

完成后,请移至下一个单元。

3. 导入代码

下一个单元中包含许多导入项,笔记本中的代码需要使用这些导入项:

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

系统还会检查您是否正在运行 TensorFlow 2.x,这是使用 Model Maker 的必要条件。

4. 下载数据

接下来,您需要将数据从 Cloud 服务器下载到您的设备,并将 data_file 设置为指向本地文件:

data_file = tf.keras.utils.get_file(fname='comment-spam.csv', 
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv', 
  extract=False)

Model Maker 可以通过像这样的简单 CSV 文件训练模型。您只需指定哪些列用于存放文本,哪些列用于存放标签即可。您将在本 Codelab 的后续部分中了解具体操作方法。

5. 预先学习的嵌入

通常,在使用 Model Maker 时,您无需从头开始构建模型。您可使用现有模型,然后根据需要进行自定义。

对于像本例所示的语言模型,这涉及到使用预先学习的嵌入。嵌入的概念是将字词转换为数字,向整个语料库中的每个字词都提供一个数字。嵌入是一种矢量,用于通过建立字词的“方向”来确定该字词的情感。例如,对于在垃圾评论中频繁使用的字词,最终其矢量会指向相似的方向,而对于不经常使用的字词,将指向相反的方向。

使用预先学习的嵌入时,您可以先从字词语料库(或语料集)开始,其中的字词已通过大量文本学习了情感。这样会比从零开始更快地找到解决方案。

Model Maker 提供了多种预学习的嵌入供您使用,但最简单也最快速的起步方式是使用 average_word_vec

代码如下:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

num_words 参数

您还可以指定希望模型使用的字词数量。

您可能认为“数量越多越好”,但通常适当的数量才是最好的,这一数量由每个字词的使用频率而定。如果您使用整个语料库中的每个字词,模型最终可能会尝试学习那些仅使用一次的字词并为其建立方向。您会发现,在所有文本语料库中,许多字词只使用了一到两次,通常不值得用在您的模型中,因为它们对整体情绪的影响微乎其微。您可以使用 num_words 参数,根据所需的字词数微调模型。

此处的数字越小,模型尺寸就越小,处理速度就越快,但由于识别的字词较少,准确率会较低。此处的数字越大,模型就越大,处理速度就越慢。找到最佳平衡点至关重要!

wordvec_dim 参数

wordved_dim 参数是您要用于每个字词矢量的维度数。经过研究确定的经验法则是,该参数为字词数量的四次方根。例如,如果您使用 2,000 个字词,那么 7 便是一个不错的起点。如果您更改了所用的字词数量,也可以更改此参数。

seq_len 参数

当涉及到输入值时,模型通常缺少弹性。对于语言模型而言,这意味着语言模型可以对特定静态长度的句子进行分类。分类取决于 seq_len 参数或序列长度。

将字词转换为数字(或词元)时,句子就会变为这些词元的序列。因此,您的模型将得到训练(在本示例中),以分类和识别包含 20 个词元的句子。如果句子的长度超过此数字,则会被截断。如果句子长度短于此数量,则会进行填充。您可以在用于填充的语料库中看到专用的 <PAD> 词元。

6. 使用数据加载器

您之前下载了 CSV 文件。现在,您可以使用数据加载器将其转换为模型能够识别的训练数据:

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

如果您在编辑器中打开该 CSV 文件,会看到每行只有两个值,文件的第一行文本对这些值进行了说明。通常,每个条目被视为一列。

您会看到,第一列的描述符为 commenttext,而且每行的第一个条目都是评论的文本。同样,第二列的描述符是 spam,并且您会看到每行上的第二个条目是 TrueFalse,,用于表明该文本是否被视为垃圾评论。其他属性用于设置您之前创建的 model_spec 以及分隔符(在本例中为英文逗号,因为该文件是以英文逗号分隔的)。您将使用此数据训练模型,因此 is_Training 会设置为 True

您需要保留部分数据用于测试模型。将数据拆分,其中 90% 用于训练,其余 10% 用于测试/评估。由于我们执行此操作时要确保测试数据是随机选择的,而不是数据集“底部”的 10%,因此,您可以在加载数据时使用 shuffle=True 进行随机化处理。

7. 构建模型

下一个单元是一行代码,仅用于构建模型:

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50, 
                               validation_data=test_data)

该单元格会使用 Model Maker 创建一个文本分类器模型,您需要指定要使用的训练数据(在第 4 步中设置)、模型规范(也在第 4 步中设置)以及周期数(在本例中为 50)。

机器学习的基本原则是模式匹配形式。首先,它会加载预训练的字词权重,并尝试将它们组合在一起,同时预测哪些字词组合在一起表示垃圾内容,哪些不是。第一次的权重可能接近 50:50,因为模型刚开始使用。

b94b00f0b155db3d.png

接下来,它会衡量此次结果,并运行优化代码以调整其预测,然后重试。这就是一个周期。因此,通过将周期指定为 50,它将经历该“循环”50 次。

85f1d21c0b64d654.png

到第 50 个周期时,模型报告的准确率会高得多。在本例中显示的准确率高达 99%!

右侧会显示验证准确率数据。这些指标通常会略低于训练准确率,因为它们表明模型如何对之前未“见过”的数据进行分类。它会使用我们之前预留的那 10% 的测试数据。

5be7967ec70e4302.png

8. 导出模型

训练完成后,您可以导出模型。

TensorFlow 以自己的格式训练模型,这需要转换为 TFLITE 格式,才能在移动应用中使用。Model Maker 可为您处理这种复杂性。

只需导出模型,并指定一个目录:

model.export(export_dir='/mm_spam')

在该目录中,您会看到一个 model.tflite 文件。下载、您将在下一个 Codelab 中用到它,届时您会将其添加到 Android 应用中!

iOS 注意事项

您刚刚导出的 .tflite 模型非常适合 Android,因为其中嵌入了有关模型的元数据,而 Android Studio 可以读取该元数据。

此元数据非常重要,因为它包含一个令牌字典,其中包含模型识别的字词。还记得之前您学过字词会变成词元,然后这些词元会被赋予情感向量吗?您的移动应用需要知道这些令牌。例如,如果“dog”被标记化为 42,并且用户在句子中输入“dog”,那么您的应用需要将“dog”转换为 42,以便模型能够理解。作为 Android 开发者,您可以使用“TensorFlow Lite Task Library”来简化此过程,但在 iOS 上,您需要处理词汇,因此需要提供词汇。Model Maker 可以通过指定 export_format 参数为您导出此文件。因此,如需获取模型的标签和词汇,您可以使用以下代码:

model.export(export_dir='/mm_spam/', 
             export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

9. 恭喜

此 Codelab 引导您学完了用于构建和导出模型的 Python 代码。最后,您将获得一个 .tflite 文件。

在下一个 Codelab 中,您将了解如何修改 Android 应用以使用此模型,以便开始对垃圾评论进行分类。