【问题标题】:ML.NET TrainTestSplit random seedML.NET TrainTestSplit 随机种子
【发布时间】:2019-04-18 15:08:15
【问题描述】:

我在 ML.NET 中使用 TrainTestSplit,将我的数据集重复拆分为训练集和测试集。在例如sklearn,相应的函数将一个种子作为输入,这样就有可能获得不同的拆分,但在ML.NET中重复调用TrainTestSplit似乎返回相同的拆分。是否可以更改 TrainTestSplit 使用的随机种子?

【问题讨论】:

  • 简要查看the source 似乎没有要传入的种子参数。不过,将来可能会更改为具有该功能。
  • train_test_split 还有一个参数shuffle,默认为True。如果您将其设为False,则更改random_state 将无效。您应该调查 ML 是否具有可以接受种子的改组实用程序。然后,您可以在传递 TrainTestSplit 之前使用随机打乱数据。

标签: c# train-test-split ml.net


【解决方案1】:

现在TrainTestSplit 不采用随机种子。在 ML.NET 中打开了一个错误来解决这个问题:https://github.com/dotnet/machinelearning/issues/1635

作为一种短期解决方法,我建议手动向数据视图添加一个随机列,并将其用作stratificationColumn 中的TrainTestSplit

data = new GenerateNumberTransform(mlContext,  new GenerateNumberTransform.Arguments
                {
                    Column = new[] { new GenerateNumberTransform.Column { Name = "random" } },
                    Seed = 42 // change seed to get a different split
                }, data);
(var train, var test) = mlContext.Regression.TrainTestSplit(data, stratificationColumn: "random");

此代码适用于 ML.NET 0.7,我们将在 0.8 中修复种子。

【讨论】:

  • 谢谢@Zruty。关于您的解决方法:我已经在使用分层,那么您的解决方法会起作用吗?
  • 没有。但是您可以对分层列进行哈希处理(使用不同的哈希种子),然后将结果用作分层列。
  • 在当前的 ML.NET(我使用 v1.4)中,此方法已从 mlContext.Regression.TrainTestSplit(data) 移动到 mlContext.Data.TrainTestSplit(data)
【解决方案2】:

截至今天(ML.NET v1.0),这个问题已经解决。 TrainTestSplitseed 作为输入,还支持通过设置samplingKeyColumnName 进行分层:

TrainTestSplit(IDataView data, double testFraction = 0.1, string samplingKeyColumnName = null, Nullable<int> seed = null);

【讨论】:

    猜你喜欢
    • 2021-07-28
    • 2016-08-12
    • 2016-10-07
    • 1970-01-01
    • 2014-11-21
    • 2011-04-04
    • 2014-06-01
    • 2013-05-28
    相关资源
    最近更新 更多