【问题标题】:How to run Logistic Regression in Scala for Dataframe如何在 Scala 中为 Dataframe 运行逻辑回归
【发布时间】:2017-07-18 06:10:38
【问题描述】:

我已读取数据文件如下:

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)

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

【问题讨论】:

    标签: scala apache-spark logistic-regression


    【解决方案1】:

    鉴于dataframe

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

    问题表明c4c5 用于LogisticRegressionc4c5 作为featuresc5 作为label

    doublesfeatures 向量column 可以使用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)
    

    输出是

    org.apache.spark.ml.classification.BinaryLogisticRegressionTrainingSummary@6e9f8160
    

    【讨论】:

    • 为什么要使用标签作为特征?监督建模的目的是确定标签。将其用作一项功能对我来说毫无意义。
    • 这只是一个帮助您理解流程的示例 :) 您可以将其他值用于标签以外的功能。
    • @Rumo 我已经更新了我的答案。 :) 现在应该没问题了。不是吗?
    • @Rumo 如果答案很好,请删除你的反对票 :) 谢谢
    【解决方案2】:

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

    特征列的默认名称为“features”,标签列的默认名称为“label”。

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

    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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 2021-06-29
      相关资源
      最近更新 更多