0

私はSparkにRandomForestClassifierModelを持っています。 .toDebugString()を使用して出力し、次のSpark(scala)のランダムフォレスト統計を表示する方法

Tree 0 (weight 1.0): 
    If (feature 0 in {1.0,2.0,3.0}) 
    If (feature 3 in {2.0,3.0}) 
    If (feature 8 <= 55.3) 
. 
. 
    Else (feature 0 not in {1.0,2.0,3.0}) 
. 
. 
Tree 1 (weight 1.0): 
. 
. 
...etc 
私はそれがモデルを通過するように、実際のデータを表示したい

、各ノードのラベルの確率を見て

Tree 0 (weight 1.0): 
    If (feature 0 in {1.0,2.0,3.0}) 60% 
    If (feature 3 in {2.0,3.0}) 57% 
    If (feature 8 <= 55.3) 22% 
. 
. 
    Else (feature 0 not in {1.0,2.0,3.0}) 40% 
. 
. 
Tree 1 (weight 1.0): 
. 
...etc 

のようなもの、私はどの経路が木の中でデータ(何千ものレコード)によって追跡される可能性が高いことを知ることができます。これは本当に良い洞察になります!

私はここで素晴らしい答えを見つけました:Spark MLib Decision Trees: Probability of labels by features?

は、残念ながら、答えのメソッドはMLlibのAPIを使用し、しようと多くの後、私は別の実装を持っている、データフレームのAPIを使用して、それを複製することができませんでしたクラスNodeおよびSplit :(

+0

おそらく、mlパッケージのコードを見て元の回答を適応させることができます:https://github.com/apache/spark/blob/branch-2.0/mllib/src/main/scala/org/ apache/spark/ml/tree/Node.scala –

+1

私はコードを調べました。私はそれが可能であるかどうかは確かではありません(少なくとも、他の回答と同じ戦略ではない)。各ノードの分割の割合は、mlパッケージのプライベートな "不純物属性"属性の内側にあるためです。おそらく、ノードの可視属性を使用してこの属性をImpurityCalculatorで作成することは可能ですが、方法は見つけられません。 –

+0

@DanieldePaulaそれを見ていただきありがとうございます。私はむしろ、mllibを使うために私のパイプライン全体をリファクタリングしません。あなたの最後の提案を使って方法を見つけようとします。これまでのところ、私は森林のすべての木を配列で得ることができます。私はAPIを使ってこれをやりたいのですが、たくさんのクラスを書き直す必要はありません。あなたが他の解決策を思いついた場合は、私に知らせてください! – rtcode

答えて

0

私はspark.read.parquet()関数を使用して、モデル/データファイルからの出力を読み取ることができました。この方法で、特定のノードに関するすべての情報を取得できました全体のデータフレームとして。

`val modelPath = "some/path/to/your/model" 
val dataPath = modelPath + "/data"  
val nodeData: DataFrame = spark.read.parquet(dataPath) 
nodeData.show(500,false) 
nodeData.printSchema()` 

次に、情報でツリーを再構築できます。それが役に立てば幸い。

関連する問題