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
実際のファイルは以下です。どういうロジックで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)
一番重要な変数は、Ageのようですね。