Feature Engineering: model-এর আসল শক্তি data থেকেই আসে

ভালো feature = ভালো model (Series 05, Episode 10)

🟡 INTERMEDIATE Series 05 — Classical Machine Learning Episode 10 / 11

📑 এই পর্বে যা যা আছে

📝 ১. গল্প: একই 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-কে সংখ্যায় বদলাতে হয়। দুই প্রধান উপায়:

সতর্কতা: nominal feature-এ ভুলেও ordinal encoding দেবেন না। "Dhaka=0, Ctg=1, Sylhet=2" করলে model ভাববে Sylhet > Dhaka — যা অর্থহীন এবং ভুল pattern শেখাবে। ক্রম না থাকলে One-Hot।

🔢 ৬. Numeric feature: scaling, binning, transform

মনে রাখুন: কোন 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 ধীর করে। কয়েকটা উপায়:

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) বানাব।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.