PAR*_*DER 5 tree probability prediction boosting apache-spark-mllib
众所周知,Spark中的GBT为您提供了截至目前的预测标签.
我正在考虑尝试计算一个类的预测概率(比如说属于某个叶子的所有实例)
构建GBT的代码
import org.apache.spark.SparkContext
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.tree.GradientBoostedTrees
import org.apache.spark.mllib.tree.configuration.BoostingStrategy
import org.apache.spark.mllib.tree.model.GradientBoostedTreesModel
import org.apache.spark.mllib.util.MLUtils
//Importing the data
val data = sc.textFile("data/mllib/credit_approval_2_attr.csv") //using the credit approval data set from UCI machine learning repository
//Parsing the data
val parsedData = data.map { line =>
val parts = line.split(',').map(_.toDouble)
LabeledPoint(parts(0), Vectors.dense(parts.tail))
}
//Splitting the data
val splits = parsedData.randomSplit(Array(0.7, 0.3), seed = 11L)
val training = splits(0).cache()
val test = splits(1)
// Train a GradientBoostedTrees model.
// The defaultParams for Classification use LogLoss by default.
val boostingStrategy = BoostingStrategy.defaultParams("Classification")
boostingStrategy.numIterations = 2 // We can use more iterations in practice.
boostingStrategy.treeStrategy.numClasses = 2
boostingStrategy.treeStrategy.maxDepth = 2
boostingStrategy.treeStrategy.maxBins = 32
boostingStrategy.treeStrategy.subsamplingRate = 0.5
boostingStrategy.treeStrategy.maxMemoryInMB =1024
boostingStrategy.learningRate = 0.1
// Empty categoricalFeaturesInfo indicates all features are continuous.
boostingStrategy.treeStrategy.categoricalFeaturesInfo = Map[Int, Int]()
val model = GradientBoostedTrees.train(training, boostingStrategy)
model.toDebugString
Run Code Online (Sandbox Code Playgroud)
为简单起见,这给了我2棵深度为2的树,如下所示:
Tree 0:
If (feature 3 <= 2.0)
If (feature 2 <= 1.25)
Predict: -0.5752212389380531
Else (feature 2 > 1.25)
Predict: 0.07462686567164178
Else (feature 3 > 2.0)
If (feature 0 <= 30.17)
Predict: 0.7272727272727273
Else (feature 0 > 30.17)
Predict: 1.0
Tree 1:
If (feature 5 <= 67.0)
If (feature 4 <= 100.0)
Predict: 0.5739387416147804
Else (feature 4 > 100.0)
Predict: -0.550117566730937
Else (feature 5 > 67.0)
If (feature 2 <= 0.0)
Predict: 3.0383669122382835
Else (feature 2 > 0.0)
Predict: 0.4332824083446489
Run Code Online (Sandbox Code Playgroud)
我的问题是:我可以使用上面的树来计算预测概率,如:
关于用于预测的特征集中的每个实例
EXP(叶得分从树0 +叶得分从树1)/(1 + EXP(叶得分从树树0 +叶得分1))
这给了我一种概率.但不确定这是否是正确的方法.此外,如果有任何文件解释如何计算叶子得分(预测).如果有人可以分享,我将非常感激.
任何建议都是一流的.
实际上,我可以使用问题中给出的树和树的公式来预测概率。我实际上检查了 GBT 预测标签输出。当我使用阈值0.5时它完全匹配。
所以我们做同样的事情,但稍作改变。
对于用于预测的特征集中的每个实例:
exp(树 0 的叶子分数 + (learning_rate)* 树 1 的叶子分数)/(1+exp(树 0 的叶子分数 + (learning_rate)* 树 1 的叶子分数))
这基本上给了我预测的概率。
我在深度为 3 的 3 棵树上进行了相同的测试。它有效。并且还具有不同的数据集。
很高兴知道是否有其他人已经尝试过这个。如果没有,他们可以尝试一下并发表评论。