Python相当于R caTools随机' sample.split'

时间:2014-03-19 13:36:40

标签: r pandas random split dataframe

是否有一个Python(也许pandas)等同于R'

install.packages("caTools")
library(caTools)
set.seed(88)
split = sample.split(df$col, SplitRatio = 0.75)

将生成完全相同的值split


我目前的上下文是,例如,让Pandas数据帧完全对应于由以下内容创建的R数据帧(qualityTrainqualityTest):

# https://courses.edx.org/c4x/MITx/15.071x/asset/quality.csv
quality = read.csv("quality.csv")
set.seed(88)
split = sample.split(quality$PoorCare, SplitRatio = 0.75)
qualityTrain = subset(quality, split == TRUE)
qualityTest = subset(quality, split == FALSE)

4 个答案:

答案 0 :(得分:2)

我认为scikit-learn的train_test_split功能可能适合您(link)。

import pandas as pd
from sklearn.cross_validation import train_test_split

url = 'https://courses.edx.org/c4x/MITx/15.071x/asset/quality.csv'
quality = pd.read_csv(url)

train, test = train_test_split(quality, train_size=0.75, random_state=88)

qualityTrain = pd.DataFrame(train, columns=quality.columns)
qualityTest = pd.DataFrame(test, columns=quality.columns)

不幸的是,我没有获得与R功能相同的行。我猜它是播种,但可能是错的。

答案 1 :(得分:1)

从caTools库中分割apache server意味着保留了类分发。 Scikit-learn方法sample.split不保证(它将数据集拆分为随机序列并测试子集)。

您可以使用sklearn.cross_validation.StratifiedShuffleSplit

获得与R caTools库(关于类分布)相同的结果
train_test_split

答案 2 :(得分:0)

我知道这是一个老线程,但我发现它正在寻找任何可能的解决方案,因为对于很多在R中讲授的统计和机器学习的在线课程,如果你想使用Python,你会遇到这个问题所有类都说在R中做一个set.seed(),然后你使用类似caTools sample.split的东西,你必须得到相同的分割,否则你的结果不会相同稍后,您无法获得某些测验或运动问题的正确答案。其中一个主要问题是虽然默认情况下Python和R都使用Mercenne Twister算法进行伪随机数生成,但我发现,通过查看各自prng的随机状态,他们获胜了给定相同的种子产生相同的结果。还有一个(我忘了哪个)使用带符号的数字和另一个未签名的数字,所以看起来很难找到一个与Python一起使用的种子,它会生成与R相同的数字序列。

答案 3 :(得分:0)

上面的一个小修正,StatifiedShuffleSplit现在是sklearn.model_selection的一部分。

我在不同的numpy数组中有一些X和Y的数据。我的Y阵列中1s与0s的分布约为4.1%。如果我使用StatifiedShuffleSplit,它会在病房后的测试和训练集中保持这种分布。见下文。

full_data_Y_np.sum() / len(full_data_Y_np)
0.041006701187937859 
for train_index, test_index in sss.split(full_data_X_np, full_data_Y_np):
    X_train = full_data_X_np[train_index] 
    Y_train = full_data_Y_np[train_index] 
    X_test = full_data_X_np[test_index] 
    Y_test = full_data_Y_np[test_index] 
Y_train.sum() / len(Y_train) 
0.041013925152306355 
Y_test.sum() / len(Y_test) 
0.040989847715736043