PySpark 和 MLLib:随机森林预测的类概率

2024-01-26

我正在尝试提取使用 PySpark 训练过的随机森林对象的类概率。但是,我在文档中没有看到它的示例,也不是一种方法RandomForestModel.

我怎样才能从a中提取类别概率RandomForestModelPySpark 中的分类器?

这是文档中提供的示例代码,仅提供最终类别(而不是概率):

from pyspark.mllib.tree import RandomForest
from pyspark.mllib.util import MLUtils

# Load and parse the data file into an RDD of LabeledPoint.
data = MLUtils.loadLibSVMFile(sc, 'data/mllib/sample_libsvm_data.txt')
# Split the data into training and test sets (30% held out for testing)
(trainingData, testData) = data.randomSplit([0.7, 0.3])

# Train a RandomForest model.
#  Empty categoricalFeaturesInfo indicates all features are continuous.
#  Note: Use larger numTrees in practice.
#  Setting featureSubsetStrategy="auto" lets the algorithm choose.
model = RandomForest.trainClassifier(trainingData, numClasses=2, categoricalFeaturesInfo={},
                                     numTrees=3, featureSubsetStrategy="auto",
                                     impurity='gini', maxDepth=4, maxBins=32)

# Evaluate model on test instances and compute test error
predictions = model.predict(testData.map(lambda x: x.features)) 

我没有看到任何model.predict_proba()方法——我该怎么办?


据我所知,当前版本(1.2.1)不支持这一点。原生 Scala 代码 (tree.py) 上的 Python 包装器仅定义“预测”函数,这些函数又调用相应的 Scala 对应项 (treeEnsembleModels.scala)。后者通过在二元决策中进行投票来做出决策。一个更干净的解决方案是提供一个概率预测,它可以任意阈值化或用于 ROC 计算,如 sklearn 中。未来版本应该添加此功能!

作为解决方法,我将 Predict_proba 实现为纯 Python 函数(请参见下面的示例)。它既不优雅也不高效,因为它在森林中的一组单独的决策树上运行循环。技巧(或者更确切地说是一个肮脏的黑客)是访问 Java 决策树模型数组并将它们转换为 Python 对应项。之后,您可以计算单个模型对整个数据集的预测,并使用“zip”将它们的总和累加到 RDD 中。除以树的数量即可得到所需的结果。对于大型数据集,主节点中少量决策树的循环应该是可以接受的。

由于将 Python 集成到 Spark(在 Java 中运行)中存在困难,下面的代码相当棘手。人们应该非常小心,不要将任何复杂的数据发送到工作节点,这会导致由于序列化问题而崩溃。任何引用 Spark 上下文的代码都不能在工作节点上运行。此外,引用任何 Java 代码的代码都不能被序列化。例如,在下面的代码中使用 len(trees) 而不是 ntrees 可能很诱人 - 砰!在 Java/Scala 中编写这样的包装器可以更加优雅,例如通过在工作节​​点上的决策树上运行循环,从而降低通信成本。

下面的测试函数表明,predict_proba 给出的测试误差与原始示例中使用的预测相同。

def predict_proba(rf_model, data):
   '''
   This wrapper overcomes the "binary" nature of predictions in the native
   RandomForestModel. 
   '''

    # Collect the individual decision tree models by calling the underlying
    # Java model. These are returned as JavaArray defined by py4j.
    trees = rf_model._java_model.trees()
    ntrees = rf_model.numTrees()
    scores = DecisionTreeModel(trees[0]).predict(data.map(lambda x: x.features))

    # For each decision tree, apply its prediction to the entire dataset and
    # accumulate the results using 'zip'.
    for i in range(1,ntrees):
        dtm = DecisionTreeModel(trees[i])
        scores = scores.zip(dtm.predict(data.map(lambda x: x.features)))
        scores = scores.map(lambda x: x[0] + x[1])

    # Divide the accumulated scores over the number of trees
    return scores.map(lambda x: x/ntrees)

def testError(lap):
    testErr = lap.filter(lambda (v, p): v != p).count() / float(testData.count())
    print('Test Error = ' + str(testErr))


def testClassification(trainingData, testData):

    model = RandomForest.trainClassifier(trainingData, numClasses=2,
                                         categoricalFeaturesInfo={},
                                         numTrees=50, maxDepth=30)

    # Compute test error by thresholding probabilistic predictions
    threshold = 0.5
    scores = predict_proba(model,testData)
    pred = scores.map(lambda x: 0 if x < threshold else 1)
    lab_pred = testData.map(lambda lp: lp.label).zip(pred)
    testError(lab_pred)

    # Compute test error by comparing binary predictions
    predictions = model.predict(testData.map(lambda x: x.features))
    labelsAndPredictions = testData.map(lambda lp: lp.label).zip(predictions)
    testError(labelsAndPredictions)

总而言之,这是学习 Spark 的一次很好的练习!

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

PySpark 和 MLLib:随机森林预测的类概率 的相关文章

