mlr3聚类学习器是否自动拆分训练测试集 直接训练会过拟合吗
1. clust.kmeans 不会在内部自动拆分数据集
mlr3 全系列学习器的train()方法默认都只会使用传入的全部样本完成拟合,没有内置自动拆分训练/测试集的逻辑,聚类学习器和监督学习器在这一点上完全一致。你代码中传入完整的usarrests任务,kmeans 就会用全部50个样本计算得到聚类质心,没有任何内部拆分操作。
2. 当前使用方式是否会导致过拟合需要结合使用场景判断
无监督聚类的「过拟合」定义和监督学习有区别,指的是拟合得到的聚类质心过度贴合当前数据集的随机噪声,放到新的同分布数据上时聚类效果明显下降:
- 如果你只是要给当前已有数据集的所有样本划分聚类标签,不需要评估模型在新数据上的表现,那这种用法是无监督聚类的标准用法,不存在过拟合问题。
- 如果你需要评估这个kmeans模型的泛化能力,那直接在训练全集上预测得到的各类聚类评估指标(比如轮廓系数、CH指数)都会偏高,无法反映模型在新数据上的真实表现,会给你「模型效果很好」的错误判断,后续用在新数据上就会出现效果跳水,也就是变相的过拟合问题。
你提供的示例代码逻辑如下:
library(mlr3) library(mlr3cluster) task = mlr_tasks$get("usarrests") learner = mlr_learners$get("clust.kmeans") learner$train(task) preds = learner$predict(task = task)
如果需要评估泛化能力,建议手动拆分数据集后再训练和评估,示例如下:
# 按7:3比例拆分训练集和测试集 split = partition(task, ratio = 0.7) # 仅用训练集拟合模型 learner$train(task, row_ids = split$train) # 在测试集上预测,得到的指标才能反映泛化性能 preds_test = learner$predict(task, row_ids = split$test)
内容的提问来源于stack exchange,提问作者Rachan
相关产品推荐
相关产品推荐

