Loading
Loading
Random Forest is one of the most powerful and reliable ML algorithms in practice. Instead of one tree that might be wrong, we build hundreds of trees and take the majority vote.
The ~37% of data not used by each tree acts as a free validation set ā no need for a separate validation split.
ā Tabular data ā outperforms most algorithms ā Minimal preprocessing needed ā Built-in feature importance ā Missing values tolerance
ā Images/text (use Deep Learning) ā Need full interpretability
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score, classification_report
from sklearn.datasets import make_classification
print("=" * 55)
print("Random Forest: Ų§ŁŁ
ŁŲ§Ų±ŁŲ© Ł
Ų¹ Decision Tree")
print("=" * 55)
# ŲØŁŲ§ŁŲ§ŲŖ Ł
Ų¹ŁŲÆŲ©
X, y = make_classification(
n_samples=2000, n_features=20, n_informative=10,
n_redundant=5, random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
# 1. Decision Tree ŁŁŁ
ŁŲ§Ų±ŁŲ©
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
dt = DecisionTreeClassifier(random_state=42)
dt.fit(X_train, y_train)
dt_train = accuracy_score(y_train, dt.predict(X_train))
dt_test = accuracy_score(y_test, dt.predict(X_test))
print(f"\nDecision Tree:")
print(f" Train Accuracy: {dt_train:.3f}")
print(f" Test Accuracy: {dt_test:.3f}")
print(f" Overfit gap: {dt_train - dt_test:.3f}")
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
# 2. Random Forest
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
rf = RandomForestClassifier(
n_estimators=200,
max_features="sqrt",
oob_score=True,
n_jobs=-1,
random_state=42
)
rf.fit(X_train, y_train)
rf_train = accuracy_score(y_train, rf.predict(X_train))
rf_test = accuracy_score(y_test, rf.predict(X_test))
print(f"\nRandom Forest (200 trees):")
print(f" Train Accuracy: {rf_train:.3f}")
print(f" Test Accuracy: {rf_test:.3f}")
print(f" OOB Score: {rf.oob_score_:.3f} ā Ł
Ų¬Ų§ŁŁ!")
print(f" Overfit gap: {rf_train - rf_test:.3f}")
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
# 3. ŲŖŲ£Ų«ŁŲ± Ų¹ŲÆŲÆ Ų§ŁŲ£Ų“Ų¬Ų§Ų±
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
print("\n3. ŲŖŲ£Ų«ŁŲ± Ų¹ŲÆŲÆ Ų§ŁŲ£Ų“Ų¬Ų§Ų± Ų¹ŁŁ Ų§ŁŲÆŁŲ©:")
for n in [1, 5, 10, 50, 100, 200, 500]:
rf_n = RandomForestClassifier(n_estimators=n, n_jobs=-1, random_state=42)
rf_n.fit(X_train, y_train)
acc = accuracy_score(y_test, rf_n.predict(X_test))
bar = "ā" * int(acc * 30)
print(f" n={n:4d}: {acc:.3f} {bar}")
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
# 4. Ų£ŁŁ
ŁŲ© Ų§ŁŁ
ŁŲ²Ų§ŲŖ
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
importance_df = pd.DataFrame({
"feature": [f"feature_{i}" for i in range(20)],
"importance": rf.feature_importances_
}).sort_values("importance", ascending=False)
print("\n4. Ų£ŁŁ
10 Ł
ŁŲ²Ų§ŲŖ:")
for _, row in importance_df.head(10).iterrows():
bar = "ā" * int(row["importance"] * 200)
print(f" {row['feature']:12s}: {row['importance']:.4f} {bar}")