Home »
Blog »
AI/ML Engineer সিরিজ » Series 05 » Episode 06
Decision Tree ও Random Forest: নিয়ম দিয়ে সিদ্ধান্ত
শক্ত tabular baseline (Series 05, Episode 06)
🟡 INTERMEDIATE
Series 05 — Classical Machine Learning
Episode 06 / 11
📑 এই পর্বে যা যা আছে
- ১. গল্প: ডাক্তারের প্রশ্ন করার ধরন
- ২. সমস্যা: Logistic Regression যেখানে আটকায়
- ৩. Decision Tree কী? (৩ স্তরে)
- ৪. Tree কীভাবে ভাগ (split) করে
- ৫. Visual: একটা churn decision tree
- ৬. Overfitting — একা tree-র দুর্বলতা
- ৭. Random Forest — অনেক tree-র ভোট
- ৮. কেন Forest variance কমায়
- ৯. কোড: Tree vs Forest (Churn P3)
- ১০. Feature Importance
- ১১. Boss Question ও Bangladesh উদাহরণ
- ১২. Job Requirement Decoder
- ১৩. সাধারণ ভুল
- ১৪. Interview Prep
- ১৫. হাতে-কলমে
- ১৬. Project Connection ও সারসংক্ষেপ
🩺 ১. গল্প: ডাক্তারের প্রশ্ন করার ধরন
Rahim অসুস্থ হয়ে ডাক্তারের কাছে গেল। ডাক্তার একটার পর একটা প্রশ্ন করলেন: "জ্বর আছে?" → হ্যাঁ →
"কতদিন?" → ৩ দিন → "কাশি?" → না → ... প্রতিটা উত্তর পরের প্রশ্ন ঠিক করে দিল, শেষে একটা সিদ্ধান্তে
পৌঁছালেন। Nila বলল — "এটাই Decision Tree। হ্যাঁ/না প্রশ্নের একটা গাছ, প্রতিটা
শাখায় data ভাগ হয়, পাতায় গিয়ে সিদ্ধান্ত।"
Rahim: "কিন্তু Logistic Regression তো আছেই, নতুন এটা কেন?"
Nila: "Logistic Regression একটা সোজা রেখা টানে (linear boundary)। কিন্তু বাস্তব সম্পর্ক প্রায়ই
আঁকাবাঁকা (non-linear)। Tree সেই আঁকাবাঁকা pattern ধরতে পারে, আর scaling ছাড়াই চলে,
মিশ্র feature (সংখ্যা + category) সামলায়। এজন্যই tabular data-তে এত জনপ্রিয়।"
❓ ২. সমস্যা: Logistic Regression যেখানে আটকায়
- Non-linear সম্পর্ক: "tenure কম এবং bill বেশি হলে churn" — এমন শর্তযুক্ত (conditional) pattern linear model ভালো ধরে না।
- Feature interaction: দুটো feature একসাথে যে প্রভাব ফেলে, আলাদাভাবে নয়।
- Scaling নির্ভরতা: Logistic-এ scaling লাগে; tree-তে লাগে না।
Decision Tree এই তিনটাই সহজে সামলায়। তবে একা tree-র নিজের একটা বড় সমস্যা আছে — overfitting।
সেটার সমাধানই Random Forest। চলুন ধাপে ধাপে দেখি।
🌳 ৩. Decision Tree কী? (৩ স্তরে)
Level 1 — intuition: একগুচ্ছ হ্যাঁ/না প্রশ্নের গাছ। উপর থেকে শুরু করে প্রতিটা প্রশ্নের
উত্তর অনুযায়ী নিচে নামুন; পাতায় (leaf) পৌঁছালে সেটাই উত্তর (churn / no-churn)।
Level 2 — technical: প্রতিটা node-এ model এমন একটা feature ও threshold বাছে যেটা data-কে
সবচেয়ে "বিশুদ্ধভাবে" (pure) ভাগ করে — অর্থাৎ ভাগের পর প্রতি দলে একটা class প্রাধান্য পায়।
বিশুদ্ধতা মাপে Gini impurity বা entropy। এভাবে recursively ভাগ চলে।
Level 3 — Engineer perspective: একক Decision Tree খুব interpretable (Boss-কে সরাসরি
গাছ দেখানো যায়), কিন্তু একা এটি সহজে overfit করে ও unstable। তাই production-এ আমরা প্রায় সবসময়
ensemble (Random Forest / Gradient Boosting) ব্যবহার করি — যেখানে অনেক tree মিলে
সিদ্ধান্ত নেয়। tabular data-তে এই ensemble-ই আজও বেশিরভাগ সময় সেরা baseline।
✂️ ৪. Tree কীভাবে ভাগ (split) করে
Impurity = একটা দলে কতটা "মিশ্রণ"। সব churn হলে impurity ০ (বিশুদ্ধ); ৫০-৫০ হলে সর্বোচ্চ।
Tree প্রতি split-এ সেই feature+threshold বাছে যেটা impurity সবচেয়ে বেশি কমায়।
১০০ customer (৫০ churn, ৫০ stay) — impurity বেশি
|
"tenure < 6 মাস?" <- এই প্রশ্ন impurity সবচেয়ে কমায়
/ \
হ্যাঁ (৪০) না (৬০)
(৩৫ churn) (১৫ churn) <- দুই দল এখন অনেক "বিশুদ্ধ"
🖼️ ৫. Visual: একটা churn decision tree
[tenure < 6 মাস?]
/ \
হ্যাঁ না
/ \
[support_calls > 3?] [monthly_bill > 80?]
/ \ / \
CHURN STAY CHURN STAY
এটাই tree-র সৌন্দর্য: সিদ্ধান্তের পথ পরিষ্কার দেখা যায়, ব্যাখ্যা করা যায়।
📉 ৬. Overfitting — একা tree-র দুর্বলতা
Tree-কে যদি যত ইচ্ছা গভীর হতে দেন (max_depth সীমাহীন), সে প্রতিটা training row-কে আলাদা পাতায় বসিয়ে
দেবে — training accuracy ১০০%, কিন্তু নতুন data-তে ভয়ংকর খারাপ। এটাই overfitting
(E08-এ বিস্তারিত): model মুখস্থ করেছে, শেখেনি।
একা tree-র দুই দুর্বলতা: (১) সহজে overfit করে, (২) unstable — data সামান্য বদলালে গাছ পুরো বদলে যায়
(high variance)। এই দুটোরই সমাধান — অনেক tree একসাথে: Random Forest।
🌲 ৭. Random Forest — অনেক tree-র ভোট
একজন ব্যক্তির মত ভুল হতে পারে, কিন্তু ১০০ জন বিশেষজ্ঞের ভোট সাধারণত ভালো — এটাই "wisdom of the crowd"।
Random Forest ঠিক এটা করে:
- data-র বিভিন্ন random নমুনা (bootstrap) দিয়ে অনেকগুলো tree বানায়।
- প্রতি split-এ feature-এরও একটা random subset দেখে — তাই tree-গুলো একে অপরের থেকে ভিন্ন।
- Classification-এ tree-দের majority vote; regression-এ তাদের গড়।
এই কৌশলের নাম Bagging (Bootstrap Aggregating)। মূল কথা: অনেক ভিন্ন tree-র ভুল
একে অপরকে কাটাকাটি করে, ফলে সম্মিলিত prediction অনেক স্থিতিশীল।
🎲 ৮. কেন Forest variance কমায়
একা Tree
high variance — data বদলালে গাছ বদলায়, নতুন data-তে অস্থির।
Random Forest
অনেক ভিন্ন tree-র গড়/ভোট → individual ভুল একে অপরকে বাতিল করে → low variance, ভালো generalization।
Interview-তে এটা প্রায়ই আসে: "Random Forest কীভাবে variance কমায়?" — উত্তর: একাধিক
de-correlated (bootstrap + random feature দিয়ে ভিন্ন) tree-র prediction গড়/ভোট করে,
তাই কোনো এক tree-র random ভুল সম্মিলিত ফলাফলে চাপা পড়ে যায়।
💻 ৯. কোড: Tree vs Forest (Churn P3)
কেন scikit-learn? DecisionTreeClassifier ও RandomForestClassifier
একই fit/predict API; scaling ছাড়াই চলে:
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import f1_score, roc_auc_score
# E04-এর X_train, X_test, y_train, y_test ব্যবহার করছি
# (Tree/Forest-এ scaling লাগে না, তাই raw X ঠিক আছে)
# একা tree — গভীর হতে দিলে overfit
tree = DecisionTreeClassifier(max_depth=None, random_state=42)
tree.fit(X_train, y_train)
tree_pred = tree.predict(X_test)
print("Tree F1 :", f1_score(y_test, tree_pred))
# Random Forest — ১০০টা tree-র ensemble
rf = RandomForestClassifier(
n_estimators=100, # কতগুলো tree
max_depth=5, # প্রতিটা tree-র গভীরতা সীমিত
random_state=42,
class_weight="balanced" # imbalanced churn সামলাতে
)
rf.fit(X_train, y_train)
rf_pred = rf.predict(X_test)
rf_proba = rf.predict_proba(X_test)[:, 1]
print("Forest F1 :", f1_score(y_test, rf_pred))
print("Forest ROC-AUC:", roc_auc_score(y_test, rf_proba))
সাধারণত Random Forest একা Tree-র চেয়ে ভালো ও স্থিতিশীল F1/AUC দেবে। n_estimators
(tree সংখ্যা) ও max_depth হলো মূল hyperparameter — এগুলো টিউন করা E08-এর বিষয়।
🔍 ১০. Feature Importance
Random Forest-এর দারুণ bonus — কোন feature সিদ্ধান্তে সবচেয়ে গুরুত্বপূর্ণ, সেটা বলে দেয়:
import pandas as pd
importances = pd.Series(
rf.feature_importances_, index=X_train.columns
).sort_values(ascending=False)
print(importances)
# উদাহরণ:
# tenure_months 0.52 <- churn-এ সবচেয়ে বড় factor
# support_calls 0.31
# monthly_bill 0.17
সতর্কতা: feature importance "কোনটা predictive" বলে, "কোনটা কারণ (cause)" বলে না।
correlation ≠ causation। তবু Boss-কে "tenure সবচেয়ে বড় churn factor" দেখানোর জন্য এটা অসাধারণ।
💼 ১১. Boss Question ও Bangladesh উদাহরণ
Boss: "এত tree বানিয়ে সময়/খরচ বাড়ছে — লাভ কী?"
উত্তর: "একা tree দ্রুত কিন্তু অস্থির — আজ একরকম, কাল আরেকরকম সিদ্ধান্ত। Random Forest
একটু ভারী, কিন্তু নির্ভরযোগ্য ও বেশি সঠিক। churn-এ ২% বেশি recall মানে হাজারো customer বেঁচে যাওয়া।
আর feature importance আপনাকে বলবে কেন customer চলে যাচ্ছে — যেটা দিয়ে আপনি product-ই ঠিক করতে পারবেন।"
- bKash: fraud detection-এ Random Forest একটা শক্ত baseline।
- Daraz: return prediction, credit scoring।
- কৃষি/health startup: tabular sensor/patient data-তে tree-based model সবচেয়ে সহজ ও কার্যকর।
🔎 ১২. Job Requirement Decoder
JD: "Hands-on with tree-based models (Decision Trees, Random Forest) for tabular data."
১. কী বোঝায়? tree ও ensemble model বানানো, টিউন করা, ব্যাখ্যা করা।
২. কেন চায়? বাংলাদেশের বেশিরভাগ ML সমস্যা tabular; tree-based model সেখানে সেরা baseline।
৩. কোন সমস্যা সমাধান করে? non-linear pattern, feature interaction, scaling-ঝামেলা ছাড়াই ভালো accuracy।
৪. junior-এর কী জানা লাগে? split intuition, overfitting, Random Forest কীভাবে variance কমায়, feature_importance, মূল hyperparameter।
৫. এখনই master লাগবে না: Gini vs entropy-র গণিত, out-of-bag error-এর গভীরতা।
৬. GitHub-এ কীভাবে দেখাবে? Churn notebook-এ Tree vs Forest তুলনা + feature importance bar chart।
৭. Interview: "Random Forest variance কমায় কীভাবে?", "Bagging কী?", "একা tree কেন overfit করে?"
⚠️ ১৩. সাধারণ ভুল
ভুল ১: Tree/Forest-এ scaling করা → দরকার নেই (তবে ক্ষতিও নেই); Logistic/SVM-এ লাগে।
ভুল ২: max_depth সীমাহীন রেখে একা tree ব্যবহার → নিশ্চিত overfit।
ভুল ৩: feature importance-কে causation ভাবা → শুধু predictive গুরুত্ব, কারণ নয়।
ভুল ৪: imbalanced churn-এ class_weight না দেওয়া → majority class-এ ঝুঁকে যায়।
ভুল ৫: Random Forest-কে "সবসময় সেরা" ভাবা → খুব high-dimensional sparse (text) data-তে অন্য approach ভালো হতে পারে।
🎤 ১৪. Interview Prep
প্র: Decision Tree কীভাবে split বাছে?
উ: যে feature+threshold impurity (Gini/entropy) সবচেয়ে বেশি কমায়।
প্র: একা tree কেন overfit করে?
উ: যথেষ্ট গভীর হলে training data মুখস্থ করে; high variance।
প্র: Random Forest কীভাবে variance কমায়?
উ: bootstrap + random feature দিয়ে বহু de-correlated tree বানিয়ে তাদের ভোট/গড় নেয়।
প্র: Bagging কী?
উ: Bootstrap Aggregating — random নমুনায় বহু model বানিয়ে aggregate করা; variance কমায়।
প্র: Random Forest interpretable?
উ: একা tree-র মতো পুরো পথ দেখানো কঠিন, কিন্তু feature_importance দিয়ে insight দেয়।
✍️ ১৫. হাতে-কলমে
১. Churn data-তে একা Tree (max_depth=None) আর Random Forest দুটোরই train ও test F1 বের করুন।
Tree-র training F1 কি test F1-এর চেয়ে অনেক বেশি? — এটাই overfitting-এর চিহ্ন।
২. Random Forest-এ n_estimators 10 → 100 → 300 বদলে দেখুন AUC কীভাবে বদলায়।
৩. feature_importances_ দিয়ে bar chart আঁকুন; কোন feature churn-এ সবচেয়ে গুরুত্বপূর্ণ বলুন।
🚀 ১৬. Project Connection ও সারসংক্ষেপ
Project P3 (Churn) এখন Random Forest দিয়ে আরও শক্তিশালী ও ব্যাখ্যাযোগ্য। flagship Career Assistant-এ
job-role classification বা skill prediction-এ Random Forest একটা দুর্দান্ত baseline হবে — বিশেষত
যখন আমাদের কাছে structured feature (experience, salary, skill count) থাকবে। পরের episode-এ আমরা
দেখব কীভাবে Gradient Boosting/XGBoost এই tree-ideaকে আরও এক ধাপ এগিয়ে নেয়।
এই Episode-এ শিখলাম:
✓ Decision Tree = হ্যাঁ/না প্রশ্নের গাছ; impurity কমিয়ে split করে
✓ Tree non-linear pattern ও feature interaction ধরে, scaling লাগে না
✓ একা tree সহজে overfit করে ও unstable (high variance)
✓ Random Forest = bagging দিয়ে বহু tree-র ভোট → variance কমে, stable
✓ feature_importance দিয়ে কোন feature গুরুত্বপূর্ণ বোঝা যায় (predictive, causal নয়)
✓ tabular data-তে Random Forest আজও সেরা baseline
পরবর্তী Episode: Gradient Boosting ও XGBoost — Kaggle জেতার অস্ত্র। bagging বনাম
boosting, আর কেন tabular data-তে এত শক্তিশালী।