如果数据框列反转,则随机拆分会产生不同的拆分

时间:2020-09-13 23:29:53

标签: apache-spark random pyspark databricks apache-spark-mllib

我一直在玩Databrick笔记本,但遇到了一个奇怪的问题。逻辑是我从文件中读取parsed_points_df,对其进行缓存,然后从中创建数据框。但是,根据列顺序,MLlib的randomSplit()会生成不同的数据集,因此标签列的平均值也会有所不同。现在,由于平均值是可交换且可关联的,结果不应该相同吗?

我不确定是什么问题。我看过不同的博客,并尝试了不同的技术,例如缓存,重新分区,但似乎没有任何效果。

下面的代码段1和2:

代码段1

   parsed_data_df = parsed_points_df.select( parsed_points_df['labels'] - min_year, 
  'features').withColumnRenamed('(labels - 1922.0)', 'label')  //COLUMN ORDER 1

  weights = [.8, .1, .1]
  seed = 42
  parsed_train_data_df, parsed_val_data_df, parsed_test_data_df = 
  parsed_data_df.randomSplit(weights, seed=seed)
  average_train_year = (parsed_train_data_df.selectExpr('avg(label) as avg')).first()

代码段2

  parsed_data_df = parsed_points_df.select('features', parsed_points_df['labels'] -
  min_year,).withColumnRenamed('(labels - 1922.0)', 'label').  // COLUMN ORDER 2

  weights = [.8, .1, .1]
  seed = 42
  parsed_train_data_df, parsed_val_data_df, parsed_test_data_df = 
  parsed_data_df.randomSplit(weights, seed=seed)
  average_train_year = (parsed_train_data_df.selectExpr('avg(label) as avg')).first()

1 个答案:

答案 0 :(得分:0)

即使您指定了seed,由于df.sample的实现方式,拆分仍然可能会有所不同。您可以阅读以下blog post,深入了解其发生原因。

通常的建议是读取源数据,执行拆分,将每个数据框存储为单独的文件,然后在所有实验中始终使用这些保存的数据框。