1

Coursera で機械学習のコースを行っています。コースでは、 Datoの GraphLab を使用することが強調されています。演習の 1 つで、講師は次のように、graphlab.random_split() を使用して SFrame を分割しました。

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

最初の 1 週間のコースを終了しました。クイズでは、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)ます。

私はインストラクターに手紙を書いて、彼の返事を待っています。ありがとうございました。

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()メイン スクリプト内でトレーニング データとテスト データを実行するだけです。

一般に、過去 2 週間以内にインストラクター/メンターに 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 に答える