2016-06-07 10 views
1

Nach dem Lernen eines mllib DecisionTree-Modells (http://spark.apache.org/docs/latest/mllib-decision-tree.html) wie berechne ich Knotenstatistiken, wie z. B. Unterstützung (wie viele Stichproben stimmen mit diesem Unterbaum überein) und wie viele Stichproben pro Etikett mit diesem Unterbaum übereinstimmen?Statistik für Spark mllib DecisionTree

Wenn es einfacher ist, nehme ich auch gerne ein anderes Tool als Spark, um den Debug-String zu nehmen und diese Statistiken zu berechnen. Beispiel für die Debug-string:

DecisionTreeModel classifier of depth 20 with 20031 nodes 
    If (feature 0 <= -35.0) 
    If (feature 24 <= 176.0) 
    If (feature 0 <= -200.0) 
    If (feature 29 <= 109.0) 
     If (feature 6 <= -156.0) 
     If (feature 9 <= 0.0) 
     If (feature 20 <= -116.0) 
     If (feature 16 <= 203.0) 
      If (feature 11 <= 163.0) 
      If (feature 5 <= 384.0) 
      If (feature 15 <= 325.0) 
      If (feature 13 <= -248.0) 
       If (feature 20 <= -146.0) 
       Predict: 0.0 
       Else (feature 20 > -146.0) 
       If (feature 19 <= -58.0) 
       Predict: 6.0 
       Else (feature 19 > -58.0) 
       Predict: 0.0 
      Else (feature 13 > -248.0) 
       If (feature 9 <= -26.0) 
       Predict: 0.0 
       Else (feature 9 > -26.0) 
       If (feature 10 <= 218.0) 
... 

Ich verwende mllib wegen Out-of-Core-Lernen, die ich brauche, weil die Daten nicht in den Speicher passen. Wenn Sie bessere Alternativen als MLLIB haben, bin ich glücklich, sie zu versuchen.

Antwort

0

Ich verwende sklearn als Algorithmus mein Modell zu erstellen, und mit Spark-Kontext zu integrieren, eine solche Ausgabe zu erzeugen:

if (device_type_id <= 1) 
    39 Clicks - 0.61% 
    2135 Conversions - 33.32% 
else (device_type_id > 1) 
    if (country_id <= 216) 
     1097 Clicks - 17.12% 
    else (country_id > 216) 
     if (browser_id <= 2) 
      296 Clicks - 4.62% 
     else (browser_id > 2) 
      if (browser_id <= 4) 
       if (browser_id <= 3) 
        if (operating_system_id <= 2) 
         262 Clicks - 4.09% 

Hier ist der Code, den ich einen solchen Baum anzuzeigen verwenden:

def get_code(count_df, tree, feature_names, target_names, spacer_base=" "): 
    left  = tree.tree_.children_left 
    right  = tree.tree_.children_right 
    threshold = tree.tree_.threshold 
    features = [feature_names[i] for i in tree.tree_.feature] 
    value = tree.tree_.value 
    temp_list = [] 
    res_count = count_df 
    def recurse(res_count, temp_list, left, right, threshold, features, node, depth): 
     spacer = spacer_base * depth 
     if (threshold[node] != -2): 
      temp_list.append("if (" + features[node] + " <= " + \ 
       str(int(round(threshold[node] - 1))) + ")") 
      if left[node] != -1: 
        recurse (res_count, temp_list, left, right, threshold, features, left[node], depth+1) 
      temp_list.append("else (" + features[node] + " > " + \ 
       str(int(round(threshold[node] - 1))) + ")") 
      if right[node] != -1: 
        recurse (res_count, temp_list, left, right, threshold, features, right[node], depth+1) 

     else: 
      target = value[node] 
      for i, v in zip(np.nonzero(target)[1], target[np.nonzero(target)]): 
       target_name = target_names[i] 
       target_count = int(v) 
       temp_list.append(str(target_count) +" "+ str(target_name) + " - " + str(round((target_count/res_count), 4) * 100)+ "%") 

    recurse(res_count, temp_list, left, right, threshold, features, 0, 0) 
    return temp_list 

Ansonsten, bitte beziehen Sie sich auf die Antwort in meinem Beitrag here zur Verfügung gestellt, aber es ist in Scala geschrieben, Ändern der Art und Weise Spark den Entscheidungsbaum zu generieren.

+0

Ich kann die Entscheidungsbäume von sklearn nicht verwenden, da sie kein Online/Out-of-Core-Training unterstützen. Aber die Ausgabe, die Sie erhalten, sieht aus, als könnte es sein, was ich will (Sie haben zwei Labels, Klicks und Conversions ist das richtig?). Können Sie Code bereitstellen, um diese Ausgabe zu erhalten? Kann ich es auch von einem Spark-Mllib-Modell bekommen? – DreamFlasher

+0

Ich habe meine Antwort aktualisiert. – RoyaumeIX

Verwandte Themen