【问题标题】:How to access individual trees in a model created by RandomForestClassifier (spark.ml-version)?如何访问由 RandomForestClassifier (spark.ml-version) 创建的模型中的单个树?
【发布时间】:2016-07-18 18:53:51
【问题描述】:

如何访问由 Spark ML 的RandomForestClassifier 生成的模型中的单个树?我正在使用 Scala 版本的 RandomForestClassifier。

【问题讨论】:

    标签: scala apache-spark apache-spark-ml


    【解决方案1】:

    其实它有trees属性:

    import org.apache.spark.ml.attribute.NominalAttribute
    import org.apache.spark.ml.classification.{
      RandomForestClassificationModel, RandomForestClassifier, 
      DecisionTreeClassificationModel
    }
    
    val meta = NominalAttribute
      .defaultAttr
      .withName("label")
      .withValues("0.0", "1.0")
      .toMetadata
    
    val data = sqlContext.read.format("libsvm")
      .load("data/mllib/sample_libsvm_data.txt")
      .withColumn("label", $"label".as("label", meta))
    
    val rf: RandomForestClassifier = new RandomForestClassifier()
      .setLabelCol("label")
      .setFeaturesCol("features")
    
    val trees: Array[DecisionTreeClassificationModel] = rf.fit(data).trees.collect {
      case t: DecisionTreeClassificationModel => t
    }
    

    如您所见,唯一的问题是正确获取类型,以便我们可以实际使用它们:

    trees.head.transform(data).show(3)
    // +-----+--------------------+-------------+-----------+----------+
    // |label|            features|rawPrediction|probability|prediction|
    // +-----+--------------------+-------------+-----------+----------+
    // |  0.0|(692,[127,128,129...|   [33.0,0.0]|  [1.0,0.0]|       0.0|
    // |  1.0|(692,[158,159,160...|   [0.0,59.0]|  [0.0,1.0]|       1.0|
    // |  1.0|(692,[124,125,126...|   [0.0,59.0]|  [0.0,1.0]|       1.0|
    // +-----+--------------------+-------------+-----------+----------+
    // only showing top 3 rows
    

    注意

    如果您使用管道,您也可以提取单个树:

    import org.apache.spark.ml.Pipeline
    
    val model = new Pipeline().setStages(Array(rf)).fit(data)
    
    // There is only one stage and know its type 
    // but lets be thorough
    val rfModelOption = model.stages.headOption match {
      case Some(m: RandomForestClassificationModel) => Some(m)
      case _ => None
    }
    
    val trees = rfModelOption.map {
      _.trees //  ... as before
    }.getOrElse(Array())
    

    【讨论】:

    • 您好 zero323,感谢您的帮助。我有一个后续问题。我想从具有高预测概率(比如高于 0.3)的树节点中提取规则。在spark.ml 中,对象 impurityStats 在树的内部节点中是私有的,toOld 和 fromOld 方法也是如此。我需要这些详细信息(我无法访问,因为它们是私有的)才能提取任何内容。同样,节点的拆分不提供有关其类别和特征阈值的任何信息。有没有办法从spark.ml中的高概率节点中提取规则?
    • 我不知道任何微不足道的解决方案。你应该把它作为一个单独的问题来问——也许有人已经有了解决方案。如果你这样做,请给我一个链接。
    • 感谢 zero323。我刚刚发布了问题“如何从 Spark ML RandomForestClassifier 模型(Scala 版本)中提取规则?”。如果我得到答案,会及时通知您。
    猜你喜欢
    • 2016-04-09
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多