我试图在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。
答案 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中没有函数可以像
答案 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))