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

Random split generates different splits if dataframe columns are reversed

我一直在玩 Databrick 笔记本,但 运行 遇到了一个奇怪的问题。逻辑是我从文件中读取 parsed_points_df ,缓存它然后从中创建一个 Dataframe 。但是,根据列顺序,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()

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

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