📢 转载信息
原文链接:https://machinelearningmastery.com/10-ways-to-use-embeddings-for-tabular-ml-tasks/
原文作者:Iván Palomares Carrascosa
10 种用于表格机器学习任务的嵌入方法
图片来源: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. 使用嵌入对类别特征进行编码
这在推荐系统等应用中是一种有用的方法。高基数(high-cardinality)的类别特征,如用户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. 将嵌入聚类为元特征(Meta-Features)
将多个单个嵌入向量垂直堆叠成一个 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”)。它通过聚合相关标签的嵌入来构建一个复合语义嵌入。与像独热编码(one-hot)这样的标准类别编码相比,该方法能更准确地捕获相似性,并利用 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. 使用上下文嵌入(Contextual Embeddings)处理类别特征
这种稍微复杂一些的方法首先将类别变量映射到“标准”嵌入,然后将它们通过自注意力层,以生成上下文丰富的嵌入。这些动态表示可以跨数据实例(例如,产品评论)而变化,并捕获属性之间的依赖关系以及高阶特征交互。换句话说,这使得下游模型可以根据上下文——即其他特征的值——以不同的方式解释一个类别。
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+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区