我有以下模型,我想使用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)...
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
阵列太短。
通过返回代码,可以发现labelCount
与layers
数组中的输出节点数相同。换句话说,输出节点的数量应该与类的数量相同。查看documentation的MLP,有以下几行:
输出层中的节点数N对应于类的数量。
因此解决方案是:
注意:最终输出层应始终为2或更多,永远不应为1,因为每个类应该有一个节点,单个类的问题没有意义。
重新排列数据集,因为错误显示您的数组少于您在功能集中的数组,或者您的数据集有一个空集,这会导致错误。我在处理MLP项目时遇到了这种类型的错误。我的回答可以帮助您。谢谢你伸出援手
解决方案是首先找到允许人们逃离ArrayIndexOutBound的局部最优,然后使用强力搜索来找到全局最优。 Shaido建议找到n
例如,val layers = Array [Int](6,5,8,n)。这假定特征向量的长度为6. - Shaido
因此,使n
成为一个大整数(n =100
)然后手动使用蛮力搜索来达到一个很好的解决方案(n =50
然后尝试n =32
- 错误,n = 35
- 完美)。
信用影子