我一直在玩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()
答案 0 :(得分:0)
即使您指定了seed
,由于df.sample
的实现方式,拆分仍然可能会有所不同。您可以阅读以下blog post,深入了解其发生原因。
通常的建议是读取源数据,执行拆分,将每个数据框存储为单独的文件,然后在所有实验中始终使用这些保存的数据框。