Python中类似于R的createDataPartition函数的等效方法是什么?

4

我想在Python中复现R中的createDataPartition函数的行为。我有一个包含布尔目标变量的机器学习数据集。我想将数据集分成训练集(60%)和测试集(40%)。但是如果我完全随机地分割,我的目标变量就不能在两个集合之间得到正确分配。

在R中,我使用以下代码实现:

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

我该如何在Python中做同样的事情?
注:我正在使用scikit-learn作为我的机器学习库和Python pandas。
4个回答

3

在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

1
这个函数是否理解它应该根据目标/标签变量来拆分数据?文档中没有写明。 - poiuytrez
还不清楚:这是适当的分层抽样吗? - WestCoastProjects
@javadba 不是分层抽样,而是随机抽样。 - Noel Evans
谢谢。那么你的方法是否真正模仿了 R 的行为? - WestCoastProjects
在采样方法上,是的。 - Noel Evans
显示剩余3条评论

1
正确答案是sklearn.model_selection.StratifiedShuffleSplit。
分层随机抽样交叉验证器。
提供训练/测试索引以将数据拆分为训练/测试集。
该交叉验证对象是StratifiedKFold和ShuffleSplit的合并,返回分层随机折叠。这些折叠是通过保留每个类别的样本百分比来生成的。
注意:与ShuffleSplit策略一样,分层随机拆分不能保证所有折叠都不同,尽管对于大型数据集仍然非常可能。

0

正如评论中所提到的,所选答案未保留数据的类分布。scikit-learn文档指出,如果需要,则应使用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))

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接