
表格数据特征工程的词嵌入
图片作者 | ChatGPT
引言
词嵌入——词语的密集向量表示——通过定量捕捉词语之间的语义关系,极大地彻底改变了自然语言处理(NLP)领域,这一点毋庸置疑。
像 Word2Vec 和 GloVe 这样的模型,使具有相似含义的词语拥有相似的向量表示,这既支持也揭示了词语之间的语义相似性。虽然它们的主要应用是在传统的语言处理任务中,但本教程将探讨一个不那么传统但同样强大的用例:将词嵌入应用于表格数据进行特征工程。
在传统的表格数据集中,分类特征通常通过独热编码或标签编码进行处理。然而,这些方法未能捕捉类别之间的语义相似性。例如,如果一个数据集包含一个名为 Product Category
的列,其值包括 Electronics
、Appliances
和 Gadgets
,独热编码会将其视为完全且同等地不同。如果适用,词嵌入可以将 Electronics
和 Gadgets
表示得比 Electronics
和 Furniture
更相似,这可能会根据具体情况提高模型性能。
本教程将引导您通过一个实际应用,使用预训练的词嵌入为表格数据集生成新特征。我们将重点关注一个场景:我们的表格数据中的分类列包含可以映射到现有词嵌入的描述性文本。
核心概念
在编写代码之前,让我们回顾一下核心概念
- 词嵌入: 词语在向量空间中的数值表示。含义相似的词语在这个空间中位置更接近。
- Word2Vec: 由 Google 开发的一种流行的词嵌入创建算法。它有两种主要架构:连续词袋模型(CBOW)和 Skip-gram 模型。
- GloVe(词表示的全局向量): 另一种广泛使用的词嵌入模型,它利用语料库中的全局词语共现统计数据。
- 特征工程: 将原始数据转换为更适合机器学习模型表示底层问题的特征,从而提高模型性能的过程。
我们的方法包括使用预训练的 Word2Vec 模型(例如在 Google News 上训练的模型)将分类文本条目转换为其对应的词向量。然后,这些向量成为我们表格数据的新数值特征。当分类值具有可利用的内在文本含义时,这种技术特别有用,例如我们的模拟场景,其中数据集包含分类文本,可用于确定其他产品的相似性。同样的做法可以扩展到(如果存在)产品描述文本列,从而增强相似性测量的可能性,但在这一点上,我们已经进入了更“传统”的自然语言处理领域。
实际应用:使用 Word2Vec 进行特征工程
让我们考虑一个假设的数据集,其中包含一个名为 ItemDescription
的列,其中包含描述项目的短语或单个单词。我们将使用预训练的 Word2Vec 模型将这些描述转换为数值特征。我们将为此目的模拟一个数据集。
首先,让我们导入所需的库。无需赘言,您需要在 Python 环境中安装这些库。
1 2 3 |
import pandas as pd import numpy as np from gensim.models import KeyedVectors |
现在,让我们模拟一个非常简单的表格数据集,其中包含一个分类文本列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 创建“数据”字典 data = { 'ItemID': [1, 2, 3, 4, 5, 6], 'Price': [100, 150, 200, 50, 250, 120], 'ItemDescription': ['electronics', 'gadget', 'appliance', 'tool', 'electronics', 'kitchenware'], 'Sales': [10, 15, 8, 25, 12, 18] } # 转换为 Pandas 数据框 df = pd.DataFrame(data) # 输出结果数据集 print("原始 DataFrame:") print(df) print("\n") |
接下来,我们将加载一个预训练的 Word2Vec 模型,用于将我们的文本类别转换为嵌入。
在本教程中,我们将使用一个较小的预训练模型;但是,您可能需要下载一个更大的模型,例如 GoogleNews-vectors-negative300.bin.gz
。为了演示,如果文件不存在,我们将创建一个虚拟模型。
https://code.google.com/archive/p/word2vec/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
try: # 将“GoogleNews-vectors-negative300.bin”替换为您下载的模型路径 word_vectors = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True) print("预训练的 Word2Vec 模型加载成功。") except FileNotFoundError: # 显示警告! import warnings warnings.warn("使用虚拟嵌入!请下载 GoogleNews-vectors 以获得真实结果。") # 创建虚拟模型 from gensim.models import Word2Vec sentences = [["electronics", "gadget", "appliance", "tool", "kitchenware"], ["phone", "tablet", "computer"]] dummy_model = Word2Vec(sentences, vector_size=10, min_count=1) word_vectors = dummy_model.wv print("虚拟 Word2Vec 模型已创建。") |
好的。有了上面的代码,我们要么已经加载了一个功能强大的词嵌入模型并可以使用它,要么已经为本教程的目的创建了一个非常小的虚拟嵌入模型(它在其他地方是无用的)。
现在我们创建一个函数来获取项目描述(ItemDescription
)的词嵌入,这本质上是我们的项目“类别”。请注意,我们避免使用“类别”一词来描述项目类别,以便尽可能将我们的模拟数据与“分类数据”的概念区分开来,并避免任何潜在的混淆。
1 2 3 4 5 6 7 |
def get_word_embedding(description, model): try: # 查询嵌入“模型”中与“描述”匹配的嵌入 return model[description] except KeyError: # 如果未找到单词,则返回零向量 return np.zeros(model.vector_size) |
现在是时候将该函数应用于我们的数据集的 ItemDescription
列了。
1 2 3 4 5 6 7 8 9 |
# 为词嵌入的每个维度创建新列 embedding_dim = word_vectors.vector_size embedding_columns = [f'desc_embedding_{i}' for i in range(embedding_dim)] # 将函数应用于每个描述 embeddings = df['ItemDescription'].apply(lambda x: get_word_embedding(x, word_vectors)) # 将嵌入扩展到单独的列中 embeddings_df = pd.DataFrame(embeddings.tolist(), columns=embedding_columns, index=df.index) |
有了我们新发现的嵌入特征,让我们继续将它们连接到原始 DataFrame,同时删除原始的——希望是过时的——ItemDescription
,然后打印出来查看。
1 2 3 4 |
df_engineered = pd.concat([df.drop('ItemDescription', axis=1), embeddings_df], axis=1) print("\n使用词嵌入进行特征工程后的 DataFrame:") print(df_engineered) |
总结
通过利用预训练的词嵌入,我们已将分类文本特征转换为捕获语义信息的丰富数值表示。这组新特征可以输入到机器学习模型中,从而可能提高性能,尤其是在分类值之间的关系微妙且具有文本含义的任务中。请记住,嵌入的质量在很大程度上取决于预训练模型及其训练语料库。
这项技术不仅限于产品描述。它还可以应用于任何包含描述性文本的分类列,例如 JobTitle
、CustomerFeedback
(经过适当的文本处理以提取关键字后)。关键是分类列中的文本应足够有意义,以便通过词嵌入来表示。
暂无评论。