Я пытаюсь запустить 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 сложно выполнить обратное проектирование значений, закодированных в горячем виде, обратно на уровни категорий, также это не позволяет мне выбрать пуассоновский дист и пройти вероятностный маршрут. что я планирую сделать. Пожалуйста, дайте мне знать, как я смогу решить эту проблему.