如何向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
相关产品推荐
相关产品推荐

