Hinweis: Die folgende Lösung gilt nur für Scala. Ich habe keinen Weg gefunden, es in Python zu machen.
Angenommen, Sie nur eine visuelle Darstellung des Baumes, wie in Ihrem Beispiel wollen, vielleicht eine Option ist die Methode subtreeToString
in dem Node.scala
Code auf Spark GitHub anzupassen, um die Wahrscheinlichkeiten an jedem Knoten Split zu umfassen, wie in dem folgenden snippet:
def subtreeToString(rootNode: Node, indentFactor: Int = 0): String = {
def splitToString(split: Split, left: Boolean): String = {
split.featureType match {
case Continuous => if (left) {
s"(feature ${split.feature} <= ${split.threshold})"
} else {
s"(feature ${split.feature} > ${split.threshold})"
}
case Categorical => if (left) {
s"(feature ${split.feature} in ${split.categories.mkString("{", ",", "}")})"
} else {
s"(feature ${split.feature} not in ${split.categories.mkString("{", ",", "}")})"
}
}
}
val prefix: String = " " * indentFactor
if (rootNode.isLeaf) {
prefix + s"Predict: ${rootNode.predict.predict} \n"
} else {
val prob = rootNode.predict.prob*100D
prefix + s"If ${splitToString(rootNode.split.get, left = true)} " + f"(Prob: $prob%04.2f %%)" + "\n" +
subtreeToString(rootNode.leftNode.get, indentFactor + 1) +
prefix + s"Else ${splitToString(rootNode.split.get, left = false)} " + f"(Prob: ${100-prob}%04.2f %%)" + "\n" +
subtreeToString(rootNode.rightNode.get, indentFactor + 1)
}
}
ich es auf einem Modell getestet habe ich auf dem Iris dataset laufen, und ich habe folgendes Ergebnis bekam:
scala> println(subtreeToString(model.topNode))
If (feature 2 <= -0.762712) (Prob: 35.35 %)
Predict: 1.0
Else (feature 2 > -0.762712) (Prob: 64.65 %)
If (feature 3 <= 0.333333) (Prob: 52.24 %)
If (feature 0 <= -0.666667) (Prob: 92.11 %)
Predict: 3.0
Else (feature 0 > -0.666667) (Prob: 7.89 %)
If (feature 2 <= 0.322034) (Prob: 94.59 %)
Predict: 2.0
Else (feature 2 > 0.322034) (Prob: 5.41 %)
If (feature 3 <= 0.166667) (Prob: 50.00 %)
Predict: 3.0
Else (feature 3 > 0.166667) (Prob: 50.00 %)
Predict: 2.0
Else (feature 3 > 0.333333) (Prob: 47.76 %)
Predict: 3.0
eine ähnliche App Roach könnte verwendet werden, um eine Baumstruktur mit diesen Informationen zu erstellen. Der Hauptunterschied besteht darin, die gedruckten Informationen (, split.threshold
, predict.prob
usw.) als Werte zu speichern und sie zum Erstellen der Struktur zu verwenden.
Können Sie Scala verwenden? –
@DanieldePaula, Ja ist es egal. – RoyaumeIX
Ich habe eine Idee mit Scala. Ich werde mit dir teilen, wenn ich etwas Zeit habe –