pip install ydf tensorflow_hub tensorflow_datasets tensorflow==2.13.1 -U
import ydf # 训练模型
import tensorflow_datasets # 下载电影评论数据集
import tensorflow_hub # 下载预训练的嵌入模型
什么是预训练嵌入?¶
预训练嵌入是基于大量数据集训练的模型,当你没有很多训练数据时,它们可以用来提高模型的质量。与为特定任务训练并输出该任务预测的模型不同,预训练嵌入模型输出“嵌入”,这些是固定大小的数值向量,可作为第二个模型(例如,YDF模型)的输入特征,用来解决各种任务。预训练嵌入在将模型应用于复杂或非结构化数据时也非常有用。例如,使用图像、文本、音频或视频的预训练嵌入,你可以分别将YDF模型应用于图像、文本、音频和视频数据。
在这个笔记本中,我们将把电影评论分类为“积极”或“消极”。例如,以下评论开头为“这是一部适合雪天的周日下午观看的电影,其他的人可以继续他们自己的事务,而你则沉浸在一个大扶手椅中,放松几个小时。雪儿和尼古拉斯的精彩表演……”,这是一条积极的评论。我们的数据集包含25000条评论,但因为25000条评论不足以训练一个好的文本模型,而配置文本模型又相对复杂,所以我们将简单使用通用句子编码器的预训练嵌入。
下载数据集¶
我们从 TensorFlow Dataset 仓库下载数据集。
raw_train_ds = tensorflow_datasets.load(name="imdb_reviews", split="train")
raw_test_ds = tensorflow_datasets.load(name="imdb_reviews", split="test")
我们来看前200个字母或前3个示例:
for example in raw_train_ds.take(3):
print(f"""\
text: {example['text'].numpy()[:200]}
label: {example['label']}
=========================""")
下载嵌入表示¶
embed = tensorflow_hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
我们可以在任何文本上测试嵌入。它返回一个数字向量。虽然这些值对我们没有固有的意义,但YDF在处理它们方面非常出色。
embeddings = embed([
"The little blue dog eats a piece of ham.",
"It is raining today."]).numpy()
print(embeddings)
在数据集上应用嵌入¶
我们可以将嵌入应用于我们的数据集。由于数据集和嵌入都是使用 TensorFlow 创建的,我们将准备一个 TensorFlow 数据集,并直接将其输入到 YDF 中。YDF 原生支持 TensorFlow 数据集。
def apply_embedding(batch):
batch["text"] = embed(batch["text"])
return batch
# 批量大小(256)对YDF模型没有影响。然而,
# 使用较小的批次大小(<50)读取TensorFlow数据集可能会
# 放慢速度。使用较大的批量会增加内存使用。
train_ds = raw_train_ds.batch(256).map(apply_embedding)
test_ds = raw_test_ds.batch(256).map(apply_embedding)
让我们展示第一批示例中3个示例的嵌入的前10个维度。
for example in train_ds.take(1):
print(f"""\
text: {example['text'].numpy()[:3, :10]}
label: {example['label'].numpy()[:3]}
=========================""")
训练一个预训练的嵌入模型¶
model = ydf.GradientBoostedTreesLearner(label="label").train(train_ds)
我们可以观察到嵌入的512个维度。在“变量重要性”标签中,我们看到并不是所有的嵌入维度都同样有用。例如,特征 text.111_of_512
对模型非常有用。
model.describe()
评估模型¶
我们在测试数据集上评估模型。
model.evaluate(test_ds)
模型的准确率约为85%。对于一个在几秒钟内训练并使用默认超参数的模型来说,这个表现还不错 :)