如何在ML Pipeline中访问底层模型的参数?

时间:2017-07-20 21:10:52

标签: scala apache-spark apache-spark-mllib

我有一个使用LinearRegression处理的DataFrame。如果我直接进行,如下所示,我可以显示模型的详细信息:

String message = "Alice fell into the rabbit hole";
int x =  130;
int y = 90;

Letter[] letters;

void setup() {
  size(260, 200);
  letters = new Letter[message.length()];
  textSize (random(10, 20));

  for (int i = 0; i < message.length(); i++) { 
    letters[i] = new Letter(x, y, message.charAt(i));
    //x += textWidth(message.charAt(i));
  }
}

void draw() { 
  background(255);
  for (int i = 0; i < letters.length; i++) { 
    letters[i].display(); 
    letters[i].shake();
  }
}

class Letter {
  char letter;
  float x, y;

  Letter (float x, float y, char letter) {
    this.x = x;
    this.y = y;
    this.letter = letter;
  }

  void display() {
    fill(0);
    textAlign(CENTER, CENTER);
    text(letter, x, y);
  }

  void shake() {
    x += random(-2, 2);
    y += random(-2, 2);
  }
}

但是,如果我在管道中使用它(如下面的简化示例),

val lr = new LinearRegression()
val lrModel = lr.fit(df)

lrModel: org.apache.spark.ml.regression.LinearRegressionModel = linReg_b22a7bb88404

println(s"Coefficients: ${lrModel.coefficients} Intercept: ${lrModel.intercept}")
Coefficients: [0.9705748115939526] Intercept: 0.31041486689532866

然后我收到以下错误。

val pipeline = new Pipeline().setStages(Array(lr))
val lrModel = pipeline.fit(df)

我理解它意味着什么(显然我有一个不同的类,因为管道),但不知道如何到达真正的底层模型。

1 个答案:

答案 0 :(得分:5)

LinearRegressionModel应位于stages内,其索引与其对应的LinearRegression完全相同。

import org.apache.spark.ml.regressio‌​n.LinearRegressionMo‌​del
lrModel.stages(0).asInstanceOf[LinearRegressionMo‌​del]