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

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. 下载数据

接下来,您需要将数据从云服务器下载到您的设备,并将 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 参数是要为每个字词的向量使用的维度数。根据研究确定的经验法则是,它是字词数量的四次方根。例如,如果您要使用 2000 个字词,那么从 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

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

在右侧,您会看到验证准确率数字。这些准确率通常略低于训练准确率,因为它们反映了模型如何对之前未见过的数据进行分类。它使用了我们之前留出的 10% 的测试数据。

5be7967ec70e4302

8. 导出模型

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

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

只需指定目录即可导出模型:

model.export(export_dir='/mm_spam')

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

iOS 注意事项

您刚刚导出的 .tflite 模型非常适合 Android,因为模型的相关元数据已嵌入其中,并且 Android Studio 可以读取这些元数据。

此元数据非常重要,因为它包含表示模型识别字词的词元字典。还记得之前学习过的词元成为词元,然后这些词元被赋予情感向量吗?您的移动应用需要知道这些令牌。例如,如果“狗”令牌化为 42,而您的用户键入“dog”之后,您的应用需要将“dog”42 来让模型理解它。作为 Android 开发者但 iOS 系统需要处理词汇表,因此在 iOS 设备上必须同时提供词汇表。Model Maker 可以通过指定 export_format 参数来导出该模型。因此,如需获取模型的标签和词汇表,您可以使用以下命令:

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

9. 恭喜

此 Codelab 介绍了用于构建和导出模型的 Python 代码。文件末尾会有一个 .tflite 文件。

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