Как создать собственный преобразователь без любого входного столбца? - PullRequest
0 голосов
/ 18 февраля 2019

У нас есть требование, в котором мы хотели генерировать оценки нашей модели с некоторыми случайными значениями в диапазоне от 0 до 1.

Для этого мы хотели иметь собственный преобразователь, который будет генерировать случайные числа безлюбые поля ввода.

Так можем ли мы сгенерировать преобразователь без полей ввода в mleap?

Как обычно мы создаем, как показано ниже:

import ml.combust.mleap.core.Model
import ml.combust.mleap.core.types._

case class RandomNumberModel() extends Model {
  private val rnd = scala.util.Random

  def apply(): Double = rnd.nextFloat

  override def inputSchema: StructType = StructType("input" -> ScalarType.String).get

  override def outputSchema: StructType = StructType("output" -> ScalarType.Double ).get

}

Как сделать это каквводить схему не нужно ставить?

1 Ответ

0 голосов
/ 22 марта 2019

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

package org.apache.spark.ml.feature.mleap

import ml.combust.mleap.core.Model
import ml.combust.mleap.core.types._
import org.apache.spark.ml.linalg._

case class PropertyGroupAggregatorBaseModel (props: Array[String],
                                        aggFunc: String) extends Model {
  val outputSize = props.size

  //having multiple inputs, you will have apply with a parameter Seq[Any]
  def apply(features: Seq[Any]): Vector = {
    val properties = features(0).asInstanceOf[Seq[String]]
    val values = features(1).asInstanceOf[Seq[Double]]
    val mapping = properties.zip(values)
    val histogram = props.foldLeft(Array.empty[Double]){
      (acc, property) =>
        val newValues = mapping.filter(x => x._1 == property).map(x => x._2)
        val newAggregate = aggFunc match {
          case "sum" => newValues.sum.toDouble
          case "count" => newValues.size.toDouble
          case "avg" => (newValues.sum / Math.max(newValues.size, 1)).toDouble
        }
        acc :+ newAggregate
    }

    Vectors.dense(histogram)
  }

  override def inputSchema: StructType =  {
    //here you define the input 
    val inputFields = Seq(
      StructField("input1" -> ListType(BasicType.String)),
      StructField("input2" -> ListType(BasicType.Double))
    )
    StructType(inputFields).get
  }

  override def outputSchema: StructType = StructType(StructField("output" -> TensorType.Double(outputSize))).get
}

Мое предложение состояло бы в том, что приложение может уже работать для вас.Я думаю, если вы определите inputSchema следующим образом, это может сработать:

override def inputSchema: StructType =  {
    //here you define the input 
    val inputFields = Seq.empty[StructField]
    StructType(inputFields).get
  }
...