无法在简单示例中从 Spark ML 运行 RandomForestClassifier

2024-01-26

我尝试过运行实验RandomForestClassifier来自spark.ml包(版本 1.5.2)。我使用的数据集来自LogisticRegression中的示例Spark 机器学习指南 http://spark.apache.org/docs/latest/ml-guide.html.

这是代码:

import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.ml.param.ParamMap
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.sql.Row

// Prepare training data from a list of (label, features) tuples.
val training = sqlContext.createDataFrame(Seq(
  (1.0, Vectors.dense(0.0, 1.1, 0.1)),
  (0.0, Vectors.dense(2.0, 1.0, -1.0)),
  (0.0, Vectors.dense(2.0, 1.3, 1.0)),
  (1.0, Vectors.dense(0.0, 1.2, -0.5))
)).toDF("label", "features")

val rf = new RandomForestClassifier()

val model = rf.fit(training)

这是错误,我得到:

java.lang.IllegalArgumentException: RandomForestClassifier was given input with invalid label column label, without the number of classes specified. See StringIndexer.
    at org.apache.spark.ml.classification.RandomForestClassifier.train(RandomForestClassifier.scala:87)
    at org.apache.spark.ml.classification.RandomForestClassifier.train(RandomForestClassifier.scala:42)
    at org.apache.spark.ml.Predictor.fit(Predictor.scala:90)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:48)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:53)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:55)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:57)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:59)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:61)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:63)
    at $iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:65)
    at $iwC$$iwC$$iwC$$iwC.<init>(<console>:67)
    at $iwC$$iwC$$iwC.<init>(<console>:69)
    at $iwC$$iwC.<init>(<console>:71)
    at $iwC.<init>(<console>:73)
    at <init>(<console>:75)
    at .<init>(<console>:79)
    at .<clinit>(<console>)
    at .<init>(<console>:7)
    at .<clinit>(<console>)
    at $print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065)
    at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1340)
    at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840)
    at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871)
    at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819)
    at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:857)
    at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:902)
    at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:814)
    at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:657)
    at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:665)
    at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$loop(SparkILoop.scala:670)
    at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply$mcZ$sp(SparkILoop.scala:997)
    at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:945)
    at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:945)
    at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
    at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$process(SparkILoop.scala:945)
    at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:1059)
    at org.apache.spark.repl.Main$.main(Main.scala:31)
    at org.apache.spark.repl.Main.main(Main.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:674)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:120)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

当函数尝试计算列中的类数时会出现问题"label".

正如您在第 84 行中看到的随机森林分类器的源代码 https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/classification/RandomForestClassifier.scala,该函数调用DataFrame.schema带参数的函数"label"。该调用正常并返回org.apache.spark.sql.types.StructField目的。 然后,函数org.apache.spark.ml.util.MetadataUtils.getNumClasses叫做。由于它没有返回预期的输出,因此在第 87 行引发异常。

快速浏览后getNumClasses源代码 https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/util/MetadataUtils.scala,我认为错误是由于列中的数据"label"两者都不是BinaryAttribute两者都不NominalAttribute. 但是,我不知道如何解决这个问题。

我的问题:

我该如何解决这个问题?

非常感谢您阅读我的问题并提供帮助!


让我们首先修复导入以消除歧义

import org.apache.spark.ml.classification.RandomForestClassifier
import org.apache.spark.ml.feature.{StringIndexer, VectorIndexer}
import org.apache.spark.ml.{Pipeline, PipelineStage}
import org.apache.spark.ml.linalg.Vectors

我将使用您使用的相同数据:

val training = sqlContext.createDataFrame(Seq(
  (1.0, Vectors.dense(0.0, 1.1, 0.1)),
  (0.0, Vectors.dense(2.0, 1.0, -1.0)),
  (0.0, Vectors.dense(2.0, 1.3, 1.0)),
  (1.0, Vectors.dense(0.0, 1.2, -0.5))
)).toDF("label", "features")

然后创建管道阶段:

