コメントはまだありません概要Pythonにはscikit-learnという便利な機械学習モジュールがありますが、この中のtreeを使って学習した決定木構造がどこに格納されているのかが分かりにくかったので整理しました。以降では、scikit-learnが持っているサンプルデータ(iris)を使って決定木学習をしたデータを対象に確認していきます。学習した決定木構造は基本的にオブジェクトの.tree_メンバが保有しています。以下、取得したい情報別に、.tree_のどのメンバにアクセスすればいいかを列挙していきます。各ノードの分岐条件の変数名clf.tree_.featureと入力することで、各ノードの分岐条件の変数IDが取得できます。IDと名称の関係はiris.feature_namesが持っています。-2は分岐条件がないこと(リーフであること)を示します。dtype=int64)各ノードの分岐条件の閾値clf.tree_.thresholdと入力することで、各ノードの分岐条件の閾値が取得できます。scikit-learnのモジュールでは分岐の不等号の方向は常に≦で扱われるので省略されています。])各ノードの到達データの偏り度clf.tree_.impurityと入力することで、各ノードの分岐条件の偏り度が取得できます。指標は学習時に指定された指標(giniやinfoGain等)となるため省略されています。])各ノードの到達データ総数clf.tree_.n_node_samplesと入力することで、各ノードの到達データ総数が取得できます。dtype=int64)各ノードのクラス別到達データ数clf.tree_.valueと入力することで、各ノードのクラス別到達データ数が取得できます。順番とクラスの関係はiris.target_namesが持っています。43.]]])各ノードの最多数クラス残念ながら関数を持っていなさそうですが、clf.tree_.valueとnumpyのargmaxを使って計算できます。#私の環境では一旦転置しないとうまく動きませんでした。axis=0)以下が出力結果。順番とクラスの関係は上と同様にiris.target_namesが持っています。dtype=int64)木構造(各ノードの親子関係)clf.tree_.children_leftで左側の子ノードIDを、clf.tree_.children_rightで右側の子ノードIDを取得できます。clf.tree_.children_leftclf.tree_.children_right以下が出力結果。値が子ノードIDを示しており、リーフ(子ノードがない)は-1で表記されています。sequence(深さ方向探索)となっているようです。dtype=int64)まとめ決定木の可視化をgraphviz以外で実施したいなと考えたため、まずはscikit-learnで学習した決定木構造の抽出方法について整理しました。皆様のお役にも立てば幸いです。コメントをキャンセルメールアドレスが公開されることはありません。*サイト上に表示された文字を入力してください。プロフィール兵庫県在住の30代データサイエンティスト。Pythonを使った機械学習等によるデータ分析や、ウェブアプリ等のシステム開発に取り組んでいます。