Spark Mllib Interaction выбрасывает исключение на векторы ручной работы - PullRequest
0 голосов
/ 27 августа 2018

Вы можете скопировать следующие коды и вставить в spark-shell, чтобы воспроизвести проблему.

import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.ml.linalg.SQLDataTypes.VectorType
import org.apache.spark.ml.feature.Interaction

val df = spark.createDataFrame(Seq(
    (1, Vectors.dense(1, 2), Vectors.dense(3, 4)),
    (2, Vectors.dense(5, 6), Vectors.dense(7, 8))
)).toDF("id", "v1", "v2")

df.show

val interaction = new Interaction().setInputCols(Array("v1", "v2")).setOutputCol("interacted")

interaction.transform(df).show

scala>

Входные данные df отображаются как:

+---+---------+---------+
| id|       v1|       v2|
+---+---------+---------+
|  1|[1.0,2.0]|[3.0,4.0]|
|  2|[5.0,6.0]|[7.0,8.0]|
+---+---------+---------+

Ожидаемый результат должен быть:

+---+---------+---------+---------------------+
| id|       v1|       v2|           interacted|
+---+---------+---------+---------------------+
|  1|[1.0,2.0]|[3.0,4.0]|    [3.0,4.0,6.0,8.0]|
|  2|[5.0,6.0]|[7.0,8.0]|[35.0,40.0,42.0,48.0]|
+---+---------+---------+---------------------+

Однако выдается исключение:

org.apache.spark.SparkException: Vector attributes must be defined for interaction.
  at org.apache.spark.ml.feature.Interaction$$anonfun$getFeatureEncoders$1$$anonfun$4.apply(Interaction.scala:138)
  at org.apache.spark.ml.feature.Interaction$$anonfun$getFeatureEncoders$1$$anonfun$4.apply(Interaction.scala:138)
  at scala.Option.getOrElse(Option.scala:121)
  at org.apache.spark.ml.feature.Interaction$$anonfun$getFeatureEncoders$1.apply(Interaction.scala:137)
  at org.apache.spark.ml.feature.Interaction$$anonfun$getFeatureEncoders$1.apply(Interaction.scala:132)
  at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
  at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
  at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
  at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:35)
  at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
  at scala.collection.AbstractTraversable.map(Traversable.scala:104)
  at org.apache.spark.ml.feature.Interaction.getFeatureEncoders(Interaction.scala:132)
  at org.apache.spark.ml.feature.Interaction.transform(Interaction.scala:73)
  ... 49 elided

Я тестировал его на Spark 2.3.1, Spark 2.3.0, Spark 2.2.0, у всех одна и та же проблема.

Но если векторы сделаны из VectorAssembler, как и в примере , он работает правильно.

+---+---+---+---+---------+---------+--------------------+
|  a|  b|  c|  d|       ab|       cd|          interacted|
+---+---+---+---+---------+---------+--------------------+
|1.0|2.0|3.0|4.0|[1.0,2.0]|[3.0,4.0]|   [3.0,4.0,6.0,8.0]|
|5.0|6.0|7.0|8.0|[5.0,6.0]|[7.0,8.0]|[35.0,40.0,42.0,4...|
+---+---+---+---+---------+---------+--------------------+

Я также тестировал те трансформаторы, которые могут создавать векторы. Некоторые в порядке, но некоторые бросают исключения.

createDataFrame().toDF  exception
FeatureHasher           exception
HashingTF               exception
Interaction             OK
OneHotEncoder           OK
OneHotEncoderEstimator  OK
VectorAssembler         OK
VectorSlicer            OK

Это моя ошибка или какое-то неправильное понимание?

...