在 pyspark 中创建训练集和测试集时,如何跨不同组进行分层抽样? [关闭]

Posted

技术标签:

【中文标题】在 pyspark 中创建训练集和测试集时,如何跨不同组进行分层抽样? [关闭]【英文标题】:How do you do stratified sampling across different groups, when creating train and test sets, in pyspark? [closed] 【发布时间】:2018-08-01 19:50:30 【问题描述】:

我正在寻找一种解决方案,将我的数据拆分为测试集和训练集,但我希望在测试和训练中都拥有我的分类变量的所有级别。 我的变量有 200 个级别,数据是 1800 万条记录。我尝试了带有分数(0.8)的sampleBy函数,并且可以获得训练集,但由于Spark中没有索引,即使创建了一个键,使用左连接或减法也很难获得测试集放!

我想根据我的分类变量做一个groupBy 并随机抽样每个类别,如果该类别只有一个观察值,则将其放入训练集中。

是否有默认函数或库来帮助执行此操作?

【问题讨论】:

【参考方案1】:

一个相当困难的问题。

我不知道有什么内置函数可以帮助您获得此功能。使用sampleBy 然后进行减法减法即可,但正如您所说 - 会很慢。

或者,想知道你是否可以试试这个*:

    使用窗口函数,添加 row num 并将所有 rownum=1 的内容删除到一个单独的数据框中,您将在最后添加到您的训练中。

    在剩余数据上,使用randomSplit(一个dataframe函数)分为trainingtest

    将步骤 1 中分离的数据添加到训练中。

这应该会更快。

*(我以前没试过!如果你能分享一下最后的效果就太好了!)

【讨论】:

是的,这正是我所做的!只是第一步,我做了一个频率,并通过一次观察将所有级别放在一边。 randomSplit 非常快,但我不确定训练和测试中每个级别的百分比是多少。我必须检查一下,我希望它们至少接近 0.7 、 0.3! 我想这就是对随机性的信任所在!如果维护分布非常重要 - 也许值得花时间为每个类别进行一次 groupBy-and-sample 然后坚持下去。

以上是关于在 pyspark 中创建训练集和测试集时,如何跨不同组进行分层抽样? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

sklearn:绘制跨训练+测试集组合的混淆矩阵

如何在 pyspark 上创建分层拆分训练、验证和测试集?

在 pytorch 中创建数据集时如何关闭某些类?

在 bigquery 中创建数据集时,谷歌 App 引擎出错

将主数据目录拆分为训练/验证/测试集

按日期将pyspark数据集分成两个[重复]