相当于R的Python中的createDataPartition

时间:2014-10-27 12:55:58

标签: python r pandas scikit-learn

我试图在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作为我的机器学习lib和python pandas。

4 个答案:

答案 0 :(得分: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 :(得分:1)

正确的答案是sklearn.model_selection.StratifiedShuffleSplit

分层ShuffleSplit交叉验证器

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

此交叉验证对象是StratifiedKFold和ShuffleSplit的合并,返回分层的随机褶皱。折叠是通过保留每个类别的样本百分比来完成的。

注意:像ShuffleSplit策略一样,分层随机拆分并不能保证所有折痕都会有所不同,尽管对于较大的数据集来说仍然很有可能。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

>>> 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))