【问题标题】:Stratified sampling WEKA分层抽样 WEKA
【发布时间】:2022-10-13 06:47:07
【问题描述】:

如何使用分层抽样将数据集拆分为大小分别为原始数据集 70% 和 30% 的训练集和测试集,以保持这些新集中的比例类大小。我正在尝试使用 WEKA 来做到这一点。 RemoveStratifiedFolds 选项我不确定如何划分数据。在 10 处使用 numfolds 并将 folds 设置为 7 和 3 会这样吗?另外,不会有重复的值吗?

WEKA 的新手,不确定该怎么做。

【问题讨论】:

    标签: data-analysis weka sampling


    【解决方案1】:

    您将必须运行 StratifiedRemoveFolds 过滤器十次,分别生成 10 个折叠(-N 命令行选项,GUI 中的 numFolds 属性),因为您需要分别提取 10 个折叠中的每一个(-F 命令-line 选项,fold GUI 中的属性)。

    然后,您可以将其中的七个合并到您的 70% 拆分中,将其余的合并到您的 30% 拆分中。

    可以从命令行调用 weka.core.Instances 类以将两个 ARFF 文件附加到一个新文件中(输出到标准输出,使用 > 重定向到第三个文件):

    java -cp weka.jar weka.core.Instances append FILENAME1 FILENAME2 > FILENAME3
    

    如果您熟悉 Python,则可以使用 python-weka-wrapper3 库并编写这个乏味过程的脚本:

    import weka.core.jvm as jvm
    from weka.core.converters import load_any_file, save_any_file
    from weka.core.dataset import Instances
    from weka.filters import Filter
    
    jvm.start()
    
    # load data
    data = load_any_file("some/where/data.arff", class_index="last")
    
    # generate folds
    folds = []
    for i in range(10):
        remove_folds = Filter(classname="weka.filters.supervised.instance.StratifiedRemoveFolds",
                              options=["-N", "10", "-F", str(i+1)])
        remove_folds.inputformat(data)
        fold = remove_folds.filter(data)
        folds.append(fold)
    
    # combine folds
    train = Instances.template_instances(data)
    for i in range(0, 7):
        train = Instances.append_instances(train, folds[i])
    
    test = Instances.template_instances(data)
    for i in range(7, 10):
        test = Instances.append_instances(test, folds[i])
    
    # save splits
    save_any_file(train, "/some/where/train.arff")
    save_any_file(test, "/some/where/test.arff")
    
    jvm.stop()
    

    使用 Groovy 也可以实现类似的过程(您需要安装kfGroovy威卡包)。您可以在 Weka 中运行以下脚本Groovy 控制台(来自工具菜单):

    import weka.core.converters.ConverterUtils.DataSource
    import weka.core.converters.ConverterUtils.DataSink
    import weka.core.Instances
    import weka.filters.Filter
    import weka.filters.supervised.instance.StratifiedRemoveFolds
    
    // load data
    def Instances data = DataSource.read("/some/where/data.arff")
    data.setClassIndex(data.numAttributes() - 1)
    
    // generate folds
    def folds = []
    for (i in 1..10) {
      def removeFolds = new StratifiedRemoveFolds()
      removeFolds.setOptions(["-N", "10", "-F", "" + i] as String[])
      removeFolds.setInputFormat(data)
      fold = Filter.useFilter(data, removeFolds)
      folds.add(fold)
    }
    
    // combine folds
    def train = null
    for (i in 0..6) {
      if (train == null) {
        train = folds[i]
      }
      else {
        for (inst in folds[i])
          train.add(inst)
      }
    }
    
    def test = null
    for (i in 7..9) {
      if (test == null) {
        test = folds[i]
      }
      else {
        for (inst in folds[i])
          test.add(inst)
      }
    }
    
    // save splits
    DataSink.write("/some/where/train.arff", train)
    DataSink.write("/some/where/test.arff", test)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多