의사결정나무의 작동 방식
그만큼 의사결정 트리 감독되는 ML 알고리즘은 다음을 통해 결정을 내립니다. 트리 구조로 구성된 일련의 이진 질문입니다. 각 내부 노드는 기능에 대한 질문(예: "Age > 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)))
나무의 과적합과 가지치기
의사결정나무는 특히 다음과 같은 영향을 받기 쉽습니다.과적합: 제한 없음, 나무는 각 훈련 샘플에 대해 하나의 잎을 갖도록 성장할 수 있습니다. 일반화 가능한 패턴을 학습하는 대신 데이터. 그만큼 전정 (가지치기)는 트리의 복잡성을 제한하기 위한 일련의 기술입니다.
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}")
기능 중요성: 모델 해석
트리와 랜덤 포레스트의 가장 귀중한 특성 중 하나는 특징 중요성: 각 기능이 예측에 얼마나 기여하는지 정량화하는 기능입니다. scikit-learn에서 중요도는 평균 불순물 감소(Gini 또는 엔트로피)로 계산됩니다. 숲의 모든 나무의 각 특징이 기여합니다.
이는 도메인 이해, 기능 선택 및 커뮤니케이션에 중요합니다. 결과의. 기능의 중요성이 거의 0에 가까우면 해당 기능 없이도 제거될 수 있습니다. 성능 손실, 모델 단순화 및 과적합 위험 감소.
단일 트리 대 랜덤 포레스트: 단일 트리는 해석 가능하지만 불안정합니다. (데이터의 작은 변화로 인해 매우 다른 트리가 생성됩니다). Random Forest는 해석성을 희생합니다. 훨씬 더 안정적이고 정확한 예측을 얻을 수 있습니다. 실제로 Random Forest는 거의 항상 바람직하며 특징 중요성은 해석 가능성의 손실을 보상합니다.
의사결정나무를 사용해야 하는 경우
의사결정 트리와 랜덤 포레스트는 해석 가능한 모델이 필요할 때, 기능이 필요할 때 탁월합니다. 데이터에 비선형 관계가 있을 때와 신속하게 구현할 수 있는 좋은 기준선을 원합니다. 희소한 특성이 많은 데이터 세트에는 적합하지 않습니다. (예: 텍스트 마이닝) 또는 기능과 대상 간의 관계가 매우 선형적인 경우(예: 선형 회귀가 더 효율적입니다.)
핵심 사항
- 의사결정 트리는 엔트로피 또는 지니 불순물을 기반으로 재귀 분할을 사용합니다.
- 정보 이득은 각 분할의 품질을 측정합니다. 높을수록 좋습니다.
- 과적합을 방지하려면 가지치기(사전 및 사후)가 필수적입니다.
- Random Forest는 수백 개의 나무를 부트스트랩 및 무작위 기능과 결합합니다.
- OOB 오류는 별도의 검증 세트 없이 일반화를 추정합니다.
- 특성 중요도는 모델 예측을 주도하는 변수를 나타냅니다.







