如何在Scala for Dataframe中运行Logistic回归

时间:2017-07-18 06:10:38

标签: scala apache-spark logistic-regression

我已经阅读了如下数据文件:

val df = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("D:/ModelData.csv")


+---------+---------+---+-----+-------+
|c1       |    c2   |c3 |  c4 |  c5   |
+---------+---------+---+-----+-------+
|        1|        1| 13|  100|      1|
|        1|        1| 13|  200|      0|
|        1|        1| 13|  300|      0|
+---------+---------+---+-----+-------+

那么我对模型的输入是c5和c4。(c1,c2,c3对于所有行都是相同的)

val df3=df.select("c5", "c4")

val lr = new LogisticRegression()
      .setMaxIter(10)
      .setRegParam(0.3)
      .setElasticNetParam(0.8)

val lrModel = lr.fit(df3)

val trainingSummary = lrModel.summary
println(trainingSummary)

但这似乎不起作用。它不会打印任何东西。感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

鉴于dataframe

+---+---+---+---+---+
|c1 |2  |c3 |c4 |c5 |
+---+---+---+---+---+
|1  |1  |13 |100|1  |
|1  |1  |13 |200|0  |
|1  |1  |13 |300|0  |
+---+---+---+---+---+

该问题表明,c4c5将用于LogisticRegressionc4c5作为features和{{1}作为c5

label features的{​​{1}}向量column可以使用doubles形成

VectorAssembler
val assembler = new VectorAssembler() .setInputCols(Array("c4")) .setOutputCol("features") 所以

需要

labelfeatures

LogisticRegression

val df3 = assembler.transform(df).select($"c5".cast(DoubleType).as("label"), $"features")

现在+-----+--------+ |label|features| +-----+--------+ |1.0 |[100.0] | |0.0 |[200.0] | |0.0 |[300.0] | +-----+--------+ 可以应用为

LogisticRegression

输出

val lr = new LogisticRegression()
  .setMaxIter(10)
  .setRegParam(0.3)
  .setElasticNetParam(0.8)

val lrModel = lr.fit(df3)

val trainingSummary = lrModel.summary
println(trainingSummary)

答案 1 :(得分:1)

您的分类器需要知道要学习什么。因此,您必须为分类器定义标签列和要素列。

功能列的默认名称是"功能"标签栏的默认名称是"标签"。

您可以将列重命名为"标签"和"功能":

lr.fit(df3.withColumnRenamed("c4","features").withColumnRenamed("c5","label"))

或者您可以定义要用作要素/标签列的列:

val lr = new LogisticRegression()
  .setMaxIter(10)
  .setRegParam(0.3)
  .setElasticNetParam(0.8)
  .setLabelColumn("c5")
  .setFeaturesColumn("c4")