如何将Keras神经网络训练好的Embedding层作为XGBoost模型的输入特征
类别Embedding与连续特征拼接方案
核心原理
你训练得到的Embedding权重数组的每一行,和之前给类别生成的映射值是一一对应的:数组第i行,就是映射值为i的类别对应的降维后特征向量。你提到的「类别数量+1」的多出来的1行,是预留的OOV(Out Of Vocabulary,训练集中未出现过的新类别)的特征向量,用来处理预测时遇到未知类别的情况。
具体实现步骤
直接用样本的类别映射值作为索引,从Embedding权重数组中取出对应向量,再和连续特征沿列方向拼接即可,对应你的示例代码的实现如下:
import numpy as np # 1. 提取训练集每个样本对应的类别Embedding向量 train_area_embeds = embeddings_output[X_train_categorical['area_mapping'].values] # 此时train_area_embeds形状为 (3000, 2),和训练集样本数一致,2为自定义的Embedding输出维度 # 2. 与连续特征拼接 X_train_xgb = np.concatenate([X_train_continuous.values, train_area_embeds], axis=1) # 拼接后X_train_xgb形状为 (3000, 2+2=4),可直接作为XGBoost的输入特征 # 验证集/测试集同理处理 val_area_embeds = embeddings_output[X_val_categorical['area_mapping'].values] X_val_xgb = np.concatenate([X_val_continuous.values, val_area_embeds], axis=1)
关于Embedding额外维度的说明
你的示例中Embedding层形状为(4, 2),各索引对应的含义如下:
- 索引0:代码中未使用(因为你的类别映射从1开始),训练过程中该向量未被更新,可直接忽略
- 索引1/2/3:分别对应训练集中出现的三个区域类别
Mercaz、Old North、Florentine - 最后一行(索引3):为OOV类别预留,遇到训练集中未出现的新类别时,直接取该向量作为Embedding特征即可
注:如果你的示例中OOV映射返回值为4,会超出Embedding输入维度范围,建议将OOV映射值修改为3,适配Embedding最后一行的索引
内容的提问来源于stack exchange,提问作者Marla
相关产品推荐
相关产品推荐

