是否有一个Python(也许pandas
)等同于R'
install.packages("caTools")
library(caTools)
set.seed(88)
split = sample.split(df$col, SplitRatio = 0.75)
将生成完全相同的值split
?
我目前的上下文是,例如,让Pandas数据帧完全对应于由以下内容创建的R数据帧(qualityTrain
,qualityTest
):
# 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)
答案 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