# Check initial distributions of 0's and 1's
-> data.groupBy("Survived").count().show()
Survived|count|
+--------+-----+
| 1| 342|
| 0| 549
# Taking 70% of both 0's and 1's into training set
-> train = data.sampleBy("Survived", fractions={0: 0.7, 1: 0.7}, seed=10)
# Subtracting 'train' from original 'data' to get test set
-> test = data.subtract(train)
# Checking distributions of 0's and 1's in train and test sets after the sampling
-> train.groupBy("Survived").count().show()
+--------+-----+
|Survived|count|
+--------+-----+
| 1| 239|
| 0| 399|
+--------+-----+
-> test.groupBy("Survived").count().show()
+--------+-----+
|Survived|count|
+--------+-----+
| 1| 103|
| 0| 150|
+--------+-----+
# read in data
df = spark.read.csv(file, header=True)
# split dataframes between 0s and 1s
zeros = df.filter(df["Target"]==0)
ones = df.filter(df["Target"]==1)
# split datasets into training and testing
train0, test0 = zeros.randomSplit([0.8,0.2], seed=1234)
train1, test1 = ones.randomSplit([0.8,0.2], seed=1234)
# stack datasets back together
train = train0.union(train1)
test = test0.union(test1)
6条答案
按热度按时间n7taea2i1#
我在Stratified sampling in Spark中建议的解决方案非常简单,可以将Scala转换为Python(甚至转换为Java-What's the easiest way to stratify a Spark Dataset ?)。
尽管如此,我还是会将其重写为python。让我们首先创建一个玩具
DataFrame
:如您所见,
DataFrame
包含12个元素:分发如下:
现在让我们示例:
首先,我们将设置种子:
找到分数和样本的关键:
现在我们可以检查样本的内容:
pbwdgjma2#
假设您在“数据” Dataframe 中有一个巨大的数据集,您希望使用基于“存活”目标变量的分层抽样将其拆分为训练集和测试集。
6jjcrrmo3#
在PySpark中使用“randomSplit”和“union”可以很容易地完成这一点。
xzlaal3s4#
这是基于接受的答案@eliasah和this so thread
如果你想取回一个训练和测试集,你可以使用以下功能:
创建分层的训练和测试集,其中总数的80%用于训练集
fquxozlt5#
你可以使用下面的函数。我用其他答案来合并。
d4so4syb6#
为了避免在train/test中发现的行拆分或消失,我将进一步添加VincentClaes的解决方案