3

我使用logistic回归和spark-ml管道训练一个简单的CrossValidatorModel。我可以预测新的数据,但我想超越的黑盒子,做系数如何获得spark-ml CrossValidatorModel中最佳逻辑回归的系数?

val lr = new LogisticRegression(). 
    setFitIntercept(true). 
    setMaxIter(maxIter). 
    setElasticNetParam(alpha). 
    setStandardization(true). 
    setFamily("binomial"). 
    setWeightCol("weight"). 
    setFeaturesCol("features"). 
    setLabelCol("response") 

val assembler = new VectorAssembler(). 
    setInputCols(Array("feat1", "feat2")). 
    setOutputCol("features") 

val modelPipeline = new Pipeline(). 
    setStages(Array(assembler,lr)) 

val evaluator = new BinaryClassificationEvaluator() 
    .setLabelCol("response") 

然后我定义的参数网格的一些分析,我训练在网格上,以获得最佳的模型WRT AUC

val paramGrid = new ParamGridBuilder(). 
    addGrid(lr.regParam, lambdas). 
    build() 

val pipeline = new CrossValidator(). 
    setEstimator(modelPipeline). 
    setEvaluator(evaluator). 
    setEstimatorParamMaps(paramGrid). 
    setNumFolds(nfolds) 

val cvModel = pipeline.fit(train) 

如何获得最佳逻辑回归模型的系数(贝塔)?

回答

5

提取最佳模式:

val bestModel = cvModel.bestModel match { 
    case pm: PipelineModel => Some(pm) 
    case _ => None 
} 

查找逻辑回归模型:

val lrm = bestModel 
    .map(_.stages.collect { case lrm: LogisticRegressionModel => lrm }) 
    .flatMap(_.headOption) 

提取系数:

lrm.map(m => (m.intercept, m.coefficients)) 

快速和肮脏相当于:

val lrm: LogisticRegressionModel = cvModel 
    .bestModel.asInstanceOf[PipelineModel] 
    .stages 
    .last.asInstanceOf[LogisticRegressionModel] 

(lrm.intercept, lrm.coefficients)