【问题标题】:Dato: What's the equivalent function for graphlab.random_split() in pandas?Dato:pandas 中 graphlab.random_split() 的等效函数是什么?
【发布时间】:2016-03-03 06:27:51
【问题描述】:

我正在 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 位。如果我们愿意,讲师已经让我们选择使用 Pandas,所以我开始使用 Pandas。

我的问题是这个,导师使用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) 相同的输出。

我已经写信给导师,我正在等待他的回复,在此期间,如果有人可以帮助我,请帮忙。谢谢。

【问题讨论】:

  • 你有什么问题?
  • 我认为没有任何方法可以确定。你可以试试看会发生什么。究竟如何进行随机拆分将取决于每个库使用的随机数生成器。 Pandas 可能依赖于 numpy 的 Mersenne twister。由于 GraphLab 是专有代码,除非公司告诉你,否则你无法知道它在使用什么。你真的只需要等待你的教授对预期的指导。
  • 我参加了那门课程,我的印象是,虽然讲师没有说你必须使用 GraphLab,但如果你尝试采用开源方式,你会遇到很多不必要的麻烦(pydata 堆栈),这很烦人。最后我只是把它吸了起来,然后在 GraphLab 中做了所有事情。

标签: python pandas graphlab sframe


【解决方案1】:

最接近的等价物可能是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]

【讨论】:

  • print(*[f.head(3) for f in frames], sep='\n\n') 这行中的星号是做什么的?
  • 参数解包。
【解决方案2】:

我正在尝试使用 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()

总的来说,在过去的两周内,我向导师/导师提出了 3 次询问,但他们都被默默地忽略了。因此,事实上几乎不可能在本课程中使用替代工具,即使它另有声明。

【讨论】:

  • 我现在正在上同样的课程。在使用 graphlab 完成作业后,我尝试使用 scikit-learn 完成作业,但我对线性回归模型的 RMSE 的结果差异很大。你遇到过同样的问题吗?
  • 几周后我放弃了使用替代工具。目前我在第三门课程(分类)的中间。在整个专业化过程中,尤其是后面的课程中,即使我使用准备好的笔记本,编程作业也需要花费大量时间(而且 Graphlab 的使用实际上并没有那么重)。所以我决定在课程结束后转向开源工具。在这里,我们真正研究的是它背后的理论,而不是工具。
  • 感谢您的回复。第一周后我也放弃了使用其他工具。无论如何,我发现 GraphLab 比 sklearn 更加用户友好。感谢您对未来课程的提醒。
【解决方案3】:

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

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)

【讨论】:

    【解决方案4】:

    当您通过 Dato 库随机拆分数据时,使用某些种子 - 它总是以相同的方式拆分数据集。因此,您和讲师将在测试和训练集中得到完全相同的值。

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

    解决方案 1: 查看 coursera 课程测试详细信息。当可以使用 Pandas 时,讲师应该已经为您提供了将数据拆分为训练集和开发集的需要,因此您无需执行此操作,并且与使用具有特定种子的 dato 随机拆分相同的拆分。

    解决方案 2 您可以在课程中使用 Amazon 计算引擎,其中 ipython 笔记本与 dato 库一起上传。这里的诀窍只是为您设置 dato 的许可证。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-09
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多