同一用户多条记录怎么验证模型?用 GroupKFold 保持逐折用户隔离

同一用户留有多条记录时,随机按行划成多折,会让同一用户同时出现在训练与验证。若目标是预测新用户,GroupKFold 可以让每一折的用户集合互不交叉,并让每位用户轮流进入验证折。下面同时输出折内分数和用户交集检查。

同一用户留有多条记录时,随机按行划成多折,会让同一用户同时出现在训练与验证。若目标是预测新用户,GroupKFold 可以让每一折的用户集合互不交叉,并让每位用户轮流进入验证折。下面同时输出折内分数和用户交集检查。

准备环境与教学数据

以下代码已在 Windows 的 Python 3.11 独立环境运行。文中数据是人为构造或库自带的教学样本,不代表任何业务系统的效果;例子不调用在线大模型。

同一用户多条记录怎么验证模型?用 GroupKFold 保持逐折用户隔离

在空目录安装依赖,把完整代码保存为 demo.py,运行 python demo.py。使用现有 Python 环境时,先核对依赖版本。

python -m pip install numpy==2.4.6 scikit-learn==1.9.1

把用户号留在分组参数中

示例人为构造12位用户,每人3条记录。groups 保存用户编号,但 X 只放用于预测的两个数值,不把用户编号偷偷作为特征。标签由人为规则生成,只用来演示分组验证;真实任务需要先确认用户、设备或客户中的哪个实体才是必须隔离的单位。

GroupKFold 负责按组生成索引,而不保证各折标签比例完全相同。逐折计算前,应检查训练和验证两侧都有需要的类别;若用户数过少或某类只属于一个用户,就需要调整验证方案,不能继续输出看似正常的平均分。

把单次切分变成多折核对

已有的一次 GroupShuffleSplit 可以帮助留出一组用户;这里的不同任务是让每位用户在四折中的某一折作为验证对象,并记录各折模型表现。每折重新拟合一个 LogisticRegression,输出训练用户数、验证用户数和验证准确率。

代码断言每折用户集合交集为空,并把所有验证用户汇总,核对12位用户刚好各出现一次。分数差异是排查入口;若某折明显低,进一步查看用户与标签组成、输入可用性和样本量。

完整可运行代码

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GroupKFold

rng = np.random.default_rng(7)
groups = np.repeat(np.arange(12), 3)
y = np.tile([0, 1, 0], 12)
X = np.column_stack([y + rng.normal(0, 0.7, len(y)),
                     rng.normal(size=len(y))])
splitter = GroupKFold(n_splits=4)
seen_valid_groups = []
for fold, (train, valid) in enumerate(
        splitter.split(X, y, groups=groups), 1):
    train_groups = set(groups[train])
    valid_groups = set(groups[valid])
    assert train_groups.isdisjoint(valid_groups)
    assert len(set(y[train])) == 2 and len(set(y[valid])) == 2
    model = LogisticRegression(max_iter=1000).fit(X[train], y[train])
    score = accuracy_score(y[valid], model.predict(X[valid]))
    seen_valid_groups.extend(valid_groups)
    print("fold", fold, "train_users", len(train_groups),
          "valid_users", [int(v) for v in sorted(valid_groups)],
          "accuracy", round(float(score), 3))
assert sorted(seen_valid_groups) == list(range(12))
print("all_users_validated_once", len(seen_valid_groups))

运行结果与核对

下列是本文代码在上述环境的实际输出。更换运行环境时,先核对输入、代码和断言,再比较输出数值。

fold 1 train_users 9 valid_users [3, 7, 11] accuracy 1.0
fold 2 train_users 9 valid_users [2, 6, 10] accuracy 0.889
fold 3 train_users 9 valid_users [1, 5, 9] accuracy 0.667
fold 4 train_users 9 valid_users [0, 4, 8] accuracy 1.0
all_users_validated_once 12

逐折检查 valid_users 不在同折的 train_groups 中,最后的 all_users_validated_once 应为12。真实数据还要以稳定用户编号核对缺失、合并与一人多号问题,否则程序里的分组断言也可能建立在错误标识上。

适用边界

36条记录和标签全由代码人工生成,折内准确率没有业务代表性。GroupKFold 的单位是你传入的 groups;它不会处理时间先后,也不会自动解决不同用户之间共享设备或组织造成的依赖。

常见问题

用户只有3位,还能做4折吗?

不能。GroupKFold 的折数不能超过不同组的数量;即使恰好够,也要确认每折训练与验证都有能计算目标指标的类别。

参考资料

以下接口行为依据官方文档核对于 2026 年 10 月 1 日;本文的运行结果仅覆盖上述教学输入。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31748.html

赞 (0)
AI小管家的头像AI小管家
交叉验证为什么会泄漏?把缺失填补放进 Pipeline 后逐折评估
上一篇 2小时前
预测未来 7 天结果怎么切验证集?按标签结束日期剔除跨界训练样本
下一篇 2小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部