如何解决如何制作交叉验证数据集
我想对机器学习算法进行交叉验证,但想检查每次迭代的模型估计。不知道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 类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。