我正试图在python中重现R的createDataPartition函数的行为。我有一个用于机器学习的数据集,其中包含布尔目标变量。我想把我的数据集分为训练集(60%)和测试集(40%)。
如果我完全随机地做,我的目标变量将不会在两个集合之间正确分布。
我使用在R中实现它
inTrain <- createDataPartition(y=data$repeater, p=0.6, list=F)
training <- data[inTrain,]
testing <- data[-inTrain,]
如何在Python中执行同样的操作?
附言:我使用scikit学习作为我的机器学习库和python熊猫。
在scikit学习中,您可以获得工具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)
这会将数据中断到
- 培训投入
- 评估数据的输入
- 训练数据的输出
- 评估数据的输出
分别。您还可以添加一个关键字参数:testrongize=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
正确答案是sklearn.model_selection.StratifiedShuffleSplit
分层ShuffleSplit交叉验证器
提供训练/测试索引,将数据拆分为训练/测试集。
这个交叉验证对象是StratifiedKFold和ShuffleSplit的合并,它返回分层随机折叠。通过保留每个类别的样本百分比来进行折叠。
注意:与ShuffleSplit策略一样,分层随机分割并不能保证所有折叠都会不同,尽管这对于大型数据集来说仍然很可能。
提供的答案不正确。显然,python中没有任何函数可以进行分层采样,而不是像R中的DataPartition那样进行随机采样。
如注释中所述,所选答案不会保留数据的类分布。scikit学习文档指出,如果需要,则应使用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))