You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向TensorFlow时间序列预测任务输入分类特征与标签

TensorFlow时间序列预测分类特征处理方案

方案1:预处理阶段完成独热编码(适配现有流水线)

  • 仅用训练集的分类特征唯一值生成编码规则,避免数据泄露
  • 拆分数据集后对feature c做独热编码,示例代码:
# 提取训练集分类特征的唯一类别,生成映射
cate_classes = sorted(train_df['feature c'].unique())
class_to_idx = {c:i for i,c in enumerate(cate_classes)}
# 对三个数据集做独热编码
def encode_cate(df):
    # 独热编码
    onehot = pd.get_dummies(df['feature c'], prefix='c', categories=cate_classes, dtype=np.float32)
    # 拼接回原数据集,删除原始分类列
    res_df = pd.concat([df.drop(['feature c'], axis=1), onehot], axis=1)
    return res_df
train_df = encode_cate(train_df)
val_df = encode_cate(val_df)
test_df = encode_cate(test_df)
  • 编码完成后所有列均为数值型,可直接转换为float32数组送入timeseries_dataset_from_array,后续窗口拆分、模型训练逻辑无需修改
  • 注意:分类类型的target列需单独处理,若为分类任务需对应调整输出层结构与损失函数

方案2:模型内部集成编码层(TensorFlow推荐最佳实践)

该方案可避免预处理逻辑与模型脱节,减少训练/推理不一致的风险

  • 第一步:将feature c的字符串值映射为整数索引,仅用训练集的类别生成映射表
cate_classes = sorted(train_df['feature c'].unique())
class_to_idx = {c:i for i,c in enumerate(cate_classes)}
def convert_cate_to_idx(df):
    df['feature c'] = df['feature c'].map(class_to_idx).astype(np.float32)
    return df
train_df = convert_cate_to_idx(train_df)
val_df = convert_cate_to_idx(val_df)
test_df = convert_cate_to_idx(test_df)
  • 转换完成后可直接送入timeseries_dataset_from_array生成时间窗口数据集
  • 第二步:修改模型结构,加入分类特征编码逻辑,使用函数式API实现:
num_cate_classes = len(cate_classes)
# 输入维度为 (时间窗口长度, 特征数),此时特征数为4:timestamp、feature a、feature b、feature c的整数索引
inputs = tf.keras.Input(shape=(self.total_window_size, 4))
# 拆分数值特征与分类特征
numeric_features = inputs[:, :, 0:3]
cate_features = tf.cast(inputs[:, :, 3], tf.int32)
# 对分类特征做独热编码
onehot_cate = tf.keras.layers.CategoryEncoding(
    num_tokens=num_cate_classes, 
    output_mode='one_hot'
)(cate_features)
# 合并两类特征
merged_features = tf.concat([numeric_features, onehot_cate], axis=-1)
# 接入原有LSTM逻辑
x = tf.keras.layers.LSTM(32, return_sequences=True)(merged_features)
# 若为分类任务,需对应修改输出层,如多分类改为 Dense(num_target_classes, activation='softmax')
outputs = tf.keras.layers.Dense(units=1)(x)
lstm_model = tf.keras.Model(inputs=inputs, outputs=outputs)
  • 该方案无需提前做独热编码,所有预处理逻辑均封装在模型内部,部署时直接输入原始整数索引即可,无需额外处理

额外注意事项

当前模型输出层Dense(units=1)为回归任务设计,若你的target为分类型字段,需根据分类类型调整输出层:

  • 二分类任务:Dense(1, activation='sigmoid'),损失函数用BinaryCrossentropy
  • 多分类任务:Dense(类别数, activation='softmax'),损失函数用SparseCategoricalCrossentropy(若target为整数索引)或CategoricalCrossentropy(若target为独热编码)

内容的提问来源于stack exchange,提问作者Rafael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:27:03