随机推荐

  • (xs : Vect n elem) -> Vect (n * 2) elem

    这本书使用 Idris 进行类型驱动开发 https www manning com books type driven development with idris提出这个练习 定义一个适合签名的可能方法 two xs Vect n el
  • 如何在没有嵌入式 tomcat 的情况下启动 Spring Boot 应用程序?

    我有一个使用 jhipster 生成的 Spring Boot 应用程序 它工作正常 但是 我还需要为一些后台批处理作业创建第二个应用程序 并且该应用程序使用第一个应用程序的大部分 Spring 服务 我所做的是创建第二个主类 它启动一个
  • 在 Visual Studio 中使用 Catch2 进行单元测试的最佳实践

    我是 C 单元测试的新手 想获得一些关于这方面的建议 我使用 Visual Studio 2019 进行开发 选择 Catch2 作为我的测试库 我还安装了 Catch2 的测试适配器 我在 GitHub 上阅读了 Catch2 和 Cat
  • 在 Cordova ios 4.0.0+ 中使用 Stripe Checkout

    我一直在尝试让 Stripe checkout 与 Cordova iOs 4 2 0 一起使用 但没有成功 适用的最后一个 Cordova iOs 版本是 3 9 2 为了测试 我制作了一个空的 hello world cordova 应
  • Google API:“invalid_grant”,但代码没有改变

    我在 Google API 身份验证方面遇到以下问题 PHP 致命错误 未捕获异常 Google Auth Exception 消息 刷新 OAuth2 令牌时出错 消息 错误 无效授权 在 home bot bot vendor goog
  • 混合 PCM 音频样本

    我有一个关于混合多个 PCM 样本的简单问题 我读到混合多个音频 PCM 样本的最佳方法是取每帧样本的平均值 因此 如果我在除以 5 之前将 5 个 16 位样本相加 显然很有可能它的值会大于 16 位 Short 所能容纳的值 因此 当将
  • 路由在 kubernetes 中无法使用 calico 工作

    I have kubernetes v1 6 0 由 kubeadm v1 6 1 设置 官方设置的 calicoyaml http docs projectcalico org v2 1 getting started kubernete
  • 如何在没有“未经检查”警告的情况下转换为(已知)泛型类型?

    我有这两个接口 public interface Event default void dispatch EventBus getInstance dispatch this public interface EventListener
  • NERDTree 自动加载特定目录

    我在 Windows 中使用 gvim 默认情况下 nerdtree 默认加载 C 驱动器 我想将其更改为 E 驱动器 如何实现这一点 每当我尝试使用 NERDTree 命令启动 NERDTree 时 都会收到此错误E492 Not an
  • 在内存中存储张量流模型

    我正在编写的程序涉及在运行时在模型之间进行切换 我当前正在使用 Saver 从磁盘保存 加载模型 如下所示 https www tensorflow org api docs python state ops saving and rest
  • VS Xamarin无法生成IPA文件

    我曾经将配置设置为 Release iPhone Remote Device 但是远程设备不再显示 只剩下本地设备 有谁知道有相关的设置吗 多谢 更新到 Visual Studio 16 11 3 远程设备 选项已恢复 看发行说明 http
  • 谷歌地图 API 风格的地图与卫星水

    我正在使用谷歌地图 API V3 创建一个样式化的地图 其中我使用自定义颜色 我想知道是否可以在使用陆地上的自定义样式的同时使用水域的卫星图像 IE 我希望水是卫星图像 而土地是自定义的纯色 现在我可以为土地和水提供自定义颜色 但我想知道是
  • 如何限制子类修改抽象类中方法的范围?

    如何限制抽象类的实现类将方法的范围从 protected 修改为 public 例如 假设我有一个抽象类 package com rao test public abstract class AbstractTEClass protecte
  • RISC-V 中的旋转位

    嘿 我对 RISC V 还算陌生 我的练习题之一是 将 0x0000000000000123 的值右移 4 位 预期结果为 0x3000000000000012 即所有十六进制数字向右移动一位 而最右边的一位移动到前面 到目前为止 我了解了
  • 可以在 C++ 中缓存虚函数查找吗?

    假设我在抽象基类指针 mypointer gt foo 上有一个虚拟函数调用 foo 当我的应用程序启动时 根据文件的内容 它选择实例化特定的具体类并将 mypointer 分配给该实例 在应用程序的剩余生命周期中 mypointer 将a
  • 如何调用 rake 目标两次

    我通过修改 csproj 文件以包含额外的编译符号 从 sln 生成两组不同的 DLL 文件 我正在使用 rake 构建解决方案 并执行以下构建任务 desc Builds the DPSF sln in Release mode msbu
  • 正则表达式不匹配连字符后的数字

    我有以下内容 1 5 5 tablespoon cream 1 cup heavy cream teaspoon cream 1 tablespoon cream s d 我试图找出原因 不匹配 我在非捕获组中有一个转义的连字符 我尝试过的
  • Android 构建脚本存储库:jcenter VS mavencentral

    上次我使用Android Studio时 它生成了 gradle文件与mavencentral buildscript 存储库 而现在有jcenter 谁能解释一下与此相关的问题 还有其他回购吗 我们什么时候应该切换它们 它们对项目 模块
  • VBA XML DOM 搜索可能并不总是存在的项目

    在解析其他节点的数据时 如何为可能并不总是属于其父节点的节点创建循环 假设您有一个非常大的文件 其中包含其中几个项目 但为了简单起见 我们使用此 XML 请注意 第一个 book id 没有我们想要的节点 因此我们的循环已经失败
  • PySpark 和 MLLib:随机森林预测的类概率

    我正在尝试提取使用 PySpark 训练过的随机森林对象的类概率 但是 我在文档中没有看到它的示例 也不是一种方法RandomForestModel 我怎样才能从a中提取类别概率RandomForestModelPySpark 中的分类器