SparkML MultilayerPerceptron错误:java.lang.ArrayIndexOutOfBoundsException

问题描述 投票:0回答:3

我有以下模型,我想使用SparkML MultilayerPerceptronClassifier()估计。

val formula = new RFormula()
  .setFormula("vtplus15predict~ vhisttplus15 + vhistt + vt + vtminus15 + Time + Length + Day")
  .setFeaturesCol("features")
  .setLabelCol("label")

formula.fit(data).transform(data)

注意:要素是矢量,标签是双精度

root
 |-- features: vector (nullable = true)
 |-- label: double (nullable = false)

我将MLP估算器定义如下:

val layers = Array[Int](6, 5, 8, 1) //I suspect this is where it went wrong

val mlp = new MultilayerPerceptronClassifier()
  .setLayers(layers)
  .setBlockSize(128)
  .setSeed(1234L)
  .setMaxIter(100)

// train the model
val model = mlp.fit(train)

不幸的是,我收到以下错误:

使用Spark的默认log4j配置文件:org / apache / spark / log4j-defaults.properties

线程“main”中的异常org.apache.spark.SparkException:作业因阶段失败而中止:阶段3.0中的任务0失败1次,最近失败:阶段3.0中丢失的任务0.0(TID 3,localhost,执行器驱动程序): java.lang.ArrayIndexOutOfBoundsException:11 org.apache.spark.ml.classification.LabelConverter $ .encodeLabeledPoint(MultilayerPerceptronClassifier.scala:121)at org.apache.spark.ml.classification.MultilayerPerceptronClassifier $$ anonfun $ 3.apply(MultilayerPerceptronClassifier。 scala:245)at sca.aplection.Iterator $$ anon $ 11.next(Iterator.scala:363)at scala.apache.spark.ml.classification.MultilayerPerceptronClassifier $$ anonfun $ 3.apply(MultilayerPerceptronClassifier.scala:245)at scala .collection.Iterator $ GroupedIterator.takeDestructively(Iterator.scala:935)at scala.collection.Iterator $ GroupedIterator.go(Iterator.scala:950)...

scala apache-spark neural-network apache-spark-mllib apache-spark-ml
3个回答
4
投票

org.apache.spark.ml.classification.LabelConverter $ .encodeLabeledPoint(MultilayerPerceptronClassifier.scala:121)

这告诉我们MultilayerPerceptronClassifier.scala文件中的数组超出了界限,让我们看看那里的代码:

def encodeLabeledPoint(labeledPoint: LabeledPoint, labelCount: Int): (Vector, Vector) = {
  val output = Array.fill(labelCount)(0.0)
  output(labeledPoint.label.toInt) = 1.0
  (labeledPoint.features, Vectors.dense(output))
}

它对数据集中的标签执行单热编码。 ArrayIndexOutOfBoundsException发生,因为output阵列太短。

通过返回代码,可以发现labelCountlayers数组中的输出节点数相同。换句话说,输出节点的数量应该与类的数量相同。查看documentation的MLP,有以下几行:

输出层中的节点数N对应于类的数量。

因此解决方案是:

  1. 更改网络最后一层中的节点数(输出节点)
  2. 重建数据以使其具有与网络输出节点相同数量的类。

注意:最终输出层应始终为2或更多,永远不应为1,因为每个类应该有一个节点,单个类的问题没有意义。


0
投票

重新排列数据集,因为错误显示您的数组少于您在功能集中的数组,或者您的数据集有一个空集,这会导致错误。我在处理MLP项目时遇到了这种类型的错误。我的回答可以帮助您。谢谢你伸出援手


-2
投票

解决方案是首先找到允许人们逃离ArrayIndexOutBound的局部最优,然后使用强力搜索来找到全局最优。 Shaido建议找到n

例如,val layers = Array [Int](6,5,8,n)。这假定特征向量的长度为6. - Shaido

因此,使n成为一个大整数(n =100)然后手动使用蛮力搜索来达到一个很好的解决方案(n =50然后尝试n =32 - 错误,n = 35 - 完美)。

信用影子

© www.soinside.com 2019 - 2024. All rights reserved.