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

如何使用sklearn按writer列拆分机器学习训练测试集?

按指定列取值拆分训练集/测试集实现方法

你这个需求属于按固定分组规则拆分数据集,不需要使用sklearn中做随机拆分的train_test_split,直接基于pandas的布尔索引筛选即可,输出结果可以直接适配sklearn全流程的接口要求。

核心实现代码

假设你存储数据的DataFrame变量名为df,存储文本内容的列名为text,机器学习任务的预测标签列名为label,可以按如下逻辑拆分:

# 定义归属训练集的作者集合
train_author_set = {"Aeschylus", "Sophocles"}

# 筛选训练集:writer列取值在训练作者集合内的样本
train_data = df[df["writer"].isin(train_author_set)].reset_index(drop=True)
# 筛选测试集:writer列取值为Euripides的样本
test_data = df[df["writer"] == "Euripides"].reset_index(drop=True)

# 拆分特征、标签,格式可直接传入sklearn模型
X_train, y_train = train_data["text"], train_data["label"]
X_test, y_test = test_data["text"], test_data["label"]

注意事项

  • 这种拆分方式实现了作者维度的严格隔离,不会出现同一作者的样本同时出现在训练集、测试集的情况,能有效避免数据泄露,比随机拆分更贴合跨作者泛化性验证的需求。
  • 如果后续需要做交叉验证,不要使用默认的随机K折拆分,要使用sklearn内置的GroupKFold,传入writer列作为分组依据,保证每一折的验证集作者都未在对应训练集中出现,示例代码如下:
from sklearn.model_selection import GroupKFold

# 初始化分组5折交叉验证
gkf = GroupKFold(n_splits=5)
# 拆分时传入groups参数指定分组列
for train_idx, val_idx in gkf.split(X=df["text"], y=df["label"], groups=df["writer"]):
    X_fold_train, X_fold_val = df["text"].iloc[train_idx], df["text"].iloc[val_idx]
    y_fold_train, y_fold_val = df["label"].iloc[train_idx], df["label"].iloc[val_idx]
    # 写入单折模型训练、验证的逻辑即可
  • 筛选得到的X_train、X_test、y_train、y_test格式完全兼容sklearn的Pipeline、模型训练、评估等全流程接口,不需要额外做格式转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:12:16