我正在尝试将数据帧拆分为训练并进行测试,其中训练中的行占70%,测试中的行占30%。我正在使用 scala 中的 spark.ml 中的randomSplit
函数。我不想使用种子,因为每次运行代码时都需要不同的训练和测试集。
问题在于该函数在每次运行代码时都会产生不同数量的行并进行测试。但是,当我使用种子时,不会发生此问题。
这是错误还是预期的行为?
val Array(trainData, testData) = dfForModel.randomSplit(Array(0.7, 0.3))
Number of rows in dfForModel = 1442
Outputs:
Run number 1
Number of rows in train = 1025
Number of rows in test = 417
Run number 2
Number of rows in train = 993
Number of rows in test = 449
Run number 3
Number of rows in train = 1011
Number of rows in test = 431
Run number 4
Number of rows in train = 1003
Number of rows in test = 439
Run number 5
Number of rows in train = 989
Number of rows in test = 453
我正在使用spark-scala中的count函数来计算行数,例如:dfForModel.count
。
答案 0 :(得分:1)
问题在于该函数在其中产生不同数量的行 每次运行代码时都要进行培训和测试。但是问题不 当我使用种子时会发生。
这是错误还是预期的行为?
这是正常现象,并非错误。
if you see the randomsplit code, ,即使您不提供种子,也将需要随机长MyNode *p1 = &*itr;
printf("abc = %d", p1->abc);
作为种子 。并在内部调用函数。
Utils.random.nextLong
答案 1 :(得分:0)
这也使我感到震惊。
我不认为存在错误,对于无法将数据中的元素数量划分为整数元素的情况(这不是您的情况),必须进行一些近似处理。例如,在您的情况下,数据量的除数为7和3,但是如果不是,则该函数必须近似。
我本人将数据分割并保存下来,以便针对不同的测试和度量使用相同的训练/测试数据集。