【问题标题】:Equivalent of R's createDataPartition in Python相当于 Python 中 R 的 createDataPartition
【发布时间】:2014-12-22 15:53:00
【问题描述】:

我试图在 python 中重现 R 的 createDataPartition 函数的行为。我有一个带有布尔目标变量的机器学习数据集。我想将我的数据集分成一个训练集(60%)和一个测试集(40%)。

如果我完全随机进行,我的目标变量将不会在两组之间正确分布。

我在 R 中使用:

inTrain <- createDataPartition(y=data$repeater, p=0.6, list=F)
training <- data[inTrain,]
testing <- data[-inTrain,]

如何在 Python 中做同样的事情?

PS:我使用 scikit-learn 作为我的机器学习库和 python pandas。

【问题讨论】:

    标签: python r pandas scikit-learn


    【解决方案1】:

    在 scikit-learn 中,您会获得工具 train_test_split

    from sklearn.cross_validation import train_test_split
    from sklearn import datasets
    
    # Use Age and Weight to predict a value for the food someone chooses
    X_train, X_test, y_train, y_test = train_test_split(table['Age', 'Weight'], 
                                                        table['Food Choice'], 
                                                        test_size=0.25)
    
    # Another example using the sklearn pre-loaded datasets:
    iris = datasets.load_iris()
    X_iris, y_iris = iris.data, iris.target
    X, y = X_iris[:, :2], y_iris
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    

    这会将数据分解为

    • 训练输入
    • 评估数据的输入
    • 训练数据的输出
    • 评估数据的输出

    分别。您还可以添加关键字参数:test_size=0.25 来改变用于训练和测试的数据百分比

    要拆分单个数据集,您可以使用这样的调用来获取 40% 的测试数据:

    >>> data = np.arange(700).reshape((100, 7))
    >>> training, testing = train_test_split(data, test_size=0.4)
    >>> print len(data)
    100
    >>> print len(training)
    60
    >>> print len(testing)
    40
    

    【讨论】:

    • 这个函数是否理解它应该根据目标/标签变量拆分数据?它没有写在文档的任何地方。
    • 我添加了另一个示例,您可以在其中明确选择变量和目标
    • ... 另一个将输入“数据”随机分成 2 个数组 - 60:40
    • 目前还不清楚:这是否是正确的分层抽样
    • @javadba 不,这不是分层抽样;它是随机抽样的。
    【解决方案2】:

    正确答案是sklearn.model_selection.StratifiedShuffleSplit

    分层 ShuffleSplit 交叉验证器

    提供训练/测试索引以将数据拆分为训练/测试集。

    这个交叉验证对象是 StratifiedKFold 和 ShuffleSplit 的合并,它返回分层的随机折叠。通过保留每个类的样本百分比来进行折叠。

    注意:与 ShuffleSplit 策略一样,分层随机拆分并不能保证所有折叠都不同,尽管这对于相当大的数据集仍然很有可能。

    【讨论】:

      【解决方案3】:

      提供的答案不正确。显然,python 中没有函数可以进行分层采样,而不是像 R 中的 DataPartition 那样随机采样。

      【讨论】:

        【解决方案4】:

        如 cmets 中所述,所选答案不保留数据的类别分布。 scikit-learn docs 指出如果需要,则应使用StratifiedShuffleSplit。这可以通过 train_test_split 方法通过将目标数组传递给分层选项来完成。

        >>> import numpy as np
        >>> from sklearn import datasets
        >>> from sklearn.model_selection import train_test_split
        
        >>> X, y = datasets.load_iris(return_X_y=True)
        >>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, stratify=y, random_state=42)
        
        >>> # show counts of each type after split
        >>> print(np.unique(y, return_counts=True))
        (array([0, 1, 2]), array([50, 50, 50], dtype=int64))
        >>> print(np.unique(y_test, return_counts=True))
        (array([0, 1, 2]), array([16, 17, 17], dtype=int64))
        >>> print(np.unique(y_train, return_counts=True))
        (array([0, 1, 2]), array([34, 33, 33], dtype=int64))
        

        【讨论】:

          猜你喜欢
          • 2011-06-25
          • 2012-08-25
          • 2019-07-14
          • 2012-05-27
          • 2018-06-23
          • 1970-01-01
          • 2014-10-31
          • 2017-09-10
          相关资源
          最近更新 更多