3

Я тренирую простой инструмент 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

Extract лучшая модель:

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)