val stages = new scala.collection.mutable.ArrayBuffer[PipelineStage]()
  1. 对于分类,重新索引类别:
val labelIndexer = new StringIndexer().setInputCol("label").setOutputCol("indexedLabel").fit(training)
  1. 使用 VectorIndexer 识别分类特征
val featuresIndexer = new VectorIndexer().setInputCol("features").setOutputCol("indexedFeatures").setMaxCategories(10).fit(training)
stages += featuresIndexer

val tmp = featuresIndexer.transform(labelIndexer.transform(training))
  1. 学习随机森林
val rf = new RandomForestClassifier().setFeaturesCol(featuresIndexer.getOutputCol).setLabelCol(labelIndexer.getOutputCol)

stages += rf
val pipeline = new Pipeline().setStages(stages.toArray)

// Fit the Pipeline
val pipelineModel = pipeline.fit(tmp)

val results = pipelineModel.transform(training)

results.show

//+-----+--------------+---------------+-------------+-----------+----------+
//|label|      features|indexedFeatures|rawPrediction|probability|prediction|
//+-----+--------------+---------------+-------------+-----------+----------+
//|  1.0| [0.0,1.1,0.1]|  [0.0,1.0,2.0]|   [1.0,19.0]|[0.05,0.95]|       1.0|
//|  0.0|[2.0,1.0,-1.0]|  [1.0,0.0,0.0]|   [17.0,3.0]|[0.85,0.15]|       0.0|
//|  0.0| [2.0,1.3,1.0]|  [1.0,3.0,3.0]|   [14.0,6.0]|  [0.7,0.3]|       0.0|
//|  1.0|[0.0,1.2,-0.5]|  [0.0,2.0,1.0]|   [1.0,19.0]|[0.05,0.95]|       1.0|
//+-----+--------------+---------------+-------------+-----------+----------+

参考:关于步骤 1. 和 2.,对于那些想要了解更多详细信息的人特征转换器,建议你阅读官方文档here https://spark.apache.org/docs/1.5.1/ml-features.html#feature-transformers.

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

无法在简单示例中从 Spark ML 运行 RandomForestClassifier 的相关文章

