[解決済み] scikit-learnの決定木から決定規則を抽出する方法は?
2022-04-15 12:26:49
質問
決定木の学習済みツリーから、基本となる決定規則(または「決定パス」)をテキストリストとして抽出することは可能ですか?
のようなものです。
if A>0.4 then if B<0.2 then if C>0.8 then class='X'
解決方法は?
この回答は、他の回答よりも正しいと思います。
from sklearn.tree import _tree
def tree_to_code(tree, feature_names):
tree_ = tree.tree_
feature_name = [
feature_names[i] if i != _tree.TREE_UNDEFINED else "undefined!"
for i in tree_.feature
]
print "def tree({}):".format(", ".join(feature_names))
def recurse(node, depth):
indent = " " * depth
if tree_.feature[node] != _tree.TREE_UNDEFINED:
name = feature_name[node]
threshold = tree_.threshold[node]
print "{}if {} <= {}:".format(indent, name, threshold)
recurse(tree_.children_left[node], depth + 1)
print "{}else: # if {} > {}".format(indent, name, threshold)
recurse(tree_.children_right[node], depth + 1)
else:
print "{}return {}".format(indent, tree_.value[node])
recurse(0, 1)
これは有効なPython関数をプリントアウトするものです。以下は、入力である0から10の間の数を返そうとする木の出力例です。
def tree(f0):
if f0 <= 6.0:
if f0 <= 1.5:
return [[ 0.]]
else: # if f0 > 1.5
if f0 <= 4.5:
if f0 <= 3.5:
return [[ 3.]]
else: # if f0 > 3.5
return [[ 4.]]
else: # if f0 > 4.5
return [[ 5.]]
else: # if f0 > 6.0
if f0 <= 8.5:
if f0 <= 7.5:
return [[ 7.]]
else: # if f0 > 7.5
return [[ 8.]]
else: # if f0 > 8.5
return [[ 9.]]
他の回答で見かけたつまずきを紹介します。
-
使用方法
tree_.threshold == -2
を使用して、ノードが葉であるかどうかを決定するのは良いアイデアではありません。しきい値が-2の本当の判定ノードだったらどうする?その代わりにtree.feature
またはtree.children_*
. -
ライン
features = [feature_names[i] for i in tree_.feature]
は私のバージョンの sklearn ではクラッシュします。tree.tree_.feature
が -2 (特にリーフノード) である。 - 再帰関数内に複数のif文がある必要はなく、1つで良い。
関連
-
python string splicing.join()とsplitting.split()の説明
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] os/path 形式に関係なく、パスからファイル名を抽出します。
-
[解決済み] リストの順番を維持したまま、重複を削除するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
python call matlab メソッドの詳細
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
PyQt5はユーザーログインGUIインターフェースとログイン後のジャンプを実装しています。
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
-
[解決済み] scikit-learnで決定木を可視化する