交叉验证 SPARK 期间的自定义评估器

2024-01-26

我的目标是向 CrossValidator 函数(PySpark)添加基于排名的评估器

cvExplicit = CrossValidator(estimator=cvSet, numFolds=8, estimatorParamMaps=paramMap,evaluator=rnkEvaluate)

虽然我需要将评估的数据帧传递到函数中,但我不知道如何执行该部分。

class rnkEvaluate():
def __init__(self, user_col = "user", rating_col ="rating", prediction_col = "prediction"):
    print(user_col)
    print(rating_col)
    print(prediction_col)

def isLargerBetter():
    return True


def evaluate(self,predictions):
    denominator = 
    predictions.groupBy().sum(self._rating_col).collect()[0][0]
    TODO 
    rest of the calculation ...
    return numerator / denominator

不知何故,我需要在每次折叠迭代时传递预测数据帧,但我无法管理它。


我已经解决了这个问题,代码如下:

import numpy as np

from pyspark.ml.tuning import CrossValidator, CrossValidatorModel
from pyspark.sql.functions import rand

result = []
class CrossValidatorVerbose(CrossValidator):

    def writeResult(result):
        resfile = open('executions/results.txt', 'a')
        resfile.writelines("\n")
        resfile.writelines(result)
        resfile.close()

    def _fit(self, dataset):
        est = self.getOrDefault(self.estimator)
        epm = self.getOrDefault(self.estimatorParamMaps)
        numModels = len(epm)

        eva = self.getOrDefault(self.evaluator)
        metricName = eva.getMetricName()

        nFolds = self.getOrDefault(self.numFolds)
        seed = self.getOrDefault(self.seed)
        h = 1.0 / nFolds

        randCol = self.uid + "_rand"
        df = dataset.select("*", rand(seed).alias(randCol))
        metrics = [0.0] * numModels

        for i in range(nFolds):
            foldNum = i + 1
            print("Comparing models on fold %d" % foldNum)

            validateLB = i * h
            validateUB = (i + 1) * h
            condition = (df[randCol] >= validateLB) & (df[randCol] < validateUB)
            validation = df.filter(condition)
            train = df.filter(~condition)

            for j in range(numModels):
                paramMap = epm[j]
                model = est.fit(train, paramMap)

                predictions = model.transform(validation, paramMap)
                #print(predictions.show())
                metric = eva.evaluate(spark=spark, predictions=predictions)
                metrics[j] += metric

                avgSoFar = metrics[j] / foldNum

                res=("params: %s\t%s: %f\tavg: %f" % (
                    {param.name: val for (param, val) in paramMap.items()},
                    metricName, metric, avgSoFar))
                writeResult(res)
                result.append(res)
                print(res)

        if eva.isLargerBetter():
            bestIndex = np.argmax(metrics)
        else:
            bestIndex = np.argmin(metrics)

        bestParams = epm[bestIndex]
        bestModel = est.fit(dataset, bestParams)
        avgMetrics = [m / nFolds for m in metrics]
        bestAvg = avgMetrics[bestIndex]
        print("Best model:\nparams: %s\t%s: %f" % (
            {param.name: val for (param, val) in bestParams.items()},
            metricName, bestAvg))

        return self._copyValues(CrossValidatorModel(bestModel, avgMetrics))


evaluator = RankUserWeighted("user","rating","prediction")

cvImplicit = CrossValidatorVerbose(estimator=customImplicit, numFolds=8, estimatorParamMaps=paramMap
                            ,evaluator=evaluator)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

交叉验证 SPARK 期间的自定义评估器 的相关文章