随机推荐

  • 使用安装项目在安装时指定 Windows 服务名称

    目标 为了支持在一台计算机上可能有多个实例的 Windows 服务 请使用安装项目创建一个能够执行以下操作的 MSI 接收用户输入的服务名称 安装服务 从 1 开始序列化服务名称 以便在日志记录和卸载时可以使用正确的名称 我最初的希望是在
  • JS/Es6 如何合并两个数组并覆盖其对象中的值

    假设我有一个像这样的数组 let arrayOne text one value 0 text two value 0 let arrayTwo text two value 5 So arrayOne总是我想要的整个对象集 但所有值都将为
  • Selenium Chrome 窗口中的按钮不可点击

    我正在尝试使用 Selenium 和 Python 单击按钮 我需要理解的这个问题的根源是 当 Selenium 启动 Chrome 窗口时 我想单击的按钮在单击时不会执行任何操作 就像我用鼠标点击按钮一样 什么也不会发生 它似乎是页面上唯
  • 如何将 bash 输出捕获到 Mac OS X 剪贴板?

    是否可以将 bash 输出捕获到 OS X 剪贴板 The pbcopy http developer apple com Mac library documentation Darwin Reference ManPages man1 p
  • OpenJDK7 OS X 上的 file.listFiles() 在包含欧元符号的文件名上损坏

    似乎以下 file listFiles 在 OS X 上的 OpenJDK 7 上被破坏 此代码片段将打印 此文件有欧元符号 不存在 final String pathname System getProperty user home fo
  • 检查 Android/Java 上的端口是否打开

    我想检查端口是否打开 或者服务器是否正在其上运行 我已经以多种方式尝试过 例如 system bin ping 和 InetAddress 但如果我是对的 我无法使用这些 ping 特定端口 这次我用 DatagramSockets 的想法
  • 显示软键盘时出现对话框

    我有一个扩展的类Dialog 在那里面Dialog我有一个EditText and a ListView 当该对话框显示时 我可以调出软键盘 但我的问题是我们可以让对话框在显示软键盘时不弹出吗 我尝试改变softInputMode在布局参数
  • 使用 Mathematica 7 调试 Mathematica 5 上的工作程序

    我目前正在阅读 Mathematica 编程指南 并试图编写这本书的第一个程序 基本上 当我运行以下程序时 Plot3D Re Exp 1 x I y x 0 02 0 022 y 0 04 0 042 PlotRange gt 1 8 P
  • 如何使用 gradle 0.7+ 将 .so 文件添加到 android 库项目

    项目结构 应用程序项目 gt 取决于库项目 图书馆计划 有一个用于编译 jni 库的文件夹 jniLibs srcDirs libs 我尝试按照示例应用程序将以下内容添加到 build gradle 的 android 元素中https a
  • 在 JQuery 中获取 Node 的原始 HTML

    我用过 parent html 获取内部 html parent 但是我如何获取父级本身的 html 呢 用例是 我获取一个像这样的输入节点 var field input 我希望能够获取该节点的原始 html
  • 用户存在和身份验证

    我正在使用此代码使用服务在后台检测我的 Android 应用程序中的用户存在 final FirebaseAuth mAuth FirebaseAuth getInstance final FirebaseDatabase database
  • 动态规划和分而治之

    我正在读书动态规划的笔记 http www es ele tue nl education 5MC10 Solutions knapsack pdf 我遇到了以下评论 如果子问题不是独立的 即 子问题共享子子问题 然后分而治之算法重复解决公
  • Android 获取屏幕宽度和高度

    如何获取屏幕宽度和高度并在以下位置使用该值 Override protected void onMeasure int widthSpecId int heightSpecId Log e TAG onMeasure widthSpecId
  • 将分隔的字段合并为一个

    我在 Ada 工作 我有一个非常丑陋的类型 我无法修改 我想做一些易于使用的事情 类型是这样的 for T Ugly Type Alignment use 4 for T Ugly Type Size use 48 for T Ugly T
  • 比 SHA1 更好的散列

    我正在开发一个应用程序 我需要存储用户密码 所以我想将其存储在注册表的当前用户类中 但出于显而易见的原因我也想对其进行哈希处理 并且我我看到新闻报道称 SHA1 已被破解 标准 系统或 net 中是否有更好的 未破解的 哈希算法 SHA1
  • 使用 & 符号解析 XML

    我有一个包含 XML 的字符串 我只想将其解析为 Xelement 但它有一个 符号 我在使用 HtmlDecode 解析它时仍然遇到问题 有什么建议么 string test
  • 如何在 django 中实现 ldap 身份验证(无需管理员凭据)

    我的设置 Django 3 0 Python 3 8 django auth ldap我的组织中有 LDAP 服务器 Active Directory 服务器 我正在构建一个 Django 应用程序 它为所有用户提供一些操作 我知道 Dja
  • C 样式数组不再适用于记录

    我以前使用过这个人为的代码 record Foo int bar 这是利用C型数组 符号 它在 Java 15 中编译得很好 现在 突然之间 随着正式发布records在 Java 16 中 它不再编译 这是输出jshell jshell
  • 运行闪亮应用程序时访问/使用 R 控制台

    有谁知道在运行闪亮的应用程序时是否能够访问 R 控制台 如果可能的话 在后台运行闪亮的应用程序也会有帮助 我需要这个来操作 GlobalEnv 中的对象 这些对象在闪亮的应用程序中使用 并且必须使用命令行来完成 启动应用程序时 控制台很忙
  • 无法在简单示例中从 Spark ML 运行 RandomForestClassifier

    我尝试过运行实验RandomForestClassifier来自spark ml包 版本 1 5 2 我使用的数据集来自LogisticRegression中的示例Spark 机器学习指南 http spark apache org doc