这是来自Subsetting Dask DataFrames的后续问题。我希望在将 dask dataframe 中的数据分批发送到ML算法之前对其进行混洗。
该问题的答案是做以下事情:
for part in df.repartition(npartitions=100).to_delayed():
batch = part.compute()
然而,即使我要改变批次的内容,我也有点担心这可能不太理想。数据是一个时间序列集,因此数据点在每个分区内都是高度相关的。
我最理想的是:
rand_idx = np.random.choice(len(df), batch_size, replace=False)
batch = df.iloc[rand_idx, :]
哪个适用于熊猫,但不适用于dask。有什么想法吗?
我试过
train_len = int(len_df*0.8)
idx = np.random.permutation(len_df)
train_idx = idx[:train_len]
test_idx = idx[train_len:]
train_df = df.loc[train_idx]
test_df = df.loc[test_idx]
但是,如果我尝试执行train_df.loc[:5,:].compute()
,则返回124451行数据帧。所以显然使用dask错误。
答案 0 :(得分:4)
我建议在数据框中添加一列随机数据,然后使用它来设置索引:
df = df.map_partitions(add_random_column_to_pandas_dataframe, ...)
df = df.set_index('name-of-random-column')
答案 1 :(得分:2)
我最近遇到了相同的问题,并使用了pull request
中引入的dask数组和shuffle_slice提出了另一种方法它洗了整个样本
import numpy as np
from dask.array.slicing import shuffle_slice
d_arr = df.to_dask_array(True)
df_len = len(df)
np.random.seed(42)
index = np.random.choice(df_len, df_len, replace=False)
d_arr = shuffle_slice(d_arr, index)
并转换回dask数据框
df = d_arr.to_dask_dataframe(df.columns)
对我来说,它适用于大型数据集
答案 2 :(得分:1)
如果您尝试将数据框划分为培训和测试子集,sklearn.model_selection.train_test_split
就是pandas.DataFrame
,它与dask
一起使用。 (以there为例)
对于与dklearn
一起使用的情况,您可能会对库from dklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.2)
感兴趣,这似乎可以实现此功能。
为此,我们可以使用train_test_split函数,它可以反映出来 scikit-learn同名的功能。我们会阻止20%的人 行:
dklearn
更多信息here。
注意:我没有使用>>> a, b = df.random_split([0.5, 0.5])
执行任何测试,这只是我遇到的一件事,但我希望它可以提供帮助。
编辑: dask.DataFrame.random_split
怎么办?
实施例
50/50分裂
>>> a, b, c = df.random_split([0.8, 0.1, 0.1], random_state=123)
80/10/10分裂,一致的random_state
{{1}}
对ML应用程序的使用进行了说明here
答案 3 :(得分:0)
对于这里的人来说,他们实际上只是想像标题所暗示的那样对行进行洗牌:
这很昂贵
import numpy as np
random_idx = np.random.permutation(len(sd.index))
sd.assign(random_idx=random_idx)
sd = sd.set_index('x', sorted=True)