如何制作交叉验证数据集

问题描述

我想对机器学习算法进行交叉验证,但想检查每次迭代的模型估计。不知道pyspark上有没有可以创建k-fold数据集的功能

我需要 k-fold 数据集来运行每个算法并输出变量估计。例如,如果是 5-fold CV,我需要准备 5 个数据集供我运行算法。

解决方法

如果您只需要拟合模型并且您使用的是 Spark ML,那么您可以使用 CrossValidator 并将 collectSubModels 设置为 true。例如:

cv = (CrossValidator()
  .setEstimator(<your_estimator>)
  .setEstimatorParamMaps(<your_param_maps>)
  .setEvaluator(<your_evaluator>)
  .setCollectSubModels(True))

cv_model = cv.fit(dataset)
models = cv_model.subModels

如果您真的想自己访问数据集,那么上述方法将不起作用。您可以自己编写一个函数,在您的数据集上循环 n_folds 次,并根据随机数选择该折叠的数据。示例如下:

import uuid
from pyspark.sql.functions import rand


def create_folds(df,n_folds,seed):
  h = 1.0 / n_folds
  rand_column_name = f"{uuid.uuid1()}_rand"
  df = df.select("*",rand(seed).alias(rand_column_name)

  result = []
  for k in range(n_folds):
    lb = k * h
    up = (k + 1) * h
    condition = (df[rand_column_name] >= lb) & (df[rand_column_name] < ub)
    train_df = df.filter(~condition).drop(rand_column_name)
    validation_df = df.filter(condition).drop(rand_column_name)
    result.append((train_df,validation_df))
  return result

datasets = create_folds(df,5,10)
# Accessing the first fold
train_df1 = datasets[0][0]
validation_df1 = datasets[0][1]

请注意,在上面的示例中,您获得的不是 5 个数据集,而是 10 个数据集。这是因为对于每个折叠,我们都在创建一个训练和验证数据集。

我的一位前同事实际上写了一篇nice blog post,内容是关于如何使用上述方法制作自己的 PySpark CrossValidator 类。