satopoooonのブログ

自分向けの備忘録

kaggleに挑戦その3 ランダムフォレストを可視化

決定木の可視化

決定木の利点としては、意味解釈可能性があります。
ランダムフォレストで作成された決定木を可視化して、その意味を解釈しようと思います。

scikit-learnには、決定木を.dotファイルとしてエクスポートする機能があります。
その前に、.dotファイルを使うために、自分のパソコンにGraphVizをインストールします。

pip install pydotplus
brew install Graphviz

ランダムフォレストで作成された決定木を.dotファイルにエクスポートします。

#ランダムフォレストを作成
from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(criterion="entropy",n_estimators = 100)

forest = forest.fit(x_train,y_train)

#dotファイルを出力
from sklearn import tree
for i,val in enumerate(forest.estimators_):
    tree.export_graphviz(forest.estimators_[i], out_file='tree_%d.dot'%i)

ファイルが出力されたら、コマンドライン上で.dotファイルを.pngファイルに変換します。
例として、最初の決定木をpngファイルにしてみます。
>dot -Tpng tree_0.dot -o tree.png

実際のファイルは以下です。

f:id:satopoooon:20171218221628p:plain
決定木
どういうロジックでTrue or Falseが分岐しているか、一目瞭然ですね。

一番大事な変数は?

scikit-learnのfeature_importancesを使うことにより、重要は変数がわかります。
重要変数は各変数での分岐の際に、情報エントロピーの差分を各決定木で平均させて、求められます。

titanic_df_main_random_forest_df =  titanic_df_main_random_forest.drop("Survived",axis = 1).columns
importances_df  = forest.feature_importances_
random_forest_df  = pd.DataFrame({"変数":titanic_df_main_random_forest_df,"corr":importances_df})
random_forest_df= random_forest_df.sort_values(by = "corr",ascending=False)
sns.barplot(x = "変数",y = "corr",data = random_forest_df)

f:id:satopoooon:20171219225107p:plain

一番重要な変数は、Ageのようですね。