Home »
Blog »
AI/ML Engineer সিরিজ » Series 05 » Episode 10
Feature Engineering: model-এর আসল শক্তি data থেকেই আসে
ভালো feature = ভালো model (Series 05, Episode 10)
🟡 INTERMEDIATE
Series 05 — Classical Machine Learning
Episode 10 / 11
📑 এই পর্বে যা যা আছে
- ১. গল্প: একই data, দুই engineer, ভিন্ন ফল
- ২. সমস্যা: model বদলেও accuracy বাড়ছে না
- ৩. Feature Engineering কী? (৩ স্তরে)
- ৪. Visual: raw data থেকে ভালো feature
- ৫. Categorical feature: encoding (One-Hot, Ordinal)
- ৬. Numeric feature: scaling, binning, transform
- ৭. নতুন feature তৈরি: ratio, date, domain feature
- ৮. কোড: ColumnTransformer + Pipeline (leakage-safe)
- ৯. Feature selection: কম feature, বেশি শক্তি
- ১০. Experiment: feature engineering-এর আগে ও পরে
- ১১. Bangladesh উদাহরণ ও Boss Question
- ১২. Job Requirement Decoder
- ১৩. সাধারণ ভুল (data leakage সহ)
- ১৪. Interview Prep
- ১৫. হাতে-কলমে
- ১৬. Project Connection ও সারসংক্ষেপ
📝 ১. গল্প: একই data, দুই engineer, ভিন্ন ফল
একই dataset, একই algorithm (Random Forest)। Rahim পেল ৭২% accuracy। Arif পেল ৮৬%। Rahim অবাক —
"কীভাবে? আমরা তো একই model, একই data ব্যবহার করেছি!"
Arif: "model আর data একই, কিন্তু আমি data-কে model-এর জন্য প্রস্তুত করেছি ভালোভাবে।
raw birth_date থেকে বানিয়েছি age; total_spent আর num_orders
থেকে বানিয়েছি avg_order_value; city-কে ঠিকভাবে encode করেছি। এটাই Feature
Engineering — আর এখানেই আসল ML দক্ষতা লুকিয়ে।"
একটা প্রবাদ আছে: "Better data beats fancier algorithms." — ভালো feature সাধারণ model-কেও
শক্তিশালী করে; খারাপ feature-এ সবচেয়ে দামি model-ও দুর্বল।
❓ ২. সমস্যা: model বদলেও accuracy বাড়ছে না
অনেক junior model বদলাতে থাকে (Logistic → Random Forest → XGBoost), আশা করে accuracy লাফিয়ে বাড়বে।
কিন্তু প্রায়ই ২-৩% এর বেশি বাড়ে না। কারণ সমস্যা model-এ নয়, feature-এ। model যা পায়
তার বেশি কিছু বের করতে পারে না।
Feature engineering মানে — কাঁচা data-কে এমন রূপ দেওয়া যাতে model-এর কাছে pattern স্পষ্ট হয়। এটাই
সাধারণত performance-এ সবচেয়ে বড় লাফ আনে।
🎯 ৩. Feature Engineering কী? (৩ স্তরে)
Level 1 — সহজ intuition
রান্নার আগে সবজি কাটা, ধোয়া, মসলা প্রস্তুত করার মতো। কাঁচা উপকরণ (raw data) সরাসরi রাঁধুনিকে (model)
দিলে ভালো রান্না হয় না। প্রস্তুত উপকরণ দিলে দারুণ রান্না।
Level 2 — technical ভাবে কী হচ্ছে
Feature engineering তিন কাজের সমষ্টি: (১) transformation — বিদ্যমান feature-কে
model-বান্ধব রূপে বদলানো (encoding, scaling); (২) creation — নতুন অর্থপূর্ণ feature
বানানো (ratio, date থেকে age); (৩) selection — অপ্রয়োজনীয় feature বাদ দেওয়া।
Level 3 — engineer perspective
Engineer feature engineering-কে দুই ভাগে করে: (ক) domain-knowledge feature — ব্যবসা বুঝে
হাতে বানানো (সবচেয়ে মূল্যবান); (খ) mechanical transform — encoding, scaling (স্বয়ংক্রিয়
করা যায়)। আর সবচেয়ে জরুরি — সব transform Pipeline-এ রাখা, যাতে training-এর সময়
শেখা মান (mean, category) দিয়ে test/production data রূপান্তরিত হয়, উল্টোটা নয় (leakage এড়ানো)।
🖼️ ৪. Visual: raw data থেকে ভালো feature
RAW DATA ENGINEERED FEATURES
----------------------- --------------------------
birth_date: 1998-05-10 --> age: 27
join_date : 2021-01-01 --> tenure_years: 4
total_spent: 60000 --> avg_order_value: 600
num_orders : 100 --> (= total_spent / num_orders)
city : "Dhaka" --> city_Dhaka:1, city_Ctg:0 ...
(One-Hot Encoding)
model raw data থেকে "age" নিজে বের করতে পারে না;
আমরা বানিয়ে দিলে pattern স্পষ্ট হয় -> accuracy বাড়ে
🔤 ৫. Categorical feature: encoding
Model সংখ্যা বোঝে, "Dhaka"/"Chattogram" নয়। তাই text category-কে সংখ্যায় বদলাতে হয়। দুই প্রধান উপায়:
- One-Hot Encoding: প্রতিটা category-র জন্য আলাদা 0/1 column। ক্রম নেই এমন
(nominal) feature-এর জন্য — যেমন city, department।
- Ordinal Encoding: category-কে ক্রমানুসারে সংখ্যা (0,1,2)। যেখানে স্বাভাবিক ক্রম
আছে — যেমন education: SSC < HSC < Bachelor < Master।
সতর্কতা: nominal feature-এ ভুলেও ordinal encoding দেবেন না। "Dhaka=0, Ctg=1, Sylhet=2"
করলে model ভাববে Sylhet > Dhaka — যা অর্থহীন এবং ভুল pattern শেখাবে। ক্রম না থাকলে One-Hot।
🔢 ৬. Numeric feature: scaling, binning, transform
- Scaling (StandardScaler/MinMaxScaler): distance বা gradient-নির্ভর model
(KNN, SVM, Logistic, neural net)-এ আবশ্যক। Tree-based model (RF, XGBoost)-এ সাধারণত লাগে না।
- Log transform: খুব skewed feature (যেমন salary, price — কয়েকজনের বিশাল মান)
log নিলে distribution সুষম হয়, model ভালো শেখে।
- Binning: continuous মানকে দলে ভাগ করা (age → "young/mid/senior")। কখনো kore
noise কমায় ও non-linear pattern ধরায়।
মনে রাখুন: কোন transform দরকার তা নির্ভর করে model-এর ধরন-এর উপর। Random
Forest-এ scaling অপ্রয়োজনীয়, কিন্তু Logistic Regression-এ জরুরি। "সব সময় scale করব" নয় — বুঝে করুন।
🛠️ ৭. নতুন feature তৈরি: ratio, date, domain feature
এখানেই সবচেয়ে বড় লাভ। কয়েকটা শক্তিশালী প্যাটার্ন:
import pandas as pd
df = pd.DataFrame({
"birth_date": pd.to_datetime(["1998-05-10", "1990-01-20"]),
"total_spent": [60000, 15000],
"num_orders": [100, 10],
})
today = pd.Timestamp("2025-01-01")
# ১. Date থেকে age (raw date model-এর কাজে আসে না)
df["age"] = (today - df["birth_date"]).dt.days // 365
# ২. Ratio feature (দুটো column মিলে অর্থপূর্ণ তৃতীয়টি)
df["avg_order_value"] = df["total_spent"] / df["num_orders"]
# ৩. Flag feature (domain rule)
df["is_high_value"] = (df["avg_order_value"] > 500).astype(int)
print(df[["age", "avg_order_value", "is_high_value"]])
avg_order_value = total_spent / num_orders — এই একটা derived feature প্রায়ই দুটো raw
feature-এর চেয়ে বেশি predictive। এটাই domain knowledge-এর শক্তি: আপনি ব্যবসাটা বোঝেন বলে model-কে
সাহায্য করতে পারছেন।
💻 ৮. কোড: ColumnTransformer + Pipeline (leakage-safe)
কেন Pipeline? কারণ encoding/scaling training data থেকে মান শেখে (যেমন mean, category তালিকা)। সেই
শেখা মান দিয়েই test/production data রূপান্তর হওয়া উচিত। Pipeline এটা স্বয়ংক্রিয়ভাবে ঠিক ক্রমে করে —
data leakage এড়ায়।
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
num_cols = ["age", "avg_order_value"]
cat_cols = ["city", "department"]
preprocess = ColumnTransformer([
("num", StandardScaler(), num_cols),
("cat", OneHotEncoder(handle_unknown="ignore"), cat_cols),
])
model = Pipeline([
("prep", preprocess),
("clf", RandomForestClassifier(random_state=42)),
])
# model.fit(X_train, y_train) -> prep শুধু train থেকে শেখে
# model.predict(X_test) -> সেই শেখা মান দিয়ে test রূপান্তর
handle_unknown="ignore" খুব দরকারি — production-এ যদি train-এ না-দেখা নতুন city আসে,
তাহলে crash না করে সেটা সব-শূন্য হিসেবে সামলায়। এটাই "production-aware" চিন্তা।
🎯 ৯. Feature selection: কম feature, বেশি শক্তি
সব feature সমান দরকারি নয়। অপ্রাসঙ্গিক feature noise বাড়ায়, overfit ঘটায়, model ধীর করে। কয়েকটা উপায়:
- Correlation/variance দেখে: প্রায় ধ্রুবক বা অতি-correlated feature বাদ।
- Model-based importance: Random Forest/XGBoost-এর
feature_importances_।
- SelectKBest: statistical test দিয়ে সেরা k feature।
import pandas as pd
model.fit(X_train, y_train)
rf = model.named_steps["clf"]
# One-Hot-এর পর feature নাম বের করা
names = model.named_steps["prep"].get_feature_names_out()
imp = pd.Series(rf.feature_importances_, index=names)
print(imp.sort_values(ascending=False).head(10))
🧪 ১০. Experiment: feature engineering-এর আগে ও পরে
নিজে যাচাই করুন feature engineering কত পার্থক্য আনে:
from sklearn.model_selection import cross_val_score
# A: শুধু raw feature (age/ratio ছাড়া)
score_raw = cross_val_score(
model, X_raw, y, cv=5, scoring="f1"
).mean()
# B: engineered feature সহ (age, avg_order_value, flags)
score_eng = cross_val_score(
model, X_engineered, y, cv=5, scoring="f1"
).mean()
print("raw f1 : %.3f" % score_raw)
print("engineered : %.3f" % score_eng)
print("উন্নতি : %.3f" % (score_eng - score_raw))
কী দেখবেন: সাধারণত engineered feature-এ score স্পষ্ট বেশি — অনেক সময় model বদলানোর
চেয়ে বড় লাফ। এই ফলটাই বুঝিয়ে দেয় কেন senior-রা বলে "সময়ের ৮০% data ও feature-এ দাও।"
🇧🇩 ১১. Bangladesh উদাহরণ ও Boss Question
একটা fintech credit-scoring model-এ raw feature ছিল "মোট লেনদেন" আর "লেনদেন সংখ্যা"। engineer নতুন
feature বানাল — "গড় লেনদেন", "শেষ ৩০ দিনে activity", "রাত ২টা-৪টার লেনদেনের হার (fraud signal)"।
model বদলায়নি, কিন্তু এই domain feature-গুলো fraud detection অনেক উন্নত করল। এটাই বাস্তব ML কাজের রূপ।
💼 Boss Question
Boss: "তুমি তো একই algorithm ব্যবহার করছ। তাহলে এই 'feature engineering'-এ আলাদা সময় দেওয়ার দরকার কী?"
উত্তর: "স্যার, model আমাদের data-র বাইরে কিছু জানে না। আমরা যদি ব্যবসার জ্ঞান দিয়ে
সঠিক feature বানিয়ে দিই — যেমন 'গড় খরচ' বা 'রাতের অস্বাভাবিক লেনদেন' — তখন model আসল সমস্যাটা ধরতে
পারে। প্রায়ই একটা ভালো feature নতুন দামি model কেনার চেয়েও বেশি accuracy আনে, খরচ ছাড়াই। এটাই সবচেয়ে
সস্তা ও কার্যকর performance boost — সরাসরি business value।"
🔎 ১২. Job Requirement Decoder
JD-তে দেখবেন: "Strong feature engineering skills; ability to create features from raw data."
১. কী বোঝায়? কাঁচা data থেকে model-বান্ধব, অর্থপূর্ণ feature বানাতে পারেন।
২. কেন চায়? বাস্তবে performance-এর সবচেয়ে বড় লাফ feature থেকে আসে, model থেকে নয়।
৩. কোন সমস্যা সমাধান করে? "model বদলেও accuracy বাড়ছে না" — এই আটকে যাওয়া।
৪. junior-এর কী জানা লাগে? encoding (One-Hot/Ordinal), scaling কখন দরকার, date/ratio
feature বানানো, ColumnTransformer+Pipeline দিয়ে leakage এড়ানো, feature importance।
৫. এখনই কী master লাগে না? automated feature engineering (featuretools), target/mean
encoding-এর সূক্ষ্মতা, feature store — পরে।
৬. GitHub-এ কীভাবে দেখাবে? before/after feature engineering তুলনা (CV score), Pipeline-এ
গোছানো preprocessing, feature importance chart।
৭. Interview-তে কী জিজ্ঞেস করতে পারে? "একটা feature engineering উদাহরণ দিন", "One-Hot
vs Ordinal কখন?", "scaling কোন model-এ লাগে না?", "Pipeline কেন, নাহলে কী সমস্যা?"
⚠️ ১৩. সাধারণ ভুল (data leakage সহ)
ভুল ১ (সবচেয়ে বিপজ্জনক): পুরো data-তে scaling/encoding করে তারপর train/test split।
→ test-এর তথ্য চুইয়ে ঢোকে (leakage)। সঠিক: Pipeline-এ রেখে শুধু train থেকে শেখান।
ভুল ২: target/label ব্যবহার করে এমন feature বানানো যা inference সময়ে পাওয়া যাবে না
(target leakage)। → future/target-নির্ভর feature বাদ।
ভুল ৩: nominal feature-এ ordinal encoding। → ভুয়া ক্রম শেখায়।
ভুল ৪: tree model-এ অকারণ scaling নিয়ে সময় নষ্ট। → দরকার model-ভেদে।
ভুল ৫: অসংখ্য feature বানিয়ে ফেলা (feature explosion)। → noise ও overfit বাড়ে;
selection করুন।
🎤 ১৪. Interview Prep
প্রশ্ন ১: একটা বাস্তব feature engineering উদাহরণ দিন।
উত্তর: total_spent ও num_orders থেকে avg_order_value; birth_date থেকে age; date থেকে
day-of-week/weekend flag — এগুলো raw feature-এর চেয়ে বেশি predictive।
প্রশ্ন ২: One-Hot vs Ordinal encoding কখন?
উত্তর: ক্রম নেই (city) → One-Hot; স্বাভাবিক ক্রম আছে (education level) → Ordinal।
প্রশ্ন ৩: কোন model-এ scaling লাগে না?
উত্তর: tree-based (Decision Tree, Random Forest, XGBoost) — এরা split threshold-নির্ভর, scale-independent।
প্রশ্ন ৪: Feature engineering-এ data leakage কীভাবে এড়াবেন?
উত্তর: সব transform Pipeline/ColumnTransformer-এ; শুধু train থেকে fit, test/production-এ transform; target-নির্ভর future feature বাদ।
✍️ ১৫. হাতে-কলমে
P3 (Customer Churn) বা P1 (Job Market) data নিন:
১. অন্তত ৩টা নতুন feature বানান (একটা ratio, একটা date-derived, একটা domain flag)।
২. categorical column-গুলো ঠিকভাবে encode করুন (কোনটা One-Hot, কোনটা Ordinal ভাবুন)।
৩. সব preprocessing একটা ColumnTransformer + Pipeline-এ রাখুন।
৪. raw বনাম engineered feature দিয়ে cross_val_score তুলনা করুন।
৫. feature_importances_ দেখে top-10 feature বের করুন।
প্রশ্ন: আপনার কোন নতুন feature-টা সবচেয়ে বেশি importance পেল? সেটা কি ব্যবসায়িকভাবে অর্থপূর্ণ?
🚀 ১৬. Project Connection ও সারসংক্ষেপ
Flagship "Bangladesh Tech Career Assistant"-এ পরের episode-এ (V3) আমরা JD থেকে
role predict করব। সেখানে feature engineering হবে মূল অস্ত্র — text length, নির্দিষ্ট keyword-এর
উপস্থিতি (python, sql, docker), experience-এর সংখ্যা বের করা ইত্যাদি। আজকের encoding + Pipeline
জ্ঞান সরাসরি সেই end-to-end project-এ কাজে লাগবে।
এই Episode-এ শিখলাম:
✓ Feature engineering = transformation + creation + selection
✓ ভালো feature সাধারণ model-কেও শক্তিশালী করে ("better data beats fancier algorithms")
✓ Categorical: One-Hot (ক্রম নেই) বনাম Ordinal (ক্রম আছে)
✓ Numeric: scaling (model-ভেদে), log-transform, binning
✓ Domain feature (ratio, date-derived, flag) প্রায়ই সবচেয়ে predictive
✓ ColumnTransformer + Pipeline দিয়ে সব transform করা = data leakage এড়ানো
পরবর্তী Episode: সম্পূর্ণ end-to-end ML project — raw dataset → preprocessing →
training → evaluation → prediction → FastAPI endpoint। এতদিনের সব শেখা একসাথে জুড়ে
flagship-এর প্রথম shippable version (V3) বানাব।