目 录CONTENT

文章目录

表格机器学习任务中使用的10种嵌入方法

Administrator
2026-01-24 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

📢 转载信息

原文链接:https://machinelearningmastery.com/10-ways-to-use-embeddings-for-tabular-ml-tasks/

原文作者:Iván Palomares Carrascosa


10 Ways to Use Embeddings for Tabular ML Tasks

10 Ways to Use Embeddings for Tabular ML Tasks
Image by Editor

引言

嵌入(Embeddings)——通常是非结构化数据(如文本)的基于向量的数值表示——主要在自然语言处理(NLP)领域得到了普及。但它们也是在其他机器学习工作流程中表示或补充表格数据的有力工具。应用不仅限于文本数据,还适用于具有高水平潜在语义特性的类别。

本文揭示了嵌入的10个有见地的用途,以在各种机器学习任务、模型或整个项目中充分利用数据。

初始设置:下面描述的10个策略中,有些将附带简短的说明性代码片段。首先提供了一个用于示例的玩具数据集,以及大多数示例所需的最基本和最常见的导入。

import pandas as pd import numpy as np # Example customer reviews' toy dataset df = pd.DataFrame({ "user_id": [101, 102, 103, 101, 104], "product": ["Phone", "Laptop", "Tablet", "Laptop", "Phone"], "category": ["Electronics", "Electronics", "Electronics", "Electronics", "Electronics"], "review": ["great battery", "fast performance", "light weight", "solid build quality", "amazing camera"], "rating": [5, 4, 4, 5, 5] })

1. 使用嵌入对分类特征进行编码

这在推荐系统等应用中非常有用。高基数分类特征(如用户ID和产品ID)最好被转换成向量表示,而不是仅作为数值处理。这种方法已被广泛应用,并显示出能有效捕获用户和产品之间语义方面和关系的能力。

这个实际示例定义了神经网络模型的一部分中的几个嵌入层,该模型接收用户和产品描述符并将其转换为嵌入。

from tensorflow.keras.layers import Input, Embedding, Flatten, Dense, Concatenate from tensorflow.keras.models import Model # Numeric and categorical user_input = Input(shape=(1,)) user_embed = Embedding(input_dim=500, output_dim=8)(user_input) user_vec = Flatten()(user_embed) prod_input = Input(shape=(1,)) prod_embed = Embedding(input_dim=50, output_dim=8)(prod_input) prod_vec = Flatten()(prod_embed) concat = Concatenate()([user_vec, prod_vec]) output = Dense(1)(concat) model = Model([user_input, prod_input], output) model.compile("adam", "mse")

2. 对文本列的词嵌入进行平均化处理

这种方法通过聚合每个文本序列内的词级嵌入,将可变长度的多个文本压缩成固定大小的嵌入。它类似于嵌入最常见的用法之一;这里的诀窍是将词级嵌入聚合为句子或文本级别的嵌入。

下面的示例使用了Gensim,它实现了流行的Word2Vec算法,将语言单位(通常是单词)转换为嵌入,并执行多个词级嵌入的聚合,以创建与每个用户评论相关联的嵌入。

from gensim.models import Word2Vec # Train embeddings on the review text sentences = df["review"].str.lower().str.split().tolist() w2v = Word2Vec(sentences, vector_size=16, min_count=1) df["review_emb"] = df["review"].apply( lambda t: np.mean([w2v.wv[w] for w in t.lower().split()], axis=0) )

3. 将嵌入聚类成元特征

将多个单独的嵌入向量垂直堆叠成一个2D NumPy数组(矩阵)是执行客户评论嵌入聚类的核心步骤,用以识别可能与评论集中主题相关的自然分组。这项技术可以捕获粗粒度的语义聚类,并产生新的、信息丰富的分类特征。

from sklearn.cluster import KMeans emb_matrix = np.vstack(df["review_emb"].values) km = KMeans(n_clusters=3, random_state=42).fit(emb_matrix) df["review_topic"] = km.labels_

4. 学习自监督表格嵌入

尽管听起来有些出乎意料,但学习结构化数据的数值向量表示——特别是在没有标签的数据集上——是一种将无监督问题转化为自监督学习问题的巧妙方法:数据本身会生成训练信号。

