2016-05-10 6 views
2

schaffe ich konnte nach dem Anzeigen meiner Entscheidungsbaum Gesamtwahrscheinlichkeiten meiner labels, zum Beispiel angezeigt werden, habe ich eine Tabelle:Spark MLib Decision Trees: Wahrscheinlichkeit von Labels durch Features?

Total Predictions : 
    65% impressions 
    30% clicks 
    5% conversions 

Aber mein Problem ist, Wahrscheinlichkeiten zu finden (oder zu zählen) von features (von Knoten), zum Beispiel:

if feature1 > 5 
    if feature2 < 10 
     Predict Impressions 
     samples : 30 Impressions 
    else feature2 >= 10 
     Predict Clicks 
     samples : 5 Clicks 

Scikit tut es automatisch, ich versuche, einen Weg zu finden, es zu tun mit Spark

+0

Können Sie Scala verwenden? –

+0

@DanieldePaula, Ja ist es egal. – RoyaumeIX

+0

Ich habe eine Idee mit Scala. Ich werde mit dir teilen, wenn ich etwas Zeit habe –

Antwort

2

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.

+0

Das ist genau das, was ich will! – RoyaumeIX

+0

Hey Leute, habt ihr beide eine Lösung wie die DataFrame API? Siehe diese Frage für einige rep !: http://stackoverflow.com/questions/40558567/how-to-view-random-forest-statistics-in-spark-scala – rtcode