【问题标题】:How to randomly split a dataset into training set, test set, and dev set in Python?如何在 Python 中将数据集随机拆分为训练集、测试集和开发集?
【发布时间】:2016-09-04 00:00:00
【问题描述】:

我有一个大型数据集,想将数据集随机分成 70% 的训练、25% 的测试和 5% 的开发。如何在 Python 中使用 scikit-learn 做到这一点?

我想知道我们是否像以下链接中的示例那样使用 sklearn.cross_validation.train_test_split(*arrays, **options) 函数来执行此操作?

http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html

【问题讨论】:

  • 我认为我们没有直接的方法或 API 来做同样的事情。但是,您可以进行双重拆分。首先使用 30% 的 train_test_split 作为测试。现在在这个新的测试数据上,再进行一次拆分,测试大小为 5%,以获得开发拆分。
  • 也许函数 random.shuffle 有帮助?接下来,您可以简单地将您的集合切成 0.7、0.95 等。

标签: python machine-learning scikit-learn


【解决方案1】:

好问题 - 可以使用 sklearn 使用两个连续拆分来完成:

import numpy as np
from sklearn.cross_validation import train_test_split

X = np.random.random((10000, 10))
y = np.random.random(10000)

test_size = 0.25
holdout_size = 0.05

X_train, X_temp, y_train, y_temp = train_test_split(X, y, 
                                     test_size = test_size + holdout_size)

X_test, X_holdout, y_test, y_holdout = train_test_split(X_temp, y_temp,
                         test_size = holdout_size / (test_size + holdout_size))

print len(X_train)   # => 7000
print len(X_test)    # => 2499
print len(X_holdout) # => 501

【讨论】:

    【解决方案2】:

    为什么不只是一个简单的 random.shuffle ?然后根据你的需要切片。

    应该是这样的:

    import random
    random.shuffle(yourTestSet) 
    

    顾名思义,Will 会随机重新排列您的样本。

    train_set, test_set, dev_set = yourTestSet[:70], yourTestSet[70:95], yourTestSet[95:]
    

    上面的代码适用于 100 个样本,根据您的需要调整数字,如果您不知道确切的大小,请使用 len()*x。

    编辑:fafnir1990 在评论中建议。

    【讨论】:

      【解决方案3】:

      你可以使用:

      from numpy.random import multinomial
      
      n_total_samples = 1000 # or whatever it is
      
      indices = np.arange(n_total_samples)
      inds_split = multinomial(n=1,
                               pvals=[0.7, 0.25, 0.05],
                               size=n_total_samples).argmax(axis=1)
      
      train_inds = indices[inds_split==0]
      test_inds  = indices[inds_split==1]
      dev_inds   = indices[inds_split==2]
      
      print len(train_inds) / float(n_total_samples) # => 0.713
      print len(test_inds) / float(n_total_samples)  # => 0.24
      print len(dev_inds) / float(n_total_samples)   # => 0.047
      

      它不如内置函数漂亮,但我相信它可以满足您的需求。

      【讨论】:

      • 代码中的哪一行表明这是随机拆分?谢谢。
      • multinomial 为每个数据样本生成一个随机指标向量。本质上,我们使用每个样本的每个随机指标向量的结果,将其索引分配到具有规定概率的训练、测试或开发集中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 2019-05-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2018-10-13
      相关资源
      最近更新 更多