決定木ダイアグラム(Decision Tree Diagram)
決定木について
「決定木」(decision tree)は、選択とその結果を根付き木として表現する分岐ダイアグラムです。各内部ノードは質問または決定、各エッジは回答またはアクション、各葉は結果です。このフォーマットは、かなり異なる 3 つの実践領域に登場します。トラブルシューティングのフローチャートと臨床判断ルール(分類木)、期待値を使ったリスクおよび投資分析(決定分析)、そして機械学習モデルの検査(分類器木)です。表面的な違いはありますが、3 つすべてが同じ木構造を共有しているため、Schematex はモードセレクタを持つ 1 つのキーワードの下にエンコードしています。
Schematex の決定木がカバーする範囲:(1) 分類モード — 医療トリアージで使われる yes/no 質問フロー(Turing 1937 の系統。現在は臨床意思決定支援の標準)、(2) 決定分析モード — 経営科学で開発された期待値ロールバック法(Raiffa & Schlaifer, 1961)、(3) ML モード — scikit-learn などの訓練済み分類器の可視化に使われる CART 分割/葉フォーマット(Breiman et al., 1984)。
1. 最初の決定木
最小限の実用的な決定木:2 つの分岐を持つルート質問。
使用法の 80% をカバーする 4 つのルール:
decisiontreeで始めます。オプションで:modeとクォートされたタイトル。- 各質問ノードは
question "text"(または短縮形q "text")を使用します。 - 各回答/葉は
answer "text"(またはa "text"またはleaf "text")を使用します。 - 分岐ラベル —
yes:、no:、またはカスタムlabel "X":— が同じ行の子ノードの前に付きます。
インデントがネストを制御します。各レベルはスペース 2 つを追加します。パーサーはインデントの深さから親子関係を計算します。
コメントは単独行で
#または//で始める必要があります。
2. モード
モードはヘッダ行で設定します:
| ヘッダ | モード | 用途 |
|---|---|---|
decisiontree | 分類 | Yes/no 質問フロー、トラブルシューティングガイド、臨床意思決定支援 |
decisiontree:decision(または decisiontree:da) | 決定分析 | 投資決定、リスク分析、期待値計算 |
decisiontree:influence(または mode: influence) | 影響図 | 決定問題のコンパクトな DAG ビュー — 木に展開する前の構造 |
decisiontree:ml | 機械学習 | 訓練済み CART 分類器の可視化(scikit-learn、XGBoost など) |
デフォルトの方向は分類と ML では top-down、決定分析では left-right です。
3. 分類モード
最適な用途:トラブルシューティングガイド、FAQ、臨床プロトコル、製品推奨フロー。
ノードキーワード
| キーワード | エイリアス | 意味 |
|---|---|---|
question "…" | q "…" | 内部ノード — 子を持つ質問 |
answer "…" | a "…", leaf "…" | 葉ノード — 最終的な結果 |
分岐ラベル
| 構文 | 意味 |
|---|---|
yes: question "…" | "yes" とラベルされた分岐 |
no: answer "…" | "no" とラベルされた分岐 |
label "Custom text": answer "…" | 任意のカスタムラベルを持つ分岐 |
カスタムラベルを使えば、1 つの質問から複数方向の決定に対して yes/no を超えたラベルを付けられます。
4. 決定分析モード
最適な用途:投資決定、自社開発 vs 外部調達分析、リスク加重戦略評価。
ノードキーワード
| キーワード | エイリアス | 意味 |
|---|---|---|
decision "…" | — | 決定ノード — アクターが分岐を選択 |
chance "…" | — | 確率ノード — 不確かな結果 |
end "…" | outcome "…" | 終端ノード — 最終的なペイオフ |
分岐キーワード
| キーワード | 意味 |
|---|---|
choice "label" | 決定ノードからの入力分岐に名前を付ける |
prob N | 確率ノードからの入力分岐に確率(0〜1)を設定する |
ペイオフ属性
任意のノードの payoff=N でペイオフ値を設定します。end / outcome ノードでは最終値を定義します。パーサーは期待値ロールバックを自動実行します。各 chance ノードの EV は子の EV の確率加重合計、各 decision ノードの EV は最大の子の EV となり、最適な分岐にフラグが付きます。
制約: chance ノードの直接の子の確率はすべて 1.0(±0.01)に合計される必要があります。そうでない場合、パーサーは DTreeParseError をスローします。
5. 影響図モード
最適な用途:決定問題を展開する前にコンパクトに枠組みすること。決定分析モードが各結果のすべての分岐を明示的な木として描くのに対し、影響図(Howard & Matheson, 1981)は同じ問題を変数とそれらの依存関係の有向非巡回グラフ(DAG)として描きます。各状態が何通りとれるかに関わらず、決定、不確実性、目的ごとに 1 つのノードを持ちます。何が何を通知し、何がペイオフに影響するかという構造を組み合わせ爆発なしに示せるため、意思決定分析者が最初に使うダイアグラムです。
このモードは構造的であり、計算的ではありません。 決定分析モードとは異なり、期待値を解くことはしません — コンパクトなグラフは EV ロールバックに必要な確率とペイオフのテーブルを意図的に省略しています。問題の形を伝えて検証するために使用し、数値を折りたたみたい場合は決定分析モード(セクション 4)を使用してください。
ヘッダ形式
モードを選択する 2 つの等価な方法:
decisiontree:influence "Oil Wildcatter"または、ヘッダの後の独立した行のディレクティブとして:
decisiontree "Market Entry"
mode: influenceノードキーワード
各ノードは kind Id "label" として宣言されます — アーク配線に使われる id の後にクォートされた表示ラベルが続きます。
| キーワード | 形状 | 意味 |
|---|---|---|
decision Id "…" | 矩形 | 意思決定者が制御する選択 |
chance Id "…" | 楕円 | 不確かな変数(世界の状態) |
value Id "…" | 八角形 | 最適化される目標 / ペイオフ |
形状は標準的な影響図の規則に従います:決定は矩形、不確実性は楕円、価値ノードは八角形。価値ノードに utility=N を追加すると、そのノードが表すペイオフにアノテーションを付けられます(value Profit "Net profit" utility=42)。
アークとその意味
アークはノード id で Source -> Target として独立した行に記述します。アークの意味は目的地から読み取られます、正確に発表された標準と同様に:
| アーク先 | 意味 | 描画方法 |
|---|---|---|
decision | 情報的 — これは決定が下される前にわかっている | 破線 |
chance | 関連性 / 条件 — ソースがこの不確実性を条件付ける | 実線 |
value | 機能的 — ソースはペイオフ関数の引数 | 実線 |
破線の情報的アークに注意してください:Seismic -> Drill は「地震テストの結果が掘削するかどうかを選択する前に観察される」ことを意味します。これがまさにモデル化する価値のある決定です。
検証ルール
- グラフは非巡回でなければなりません — サイクル(例:
A -> BとB -> A)は拒否されます。 - 少なくとも 1 つの
valueノードが必要です。目的のない影響図は決定問題ではありません。 - アークは宣言されたノード id を参照する必要があります。
例
オイルワイルドキャッター — 標準的な教育問題。地震テストの結果は掘削決定の前に観察されます(破線の情報的アーク Seismic -> Drill)。テストは実際に石油が存在するかどうかに関連します(Seismic -> Oil)。石油の状態と掘削の選択の両方が利益に影響します(Oil -> Profit、Drill -> Profit)。
mode: influence ディレクティブ形式を使用した市場参入決定。需要は参入前に観察されます(Demand -> Enter、情報的/破線)。また利益を直接駆動し、競合他社の反応はペイオフのみに影響します。
6. 機械学習モード
最適な用途:訓練済み CART 分類器の説明、モデル透明性レポート、特徴量重要度分析。
ノードキーワード
| キーワード | 意味 |
|---|---|
split "…" | 内部分割ノード — 特徴量テストを含む |
leaf "…" | 葉ノード — クラスまたは回帰値 |
分岐プレフィックス
true と false が子ノードの前に付き、各子が表す分岐をマークします。
プロパティ(key=value、コロンなし、値のクォートなし)
| プロパティ | 適用対象 | 意味 |
|---|---|---|
feature=name | split | 分割で使われる特徴量名 |
op="<=" | split | 比較演算子(特殊文字を含む場合はクォート) |
threshold=5.9 | split | 分割閾値 |
samples=150 | split, leaf | このノードのサンプル数 |
gini=0.5 | split, leaf | ジニ不純度 |
entropy=0.5 | split, leaf | エントロピー不純度 |
mse=0.3 | split, leaf | 平均二乗誤差(回帰) |
gain=0.2 | split, leaf | 情報利得 |
class=name | leaf | 予測されたクラス名 |
value=50 | leaf | サンプル数。クラス分布には value=[50,30,20] を使用 |
7. 設定オプション
設定行はヘッダと最初のノードの間に置きます。各行は key: value(コロン、config キーワードなし)です。
共通設定(全モード)
| キー | 値 | デフォルト | 効果 |
|---|---|---|---|
direction: | top-down、left-right | top-down(分類/ML)、left-right(決定) | レイアウト方向 |
edgeStyle:(または edge-style:) | diagonal、orthogonal、bracket | モード依存 | エッジ描画スタイル |
分類設定
| キー | 値 | デフォルト | 効果 |
|---|---|---|---|
branchLabels:(または branch-labels:) | boolean、relation | boolean | 分岐ラベルスタイル |
決定分析設定
| キー | 値 | デフォルト | 効果 |
|---|---|---|---|
branchLength:(または branch-length:) | probability | オフ | 確率に比例して分岐長をスケール |
ML 設定
| キー | 値 | デフォルト | 効果 |
|---|---|---|---|
impurity: | gini、entropy、mse、gain | gini | ノードに表示される不純度メトリクス |
classes: | カンマ区切りリスト | — | 表示用クラスラベル名 |
decisiontree:ml "Loan classifier"
direction: top-down
impurity: gini
classes: Approved, Denied, Review8. ラベルとコメント
- ダイアグラムタイトル:
decisiontree "Title"— ヘッダキーワードの後のクォートされた文字列。 - ノードラベル: ノードキーワードの直後のクォートされた文字列 —
question "Is the fee waived?"。 - 分岐ラベル:
yes:、no:、またはlabel "Custom":が子ノードの前 — 子と同じ行に。 - ペイオフ: 決定/end ノード行の末尾の
payoff=250000。 - ML プロパティ: ノードのラベル文字列の後の
key=valueトークン([…]ブラケットなし、=の周りにスペースなし)。 - コメント: 行の先頭(オプションの先頭空白の後)の
#または//。フルライン コメントのみサポート — インラインの末尾コメントは非対応。
9. 予約語とエスケープ
予約ノードキーワード: decision、chance、end、outcome、choice、prob、split、leaf、question、q、answer、a。
予約分岐プレフィックス: yes:、no:、true、false、label。
予約ヘッダ形式: decisiontree、decisiontree:decision、decisiontree:da、decisiontree:ml。
スペースを含む文字列はダブルクォートが必要です:question "Annual revenue > $1M?"。ノードラベル、label "…": 構文からの分岐ラベル、ダイアグラムタイトルはすべてダブルクォートが必要です。
| 予約トークン | コンテキスト | 備考 |
|---|---|---|
yes: / no: | 分類モードでの行頭 | ラベルとして使用不可 — リテラルテキスト "yes" が必要な場合は label "yes": を使用 |
true / false | ML モードでの行頭 | ノードラベルにはできない |
choice | 決定モードでの行頭 | ノードではなく分岐ラッパーとして機能 |
prob | 決定モードでの行頭 | 数値が続く必要がある |
10. よくあるミス
| 記述した内容 | パーサーの反応 | 修正方法 |
|---|---|---|
yes: "Approve"(ノードキーワードなし) | DTreeParseError: Missing taxonomy node kind | yes: answer "Approve" |
chance の子の確率が 0.8 に合計される | DTreeParseError: probabilities do not sum to 1.0 | 全 prob 値が正確に 1.0 になるよう調整(±0.01) |
question "text" の子が同じインデントレベル | 子として解析されず兄弟になる | 子を親より 2 スペース多くインデント |
config direction = top-down(config キーワードを使用) | config はフィッシュボーンのキーワード — ここでは認識されない | direction: top-down を使用(config プレフィックスなし) |
feature = petal_length(= の周りにスペース) | 個別のトークンとして解析。プロパティは認識されない | スペースなし:feature=petal_length |
[payoff: 500000] ブラケット構文 | 認識されない — パーサーはペイオフのブラケットを無視 | payoff=500000 を使用(ブラケットなし、= の周りにスペースなし) |
decisiontree:taxonomy | DTreeParseError: Invalid header | decisiontree を使用(分類にはモードサフィックスなし) |
11. 文法(EBNF)
document = header ( config-line )* node
header = "decisiontree" ( ":" mode )? ( WS quoted-string )? NEWLINE
mode = "decision" | "da" | "ml"
// omitted → taxonomy
config-line = config-key ":" WS config-value NEWLINE
config-key = "direction" | "edgeStyle" | "edge-style"
| "branchLabels" | "branch-labels"
| "branchLength" | "branch-length"
| "impurity" | "classes"
// ── Taxonomy mode ──────────────────────────────
node = ( branch-prefix WS )? tax-node ( WS "[" tax-attrs "]" )? NEWLINE
INDENT child-node*
tax-node = ( "question" | "q" ) WS quoted-string
| ( "answer" | "a" | "leaf" ) WS quoted-string
branch-prefix = "yes:" | "no:" | "label" WS quoted-string ":"
// ── Decision-analysis mode ─────────────────────
da-node = "decision" WS quoted-string NEWLINE INDENT da-child+
| "chance" WS quoted-string NEWLINE INDENT da-prob-child+
| ( "end" | "outcome" ) WS quoted-string ( WS "payoff=" number )? NEWLINE
da-child = "choice" WS quoted-string NEWLINE INDENT da-node
da-prob-child = "prob" WS number WS da-node // prob, value, and child all on one line
// ── ML mode ───────────────────────────────────
ml-node = ( "true" | "false" )? ml-kind WS quoted-string ml-prop* NEWLINE
INDENT ml-child*
// "true"/"false" and ml-kind must be on the same line
ml-kind = "split" | "leaf"
ml-prop = WS key "=" value // no spaces around "="
comment = ( "#" | "//" ) any NEWLINE
quoted-string = '"' any-char-but-quote* '"'権威ある情報源:src/diagrams/decisiontree/parser.ts。これがパーサーと異なる場合、パーサーが優先されます — イシューを開いてください。
12. 標準準拠
Schematex の決定木は 4 つの確立された規則をカバーします:
分類モードは臨床意思決定支援システム(Arden Syntax 系統)と ISO 9001 トラブルシューティング手順に共通する質問/回答フローチャート規則に従います。
決定分析モードは経営科学からの期待値ロールバック法に従います:決定ノード(四角、アクターが選択)、確率ノード(丸、確率的)、ペイオフ付き終端ノード。EV は後ろ向き帰納法(Raiffa & Schlaifer, 1961)によって自動計算されます。
影響図モードは Howard & Matheson (1981) の規則に従います:非巡回グラフとして配線された決定(矩形)、確率(楕円)、価値(八角形)ノード。アークの意味は目的地から読み取られます(決定への情報的アークは破線、確率への関連性アーク、価値への機能的アーク)。構造的なダイアグラムであり、EV を解くことはしません。
ML モードは CART(分類回帰木)の分割/葉表記(Breiman et al., 1984)に従い、scikit-learn の export_text と plot_tree の出力と互換性があります。
現在実装済みの内容:
- ✅ 4 つのモードすべて:分類、決定分析、影響図、ML
- ✅ 分類:
question/q、answer/a/leaf、yes:、no:、label "X":分岐ラベル - ✅ 決定:
decision、chance、end/outcome、choice、prob、payoff=N、自動 EV ロールバック - ✅ 影響図:
decision/chance/valueノード、utility=N、Source -> Targetアーク、目的地から導出されるアーク意味論、破線の情報的アーク、非巡回性 + 価値ノード検証 - ✅ ML:
split、leaf、true/false分岐プレフィックス、feature=、threshold=、gini=、entropy=、mse=、class=、value= - ✅ 設定:
direction:、edgeStyle:、impurity:、classes:、branchLabels:、branchLength:、mode: - ⏳ 確率加重分岐長レンダリング(
branchLength: probabilityは解析されるが視覚的にはまだ適用されない) - ⏳ 感度分析オーバーレイ(決定木上のトルネードチャートスタイルのアノテーション)
- ⏳ フォレスト/アンサンブルビュー — 複数の木を並べて表示
参考文献:
- Raiffa, H. & Schlaifer, R. (1961). Applied Statistical Decision Theory. Harvard Business School.
- Howard, R. A. & Matheson, J. E. (1981/2005). Influence Diagrams. Decision Analysis 2(3).
- Breiman, L. et al. (1984). Classification and Regression Trees. Wadsworth.
- Wikipedia — Decision tree · Influence diagram · Decision tree learning
13. ロードマップ
計画中 — まだ解析できません。 今日の生成 DSL では使用しないでください。パーサーが拒否または無視します。
branchLength: probabilityの視覚的レンダリング — 設定キーは解析されますが、レイアウトエンジンはまだ確率で分岐長をスケーリングしません。- 感度 / トルネード分析 — どの
prob値が最終的な EV に最も影響するかをアノテーションするsensitivity:ブロック。 - エクスポートアノテーション — ダイアグラム SVG とともに構造化テーブル出力(意思決定マトリックス)。
- フォレストビュー — 複数の
decisiontreeブロックを並べて比較レイアウトでラップするforestキーワード。 - 折りたたみ/展開インタラクティブマーカー — 深いサブツリーの三角形プレースホルダーをレンダリングするためのノードの
collapsed: true。
早急にこれらが必要な場合は GitHub イシューで追跡してください。
関連例
サンプルギャラリーからすぐに使えるシナリオ:
Found this useful?
Schematex is free, fully open source, and zero-dependency. A star helps other developers discover it.