1

我正在 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 函数,我的答案将永远不会匹配他的答案,我也永远无法通过这个测验。我有兴趣使用的熊猫功能是:

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

4 回答 4

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]
于 2016-03-03T11:36:31.960 回答
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()在主脚本中进行训练和测试数据。

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

于 2016-08-18T15:23:00.780 回答
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)
于 2016-03-10T07:51:59.197 回答
0

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

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

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

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

希望这可以帮助!

于 2018-02-13T23:42:53.160 回答