表格数据特征工程中的词嵌入技术

本文探讨如何将自然语言处理中的词嵌入技术应用于表格数据的特征工程,通过Word2Vec等预训练模型将分类文本转换为蕴含语义信息的数值向量,提升机器学习模型性能。

表格数据特征工程中的词嵌入技术

引言

词嵌入(即单词的密集向量表示)通过定量捕捉单词间的语义关系,显著革新了自然语言处理(NLP)领域,这一点难以否认。像Word2Vec和GloVe这样的模型使具有相似含义的单词拥有相似的向量表示,既支持又揭示了单词间的语义相似性。虽然它们主要应用于传统语言处理任务,但本教程探索了一个非常规但强大的用例:将词嵌入应用于表格数据的特征工程。

在传统的表格数据集中,分类特征通常通过独热编码或标签编码处理。然而,这些方法无法捕捉类别间的语义相似性。例如,如果数据集包含一个产品类别列,其值为“电子产品”、“家电”和“小工具”,独热编码会将它们视为完全且同等 distinct。如果适用,词嵌入可以将“电子产品”和“小工具”表示为比“电子产品”和“家具”更相似,这可能会根据场景提升模型性能。

本教程将指导您通过实际应用,使用预训练词嵌入为表格数据集生成新特征。我们将专注于一个场景,其中表格数据中的分类列包含描述性文本,可以映射到存在嵌入的单词。

核心概念

在深入代码之前,让我们回顾核心概念:

  • 词嵌入:单词在向量空间中的数值表示。具有相似含义的单词在此空间中位置更接近。
  • Word2Vec:一种创建词嵌入的流行算法,由某机构开发。它有两种主要架构:连续词袋(CBOW)和Skip-gram。
  • GloVe(全局词向量表示):另一种广泛使用的词嵌入模型,它利用语料库中的全局词-词共现统计。
  • 特征工程:将原始数据转换为能更好地向机器学习模型表示底层问题的特征的过程,从而提升模型性能。

我们的方法涉及使用预训练的Word2Vec模型(例如在谷歌新闻上训练的模型)将分类文本条目转换为相应的词向量。这些向量随后成为表格数据的新数值特征。当分类值具有可被利用的内在文本含义时,这种技术特别有用,例如我们的模拟场景,其中数据集包含分类文本,并可用于确定其他产品的相似性。同样的方法可以扩展到,比如,产品描述文本列(如果存在),增强相似性测量的可能性,但那时我们就进入了更“传统”的自然语言处理领域。

实际应用:使用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”字典
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 DataFrame
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)

总结

通过利用预训练词嵌入,我们将一个分类文本特征转换为丰富的数值表示,捕捉了语义信息。这组新特征随后可以输入到机器学习模型中, potentially leading to improved performance, especially in tasks where the relationships between categorical values are nuanced and textual. 请记住,嵌入的质量 heavily depends on the pre-trained model and its training corpus.

这种技术不仅限于产品描述。它可以应用于任何包含描述性文本的分类列,例如JobTitle、Genre或CustomerFeedback(经过适当的文本处理以提取关键词后)。关键在于分类列中的文本应具有足够的意义,能够通过词嵌入表示。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计