Категориальные переменные для GLM с использованием Spark: (Невозможно использовать OneHotEncoding при запуске моделей GLM с использованием Spark 2.3 (Scala)) - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь запустить glm для набора данных, который имеет 7 категориальных переменных. Код, который у меня пока есть:

      import org.apache.spark.ml.feature.OneHotEncoderEstimator
      import org.apache.spark.ml.Pipeline
      import org.apache.spark.ml.feature.VectorAssembler
      import org.apache.spark.ml.feature.StringIndexer
      import org.apache.spark.ml.linalg.Vectors
      // this is a combination of indexing and OneHotEncoding
      val encode_features = feat.flatMap { name =>
        val stringIndexer = new StringIndexer().setInputCol(name).setOutputCol(name + "_idx").setHandleInvalid("keep")
        val oneHotEncoder= new OneHotEncoderEstimator().setInputCols(Array(name+ "_idx") ).setOutputCols(Array(name+ "_vec")).setDropLast(false).setHandleInvalid("keep")
        Array(stringIndexer,oneHotEncoder)
      }

//pipeline to transform
      val pipeline = new Pipeline().setStages(encode_features)
      val newDF = pipeline.fit(actualDF).transform(actualDF)
      newDF.show()



      import org.apache.spark.ml.linalg.{Vector, Vectors}
      //coverting sparse vector to dense so that it works with GLM
      val asDense = udf((v:Vector)=> v.toDense)
      val densedf = newDF.columns.filter(_.endsWith("_vec")).foldLeft(newDF) { (memoDF, colName) =>memoDF.withColumn(
        colName, asDense(col(colName))
      )
      }


         val final_feat = densedf.columns.filter(_.endsWith("_vec"))

         val assembler2 = new VectorAssembler().setInputCols(final_feat).setOutputCol("feat_final")
        val assembled2 = assembler2.transform(newDF)
        val final_ads = assembled2.select(  "features","feat_final", "avg_rsvl_time")
        val final_data= final_ads.selectExpr("features","feat_final", "cast(avg_rsvl_time as int) rsvl")

Этот набор данных работает с линейной регрессией, но не запускается для glm org.apache.spark.ml.regression.GeneralizedLinearRegression

Выдает ошибку:

model.summary
java.lang.NumberFormatException                                                 
  at java.math.BigDecimal.<init>(BigDecimal.java:494)
  at java.math.BigDecimal.<init>(BigDecimal.java:824)

Есть ли что-то, что необходимо учитывать при реализации glm. Максимальное количество столбцов, на которое это будет взорвано, равно 850, что меньше предела 4096 для glm https://spark.apache.org/docs/latest/ml-classification-regression.html#generalized-linear-regression

Кроме того, для glm нужна не предсказание, а получение коэффициентов, подобных объяснениям. , Значения P и т. Д. С помощью org.apache.spark.ml.regression.LinearRegression сложно выполнить обратное проектирование значений, закодированных в горячем виде, обратно на уровни категорий, также это не позволяет мне выбрать пуассоновский дист и пройти вероятностный маршрут. что я планирую сделать. Пожалуйста, дайте мне знать, как я смогу решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...