我正在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)
相同的输出。
我已经写信给导师了,我正在等待他的回复,与此同时,如果有人能帮助我,那么请好好的。谢谢。
答案 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的许可证。
希望这有帮助!