如何对多索引/嵌套DataFrame使用Sklearn train_test_split适配sktime分类任务
操作步骤如下
你当前生成的df_nested就是sktime多变量时间序列分类任务所需的特征集格式,每一行对应一个独立样本(即单个SKU),每列对应一个时间序列变量(units_ordered、sessions、conversion_rate),每个单元格存储对应SKU对应变量的全量时间序列。你可以按照以下步骤生成训练测试拆分所需的X、y数据集:
- 构造标签集
y
你需要先根据分类任务的目标,为每个SKU匹配对应的分类标签,保证标签顺序和df_nested的行顺序(即SKU顺序)一一对应。示例代码如下:
import pandas as pd # 替换为你自己的SKU-标签映射规则,比如按历史销量划分畅销/平销/滞销 sku_to_label = { "A1": "high_sales", "A2": "mid_sales", # 补充其余SKU的对应标签 } y = pd.Series( [sku_to_label[sku] for sku in df_nested.index], index=df_nested.index )
- 拆分训练集和测试集
sktime提供了适配时间序列特征的拆分工具,你可以根据任务场景选择拆分逻辑:
from sktime.split import StratifiedTrainTestSplitter, temporal_train_test_split # 场景1:分类目标为对全新SKU做分类,按SKU样本做分层拆分,保证训练/测试集标签分布一致 splitter = StratifiedTrainTestSplitter(test_size=0.3, random_state=42) X_train, X_test = splitter.split_X_y(df_nested, y) y_train, y_test = y.loc[X_train.index], y.loc[X_test.index] # 场景2:分类目标为对同一SKU的未来时间段做分类,按时间维度拆分每个SKU的序列 # 取每个序列前70%的时间步为训练集,后30%为测试集 X_train, X_test = temporal_train_test_split(df_nested, test_size=0.3) # 此场景下y也需要同步按时间拆分,保证每个时间步的标签和特征对应
注意事项
- 拆分前可以用
sktime.datatypes.check_raise(df_nested, mtype="nested_univ")验证你的嵌套DataFrame格式是否符合sktime的输入要求 - 多变量分类任务默认要求所有样本的所有变量时间序列长度一致,若存在长度不一致的情况,可以先使用插值、截断等方法做统一处理
- 如果你的分类标签是按时间步给出的(即每个时间步对应一个标签,而非每个SKU对应一个标签),属于逐点时间序列分类任务,需要调整y的结构为和特征时间步长度匹配的序列格式
内容的提问来源于stack exchange,提问作者MarcBmann
相关产品推荐
相关产品推荐

