Dato:pandas中graphlab.random_split()的等效函数是什么?

时间:2016-03-03 06:27:51

标签: python pandas graphlab sframe

我正在Coursera上学习机器学习课程。在本课程中,我们强调我们使用来自Dato的GraphLab。在其中一个练习中,教师使用graphlab.random_split()来拆分SFrame,如下所示:

sales = graphlab.SFrame('home_data.gl/')
train_data, test_data = sales.random_split(.8,seed=0)

我已经完成了第一周的课程,测验要求我们使用GraphLab和SFrame解决问题。我尝试安装GraphLab,但是,它需要64位PC,而我的PC是32位。如果我们愿意,教练可以选择使用熊猫,所以我开始使用熊猫。

我的问题是,教师使用sales.random_split(.8,seed=0),这会给他train_data, test_data。他将使用它们进行进一步分析,他将为此得出答案。

现在,如果我不使用pandas函数,它将以完全相同的方式分割数据,我的答案将永远不会与他匹配,我永远无法通过此测验。我有兴趣使用的pandas功能是:

train_data, test_data = pandas.DataFrame.sample(frac=0.8, random_state=0)

我的问题是: pandas.DataFrame.sample(frac=0.8, random_state=0)会产生与sales.random_split(.8,seed=0)相同的输出。

我已经写信给导师了,我正在等待他的回复,与此同时,如果有人能帮助我,那么请好好的。谢谢。

4 个答案:

答案 0 :(得分:2)

最接近的等价物可能是sklearn.cross_validation.train_test_split。但是,它的行为与SFrame.random_split不同。快速检查:

from __future__ import print_function
import numpy as np
import pandas as pd
import graphlab as gl
from sklearn.cross_validation import train_test_split

df = pd.DataFrame({'a':np.arange(100), 'b':np.arange(100)[::-1]})
sf = gl.SFrame({'a':np.arange(100), 'b':np.arange(100)[::-1]})

train_pd, test_pd = train_test_split(df, test_size=0.8, random_state=0)
train_gl, test_gl = sf.random_split(0.8, seed=0)

frames = [train_pd, test_pd, train_gl, test_gl]

print(*[len(f) for f in frames], end='\n\n')
print(*[f.head(3) for f in frames], sep='\n\n')

输出:

20 80 86 14

     a   b
25  25  74
37  37  62
81  81  18

     a   b
26  26  73
86  86  13
2    2  97

+---+----+
| a | b  |
+---+----+
| 0 | 99 |
| 1 | 98 |
| 2 | 97 |
+---+----+
[3 rows x 2 columns]


+----+----+
| a  | b  |
+----+----+
| 12 | 87 |
| 15 | 84 |
| 25 | 74 |
+----+----+
[3 rows x 2 columns]

答案 1 :(得分:1)

我正在尝试使用Python3-sklearn-pandas组合完成相同的课程。对于这种情况,可以实现一个脏的变通方法:使用SFrame在单独的脚本中拆分数据,然后从主脚本中取出它:

import sframe

sf = sframe.SFrame.read_csv('../ml/home_data.csv')

train_data, test_data = sf.random_split(0.8, seed=0)

df_train = train_data.to_dataframe()
df_test = test_data.to_dataframe()

df_train.to_csv('../ml/home_train_data.csv')
df_test.to_csv('../ml/home_test_data.csv')

之后,只需在主脚本中进行pandas.read_csv()训练和测试数据。

总的来说,我在过去两周内向导师/导师做过三次询问,但是他们被默默地忽略了。因此事实上,即使是另外声明,也几乎不可能使用替代工具。

答案 2 :(得分:0)

这不是一个相同的结果,而是从概率的角度来看类似的结果

import graphlab as gl                                                                                                                                                                      
import pandas as pd
import numpy as np

seed=8
frac=0.8

df = pd.DataFrame({'a':np.arange(100), 'b':np.arange(100)[::-1]})
sf = gl.SFrame({'a':np.arange(100), 'b':np.arange(100)[::-1]})

glTrain,glTest=sf.random_split(frac,seed=seed)
pdTrain=df.sample(frac=frac,random_state=seed)
pdTest=df.loc[df.index.difference(pdTrain.index),:]

print(len(glTrain),len(glTest))
print(len(pdTrain),len(pdTest))

# there is randomness for the split itself in the SFrame
# for pandas, a similar thing can be done with

import random
random.seed(seed)
stdFactor=1./10
pdFrac=max(0.,min(1.,random.gauss(frac,frac*stdFactor)))
pdTrain=df.sample(frac=pdFrac,random_state=seed)
pdTest=df.loc[df.index.difference(pdTrain.index),:]
print(len(glTrain),len(glTest))
print(len(pdTrain),len(pdTest))

# if you loop over many splits from "random_split" and save the values you can calculate its variance and use it in "gauss" (if it is a gaussian, after all)

(74, 26)
(80, 20)
(74, 26)
(83, 17)

答案 3 :(得分:0)

当你通过Dato库随机分割数据时,使用某个种子 - 它总是以相同的方式分割数据集。因此,您和测试人员将拥有在测试和训练集中分离的完全相同的值。

如果你使用pandas来分割你的集合,你将得不到相同的结果,因此你将无法提交正确的结果。

解决方案1 ​​: 查看课程测试详细信息。当可以使用Pandas时,intructor应该已经给你已经分割数据intio train和dev sets,因此你不需要你这样做,并且你可以像使用dato随机分割某些种子一样进行相同的分割。

解决方案2 您可以将亚马逊计算引擎用于使用dato库上载ipython笔记本的课程。这里的诀窍是只为你设置dato的许可证。

希望这有帮助!