基于RNN的流程挖掘事件预测:如何按CaseID拆分数组为多批次输入
核心问题说明
你当前的输入形状错误是因为没有将事件日志按CaseID拆分独立流程实例,而是把所有日志行当成了单一连续序列。流程挖掘中每个CaseID对应一个独立的业务流程实例,RNN需要将每个实例作为独立样本输入。
实现步骤
1. 特征预处理
10种Activity属于类别特征,先做标签编码转为数值类型;若需保留Timestamp特征,可额外计算每个事件与同Case下前一事件的时间间隔作为补充特征。
2. 按CaseID提取序列
按CaseID分组后,每组内按Timestamp升序排序,保证流程事件的先后顺序正确,提取每个Case对应的活动序列。
3. 序列长度统一
不同Case的流程步骤数不同,通过填充/截断操作将所有序列统一为固定长度10。
4. 维度调整
将处理好的序列调整为(样本数, 时间步, 特征数)的RNN标准输入格式,即可得到你需要的(2000,10,1)形状。
可运行代码示例
import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder from tensorflow.keras.preprocessing.sequence import pad_sequences # 加载数据集 dataset_train = pd.read_csv('minieventlog.csv') # 对10种Activity做标签编码,转为0-9的数值 le = LabelEncoder() dataset_train['Activity_encoded'] = le.fit_transform(dataset_train['Activity']) # 按CaseID分组提取有序活动序列 sequences = [] for case_id, group in dataset_train.groupby('CaseID'): # 按时间戳排序保证流程顺序正确 group_sorted = group.sort_values('Timestamp') seq = group_sorted['Activity_encoded'].values.tolist() sequences.append(seq) # 统一序列长度为10:短序列前补0,长序列截断后半部分 max_seq_len = 10 padded_sequences = pad_sequences(sequences, maxlen=max_seq_len, padding='pre', truncating='post') # 调整为RNN所需的输入形状 (2000,10,1) X_train = padded_sequences.reshape(padded_sequences.shape[0], max_seq_len, 1) # 标签构造示例:若预测下一个活动,可将每个序列的第t+1位作为第t位的标签,按需调整即可
注意事项
- 填充/截断策略可根据业务调整:若流程前序步骤更重要可选择截断后序、填充后序,反之可调整参数
padding='post'、truncating='pre' - 若需加入时间戳特征,可将同Case内相邻事件的时间间隔作为第二维特征,调整后输入形状为
(2000,10,2)即可 - 标签Y的构造需匹配预测目标:单步预测下一个活动、多步预测剩余全流程对应的标签构造逻辑不同,可按需调整。
内容的提问来源于stack exchange,提问作者Gonit
相关产品推荐
相关产品推荐

