【问题标题】:regarding train-test split of data in spark scala关于 spark scala 中数据的训练测试拆分
【发布时间】:2020-04-09 13:42:29
【问题描述】:

我有一个像这样的 spark scala 数据框

    val df = Seq(
  (10, 12),
  (44, 14),
  (32, 25),
  (31, 24),
  (75, 25),
  (80, 20),
  (35, 55),
  (32, 25),
  (67, 72),
  (32, 21)
).toDF("x1","x2")

df.show()

+---+---+
| x1| x2|
+---+---+
| 10| 12|
| 44| 14|
| 32| 25|
| 31| 24|
| 75| 25|
| 80| 20|
| 35| 55|
| 32| 25|
| 67| 72|
| 32| 21|
+---+---+

我需要将此数据拆分为训练数据和测试数据,其中训练数据将是前 8 行 (80%),而测试数据将是最后 2 行 (20%)。

我试过,val Array(train, test) = df.randomSplit(Array(0.8, 0.2)) 但它是随机选择 8 行(而不是选择前 8 行)作为训练,其他作为测试

那么任何人都可以建议如何选择我上面提到的分区吗?

谢谢

【问题讨论】:

  • 只是出于好奇:为什么您更喜欢按顺序而不是随机拆分?
  • @ernest_k 我的实际数据集是一个时间序列数据集。在那种情况下,我不能随机拆分数据。
  • randomSplit 使用提供的权重随机拆分 RDD。至少没有办法随机拆分
  • 您可以使用手动编码进行拆分,您可以根据索引引入索引列和总行数,您可以进行百分比选择,我可以尝试一下

标签: scala apache-spark


【解决方案1】:

也许有更好的方法,但我没有想到其他方法,因为您需要订购数据。

val cnt = df.count
val testSize = (0.2 * cnt).toInt
val trainSize = cnt - testSize

val trainDf = df.sort(monotonically_increasing_id).limit(trainSize)
val testDf = df.sort(monotonically_increasing_id.desc).limit(testSize)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多