虽然这些方法比本文的实际范围要复杂一些,但它们通常使用以下策略之一:

  • 掩码特征预测:随机隐藏某些特征的值——类似于训练大型语言模型(LLM)的掩码语言建模——迫使模型根据其余可见特征进行预测。
  • 扰动检测:向模型展示带有某些特征值被交换或替换的噪声变体数据,并将训练目标设置为识别哪些值是“合法的”,哪些值已被更改。

5. 构建多标签分类嵌入

这是一种稳健的方法,可以防止在使用Word2Vec等嵌入算法时,由于词汇表中缺少某些类别而导致的运行时错误,同时保持嵌入的可用性。

本例使用多个标签(如“mobile”或“touch”)来表示单个类别(如“Phone”)。它通过聚合相关标签的嵌入来构建一个复合语义嵌入。与独热编码等标准分类编码相比,此方法能更准确地捕获相似性,并利用Word2Vec“知道”的知识之外的信息。

tags = { "Phone": ["mobile", "touch"], "Laptop": ["portable", "cpu"], "Tablet": [] # Added to handle the 'Tablet' product } def safe_mean_embedding(words, model, dim): vecs = [model.wv[w] for w in words if w in model.wv] return np.mean(vecs, axis=0) if vecs else np.zeros(dim) df["tag_emb"] = df["product"].apply( lambda p: safe_mean_embedding(tags[p], w2v, 16) )

6. 使用上下文嵌入处理分类特征

这种稍微复杂一些的方法首先将分类变量映射到“标准”嵌入,然后将它们通过自注意力层以产生上下文丰富的嵌入。这些动态表示可以跨数据实例(例如产品评论)变化,并捕获属性间的依赖关系以及高阶特征交互。换句话说,这使得下游模型能够根据上下文——即其他特征的值——以不同的方式解释一个类别。

7. 学习分箱数值特征的嵌入

在数据预处理中,将细粒度的数值特征(如年龄)转换为分箱(例如年龄组)是很常见的做法。这种策略会产生分箱特征的嵌入,可以捕获原始数值特征潜在的异常值或非线性结构。

在这个例子中,数值特征rating被转换为一个分箱的对应项,然后一个神经嵌入层为不同的评分范围学习一个独特的3D向量表示。

bins = pd.cut(df["rating"], bins=4, labels=False) emb_numeric = Embedding(input_dim=4, output_dim=3)(Input(shape=(1,)))

8. 融合嵌入和原始特征(交互特征)

假设您遇到了Word2Vec中未找到的标签(例如产品名称“Phone”)。这种方法将预训练的语义嵌入与原始数值特征结合到单个输入向量中。

此示例首先为分类产品名称获取一个16维嵌入表示,然后附加原始评分。对于下游建模,这有助于模型同时理解产品以及它们是如何被感知的(例如,情感)。

df["product_emb"] = df["product"].str.lower().apply( lambda p: w2v.wv[p] if p in w2v.wv else np.zeros(16) ) df["user_product_emb"] = df.apply( lambda r: np.concatenate([r["product_emb"], [r["rating"]]]), axis=1 )

9. 使用句子嵌入处理长文本

句子转换器(Sentence Transformers)将完整的文本序列(如评论)转换为捕获序列级语义的嵌入向量。通过一个小小的调整——将评论转换为向量列表——我们可以将非结构化文本转换为固定宽度的属性,这些属性可以与经典的表格列一起被模型使用。

from sentence_transformers import SentenceTransformer model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2") df["sent_emb"] = list(model.encode(df["review"].tolist()))

10. 将嵌入输入到树模型中

最后的策略是将表示学习与表格数据学习结合在一个混合融合方法中。与前一项类似,单个列中的嵌入被扩展为多个特征列。这里的重点不在于嵌入是如何创建的,而在于它们如何被使用并与下游模型(如树模型)中的其他数据一起输入。

import xgboost as xgb X = pd.concat( [pd.DataFrame(df["review_emb"].tolist()), df[["rating"]]], axis=1 ) y = df["rating"] model = xgb.XGBRegressor() model.fit(X, y)

结束语

嵌入不仅仅是NLP领域的事物。本文展示了嵌入的各种可能用途——只需很少或不需要额外的工作——可以通过释放示例之间的语义相似性、提供更丰富的交互建模以及生成紧凑、信息丰富的特征表示来加强机器学习工作流程。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区