在 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函数)分为training
和test
将步骤 1 中分离的数据添加到训练中。
这应该会更快。
*(我以前没试过!如果你能分享一下最后的效果就太好了!)
【讨论】:
是的,这正是我所做的!只是第一步,我做了一个频率,并通过一次观察将所有级别放在一边。 randomSplit 非常快,但我不确定训练和测试中每个级别的百分比是多少。我必须检查一下,我希望它们至少接近 0.7 、 0.3! 我想这就是对随机性的信任所在!如果维护分布非常重要 - 也许值得花时间为每个类别进行一次 groupBy-and-sample 然后坚持下去。以上是关于在 pyspark 中创建训练集和测试集时,如何跨不同组进行分层抽样? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章