随机推荐

  • 我已经注册了应用程序 ID,但仍然显示您没有适用于 iOS 应用程序的合格捆绑包 ID。在这里注册一个

    我已经注册了App ID 使用通配符和不使用通配符都有 这不是我第一次创建应用程序 ID 并将其提交到应用程序商店 但是在developer apple com上注册appID后 当我尝试在 itunesconnect apple com
  • 在Python中写入打开的文件时的分割函数[重复]

    这个问题在这里已经有答案了 所以我有一个程序 我应该在其中获取一个外部文件 用 python 打开它 然后分隔每个单词和每个标点符号 包括逗号 撇号和句号 然后我应该将该文件保存为文本中每个单词和标点符号出现时的整数位置 例如 我喜欢编码
  • 为什么 Window.Close 事件会传播?

    我遇到了一个奇怪的情况Close子窗口的事件传播到父窗口并导致其关闭 我做了一个最小的例子 如下所示 For TestWindow除了VS生成的默认WPF窗口之外什么都没有 and in App xaml cs我覆盖OnStartup事件并
  • 打包(类型擦除)随机数生成器

    C 11 std 库有几个随机数生成器 RNG 每个都实现了这个概念统一随机数生成器 http en cppreference com w cpp concept UniformRandomNumberGenerator 然后可以将它们用作
  • 简单的 Linux 信号处理

    I have a program that creates many threads and runs until either power is shutdown to the embedded computer or the user
  • FileNotFoundException 与 NoSuchFileException

    我注意到另一个 Java 异常表明该文件不存在 NoSuchFileException 我的任务是重构某个 api 该 api 从不同的方法中抛出这两种情况 而我只想使用其中一种 我应该映射吗NoSuchFileException提交至Fi
  • PHP Carbon“month()”方法生成错误的日期时间

    我刚刚偶然发现了一些非常奇怪的事情 我使用 Carbon 包来生成 DateTime 对象 我使用以下代码创建 2016 年 9 月开始的日期时间字符串 Carbon create gt month 9 如果我使用 Laravel 的 dd
  • 使用 Java 6 注释处理器获取泛型类型的限定类名

    我正在使用 JDK 6 的注释处理 API 开发一个小型代码生成器 并且一直试图获取类中字段的实际泛型类型 为了更清楚起见 假设我有一个这样的课程 MyAnnotation public class User private String
  • 如何使用加密模块使用公私钥对进行加密和解密?

    我必须使用加密模块在 Node js 中编写代码 因为除了 MIT 许可之外 我不允许使用任何模块 我需要生成一个密钥对并使用公钥加密一些消息并使用私钥解密 第一部分 即密钥对的生成已完成 我没有得到任何线索如何使用加密模式使用相同的密钥对
  • ‘1004’: “排序参考无效。”

    我正在尝试对单独的工作表中的范围进行排序 然而 我不断收到这样的消息 1004 The sort reference is not valid Make sure it s within the data you want to sort
  • Apple 推送通知中的表情符号支持

    我正在开发名为 INTERSTIZIO 的 iPhone 应用程序 在这个应用程序中 我实现了用户之间聊天等功能 在此用户可以发送文本 位置和带有表情符号的文本 如果应用程序在接收端未处于打开模式 则从后端发送生成推送并显示给接收者 我可以
  • if 和 for 循环包含在 while 循环 VBA 中

    我正在尝试编写一些代码 循环在一个列中抛出一列数据 并将其与同一工作表中另一列中的数据进行匹配 当两个数据点匹配时 相应的数据将被复制到第一个数据点旁边 最简单的表达方式是我在 while 循环内的 for Staten 内有一个 if 语
  • 用于通过电子邮件发送活动电子表格的 Google Apps 脚本

    我在网上找到了一个脚本 它可以获取当前工作表 将其复制到临时的新电子表格中 将其转换为 PDF 并通过电子邮件发送 我能够让它工作 但尝试将其设置为仅发送特定范围 尝试了一下 但无论如何我都不是一个好的编码员 或者 我也有兴趣弄清楚如何让它
  • CGIHTTPRequestHandler 在 python 中运行 php 或 python 脚本

    我正在 Windows 上编写一个简单的 python Web 服务器 它可以工作 但现在我想运行动态脚本 php 或 py 而不仅仅是 html 页面 这是我的代码 from BaseHTTPServer import HTTPServe
  • Oracle数据库连接超时设置

    如果一段时间不活动 与 Oracle 数据库的连接会被断开 这会导致错误 gt end of file on communication channel 客户端计算机上是否有任何 Oracle 设置 sqlnet ora 或某种环境变量 可
  • 绑定和连接之间有什么关系?

    我的印象是 gt gt 由 Haskell 使用 和join 数学家更喜欢 是 相等的 因为一个可以用另一个来写 import Control Monad join join x x gt gt id x gt gt f join fmap
  • 是否值得对数据库中的电子邮件地址进行加密?

    我已经在使用了加盐哈希 http www matasano com log 958 enough with the rainbow tables what you need to know about secure password sch
  • 用vb6实现多线程

    我的任务是通过连接到电脑的多个串行端口实现自动化过程 我如何使用 vb6 实现多线程 以通过附加的串行端口独立执行一些自动化任务 提前致谢 不 vb6 不支持多线程 它通过破解 winapi 在 vb5 中工作 但在 vb6 中完全被破坏
  • JSF不支持跨域验证,有解决方法吗?

    JSF 2 0 只允许您验证一个字段上的输入 例如检查它是否具有特定长度 它不允许您有一个表格 其中显示 输入城市和州 或仅输入邮政编码 你是怎么解决这个问题的 我只对涉及 JSF 验证阶段的答案感兴趣 我对将验证逻辑放入托管 Bean 不
  • 交叉验证 SPARK 期间的自定义评估器

    我的目标是向 CrossValidator 函数 PySpark 添加基于排名的评估器 cvExplicit CrossValidator estimator cvSet numFolds 8 estimatorParamMaps para