ディシジョン ツリーの仕組み
Gli デシジョンツリー は、教師あり ML アルゴリズムであり、以下を通じて意思決定を行います。 ツリー構造に編成された一連の二項質問。各内部ノードは、 特徴に関する質問 (例: 「年齢 > 30?」)、各枝が答えを表し、各葉が 最終予想を表します。彼らの強さは、解釈可能性:できます フローチャートのようなディシジョン ツリーを読み、そのモデルがなぜそうなるのかを正確に理解する 彼はある決意をした。
アルゴリズムは、各ノードで特徴としきい値を選択してツリーを構築します。 彼らはより良く分離します データをより均質なサブグループに分割します。この再帰的なプロセスは、到達するまで継続されます。 停止基準(最大深さ、リーフあたりのサンプルの最小数、リーフの純度)。
この記事で学べること
- デシジョンツリーが分割ルールを構築する方法
- エントロピー、情報利得、ジニ不純物
- ID3、C4.5、および CART アルゴリズム
- ランダム フォレスト: アンサンブルの力
- 特徴の重要性とモデルの解釈
- 過剰適合を避けるための枝刈りテクニック
エントロピーと情報利得
L'エントロピ データセット内の無秩序 (または不確実性) を測定します。すべてを備えたデータセット 同じラベルのエントロピーは 0 (完全に純粋) ですが、データセットのラベルは均等に分散されています。 最大のエントロピーを持っています。ザ」情報獲得 特徴がどの程度エントロピーを低減するかを測定します。 データの分割に使用されます。ゲインが高いほど、分割が適切になります。
La ジニ不純物 これはエントロピーに代わるものであり、計算が高速です。 ランダムなサンプルを割り当てた場合に誤って分類される確率を測定します。 ノード内のクラス分布に基づくランダムなラベル。 CART (scikit-learn で使用) を使用する Gini はデフォルトで、ID3 と C4.5 はエントロピーを使用します。
from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
# Caricare dataset
iris = load_iris()
X, y = iris.data, iris.target
feature_names = iris.feature_names
target_names = iris.target_names
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Albero con Gini (default)
tree_gini = DecisionTreeClassifier(
criterion='gini',
max_depth=3,
min_samples_split=5,
min_samples_leaf=2,
random_state=42
)
tree_gini.fit(X_train, y_train)
# Albero con Entropy
tree_entropy = DecisionTreeClassifier(
criterion='entropy',
max_depth=3,
random_state=42
)
tree_entropy.fit(X_train, y_train)
# Valutazione
for name, tree in [("Gini", tree_gini), ("Entropy", tree_entropy)]:
y_pred = tree.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"{name} - Accuracy: {acc:.3f}")
# Visualizzazione testuale dell'albero
print("\nStruttura dell'albero (Gini):")
print(export_text(tree_gini, feature_names=list(feature_names)))
樹木の過剰適合と剪定
決定木は特に影響を受けやすい過学習: 制限なし、 木はトレーニング サンプルごとに 1 つの葉を持つまで成長し、学習することができます。 一般化可能なパターンを学習するのではなく、データを活用します。の 剪定 (剪定)は ツリーの複雑さを制限するための一連のテクニック。
Il 剪定前 (早期停止) 建設中のツリーを制限します: 深さ
最大(max_depth)、分割ごとの最小サンプル数 (min_samples_split)、
リーフごとの最小サンプル数 (min_samples_leaf)。の 剪定後
完全なツリーを構築し、検証セットのパフォーマンスを向上させないブランチを削除します。
Scikit-learn はパラメータを提供します ccp_alpha (コストの複雑さによる枝刈り) 枝刈り後のもの。
ランダムフォレスト: 木のアンサンブル
Il ランダムフォレスト それはアルゴリズムです アンサンブル 何百ものものを組み合わせたもの より正確で安定した予測を取得するためのデシジョン ツリーの作成。それぞれの木が訓練されています データのランダムなサブセットに基づいて (ブートストラップ サンプリング)、広告機能のランダムなサブセットを使用します すべての分割。最終的な予測は多数決 (分類) または平均 (回帰) です。 すべての木々の。
この二重のランダム化により、 分散 バイアスを増やさずに: すべての ツリーは不正確かもしれませんが、全体ははるかに堅牢です。ザ」バッグから出した状態 (OOB) エラー 別の検証セットを使用せずに汎化誤差を推定できます。 各ツリーのブートストラップで選択されていないサンプルを利用します。
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
# Dataset
data = load_breast_cancer()
X, y = data.data, data.target
feature_names = data.feature_names
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Random Forest
rf = RandomForestClassifier(
n_estimators=200, # 200 alberi
max_depth=10, # profondità' massima
min_samples_split=5,
oob_score=True, # OOB error estimation
random_state=42,
n_jobs=-1 # usa tutti i core
)
rf.fit(X_train, y_train)
# Performance
y_pred = rf.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred):.3f}")
print(f"OOB Score: {rf.oob_score_:.3f}")
# Feature Importance - quali feature contano di più'?
importances = rf.feature_importances_
sorted_idx = np.argsort(importances)[::-1]
print("\nTop 10 Feature Importance:")
for i in range(10):
idx = sorted_idx[i]
print(f" {feature_names[idx]:<30s} {importances[idx]:.4f}")
機能の重要性: モデルの解釈
ツリーとランダム フォレストの最も貴重な特性の 1 つは、 特徴 重要性: 各特徴が予測にどの程度寄与しているかを定量化する機能。 scikit-learn では、重要度は平均的な不純物の減少 (ジニまたはエントロピー) として計算されます。 森のすべての木のそれぞれの特徴が寄与しています。
これは、ドメインの理解、機能の選択、コミュニケーションにとって重要です。 結果の。機能の重要性がゼロに近い場合は、機能なしで削除できる可能性があります。 パフォーマンスの低下を防ぎ、モデルを簡素化し、過剰適合のリスクを軽減します。
単一ツリーとランダム フォレスト: 単一のツリーは解釈可能ですが不安定です (データの小さな変更により、非常に異なるツリーが生成されます)。ランダムフォレストは解釈可能性を犠牲にします より安定した正確な予測を得るために直接使用します。実際には、ランダム フォレストはほぼ 常に望ましいものであり、機能の重要性によって解釈可能性の損失が補われます。
デシジョン ツリーを使用する場合
デシジョン ツリーとランダム フォレストは、解釈可能なモデルが必要な場合や機能が必要な場合に優れています。 スケールが異なる場合 (正規化は必要ありません)、データ内に非線形関係がある場合、および すぐに実装できる優れたベースラインが必要です。まばらな特徴が多く含まれるデータセットにはあまり適していません (テキスト マイニングなど)、または特徴とターゲットの間の関係が非常に線形である場合 ( 線形回帰の方が効率的です)。
重要なポイント
- デシジョン ツリーは、エントロピーまたはジニ不純物に基づいて再帰的分割を使用します
- 情報ゲインは各分割の品質を測定します。高いほど優れています。
- 過剰適合を避けるためにプルーニング (前後) が不可欠です
- ランダム フォレストは、ブートストラップとランダム化された機能を備えた何百ものツリーを組み合わせます。
- OOB エラーは、別個の検証セットを使用せずに一般化を推定します。
- 特徴の重要性により、どの変数がモデルの予測を駆動するかが明らかになります







