Предсказание и точность с использованием нейронной сети с искрой Scala - PullRequest
0 голосов
/ 03 февраля 2019

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

object Test2 {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .appName("WineQualityDecisionTreeRegressorPMML")
      .master("local")
      .getOrCreate()
    // Load and parse the data file.



val df = spark.read
      .format("csv")
      .option("header", "true")
      .option("mode", "DROPMALFORMED")
      .option("delimiter", ",")
      .load("file:///c:/tmp/spark-warehouse/winequality_red_names.csv")
     val inputFields = List("fixed acidity", "volatile acidity", "citric acid", "residual sugar", "chlorides",
      "free sulfur dioxide", "total sulfur dioxide", "density", "pH", "sulphates", "alcohol")


val toDouble = udf[Double, String]( _.toDouble)
val dff = df.
  withColumn("fixed acidity",        toDouble(df("fixed acidity"))).          // 0  +
  withColumn("volatile acidity",     toDouble(df("volatile acidity"))).       // 1  +
  withColumn("citric acid",          toDouble(df("citric acid"))).            // 2  -
  withColumn("residual sugar",       toDouble(df("residual sugar"))).         // 3  +
  withColumn("chlorides",            toDouble(df("chlorides"))).              // 4  -
  withColumn("free sulfur dioxide",  toDouble(df("free sulfur dioxide"))).    // 5  +
  withColumn("total sulfur dioxide", toDouble(df("total sulfur dioxide"))).   // 6  +
  withColumn("density",              toDouble(df("density"))).                // 7  -
  withColumn("pH",                   toDouble(df("pH"))).                     // 8  +
  withColumn("sulphates",            toDouble(df("sulphates"))).              // 9  +
  withColumn("alcohol",              toDouble(df("alcohol")))                 // 10 +



val assembler = new VectorAssembler().
  setInputCols(inputFields.toArray).
  setOutputCol("features")

// Fit on whole dataset to include all labels in index.
val labelIndexer = new StringIndexer()
  .setInputCol("quality")
  .setOutputCol("indexedLabel")
  .fit(dff)

// specify layers for the neural network:
// input layer of size 11 (features), two intermediate of size 10 and 20
// and output of size 6 (classes)

val layers = Array[Int](11, 10, 20, 6)

// Train a DecisionTree model.
val dt = new MultilayerPerceptronClassifier()
  .setLayers(layers)
  .setBlockSize(128)
  .setSeed(1234L)
  .setMaxIter(100)
  .setLabelCol("indexedLabel")
  .setFeaturesCol("features")

// Convert indexed labels back to original labels.
val labelConverter = new IndexToString()
  .setInputCol("prediction")
  .setOutputCol("predictedLabel")
  .setLabels(labelIndexer.labels)

// create pileline
val pipeline = new Pipeline()
  .setStages(Array(assembler, labelIndexer, dt, labelConverter))

// Train model
val model = pipeline.fit(dff)


  }
}

Есть идеи, пожалуйста?Я не могу найти пример нейронной сети с CSV-файлом с использованием pipline.

1 Ответ

0 голосов
/ 03 февраля 2019

Когда вы обучили свою модель (val model = pipeline.fit(dff)), вам необходимо предсказать для каждого тестового образца метку, используя метод model.transform.Для каждого прогноза вы должны проверить, соответствует ли он метке.Тогда точность будет отношением правильно классифицированного к размеру тренировочного набора.

Если вы хотите использовать тот же DataFrame, который использовался для обучения, тогда просто val predictions = model.transform(dff).Затем переберите predictions и проверьте, совпадают ли они с соответствующими метками.Однако я не рекомендую повторно использовать DataFrame - лучше разбить его для обучения и тестирования подмножеств.

...