如何让ML.NET中的K-Means聚类算法输出确定性可复现的结果
问题原因
- MLContext全局设置的seed不会自动作用于KMeans训练器,KMeans的初始质心随机选择逻辑使用独立的随机种子配置,默认是随机值,不受全局seed约束。
- KMeans默认开启多线程并行训练,并行计算的执行顺序存在随机性,也会导致最终生成的质心结果不一致。
修复步骤
你只需要修改KMeans训练器的初始化代码,显式指定固定随机种子、关闭并行优化即可,修改后的对应代码如下:
var pipeline = mlContext.Transforms .Concatenate(featuresColumnName, "Price") .Append(mlContext.Clustering.Trainers.KMeans(new KMeansTrainer.Options { FeatureColumnName = featuresColumnName, NumberOfClusters = 4, // 固定KMeans自身的随机种子 Seed = 4, // 关闭并行训练,消除并行计算带来的随机性 NumberOfThreads = 1 }));
额外注意事项
- 请确保每次运行时加载的源数据文件内容完全一致,没有修改、增减数据条目。
- 如果你在后续流程中添加了数据洗牌(Shuffle)操作,也需要为洗牌操作指定固定的seed值,避免引入额外随机性。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

