Home »
Blog »
AI/ML Engineer সিরিজ » Series 05 » Episode 09
Unsupervised: K-Means ও PCA — label ছাড়া pattern
clustering ও dimensionality reduction (Series 05, Episode 09)
🟡 INTERMEDIATE
Series 05 — Classical Machine Learning
Episode 09 / 11
📑 এই পর্বে যা যা আছে
- ১. গল্প: label ছাড়া data-র স্তূপ
- ২. সমস্যা: Supervised বনাম Unsupervised
- ৩. Clustering কী? K-Means-এর গল্প (৩ স্তরে)
- ৪. Visual: K-Means কীভাবে ধাপে ধাপে কাজ করে
- ৫. কোড: K-Means দিয়ে customer/job segmentation
- ৬. কয়টা cluster? Elbow ও Silhouette method
- ৭. PCA কী? মাত্রা (dimension) কমানোর গল্প (৩ স্তরে)
- ৮. Visual: PCA কীভাবে তথ্য ধরে রাখে
- ৯. কোড: PCA দিয়ে dimensionality reduction
- ১০. Experiment: PCA + K-Means একসাথে
- ১১. Bangladesh উদাহরণ ও Boss Question
- ১২. Job Requirement Decoder
- ১৩. সাধারণ ভুল
- ১৪. Interview Prep
- ১৫. হাতে-কলমে
- ১৬. Project Connection ও সারসংক্ষেপ
📝 ১. গল্প: label ছাড়া data-র স্তূপ
Nila একটা e-commerce কোম্পানির ১ লাখ customer-এর data নিয়ে বসল। প্রতিটা row-তে আছে — কত টাকা খরচ,
কতবার order, কী কিনেছে। কিন্তু কোথাও লেখা নেই "এই customer কোন type-এর"। কোনো label নেই।
Rahim: "কিন্তু label ছাড়া model কীভাবে শিখবে? আগের সব episode-এ তো আমরা y (label) দিয়ে train করেছি!"
Nila: "এখানেই Unsupervised Learning-এর মজা। আমরা model-কে বলি না 'এটা কোন type'।
বরং model নিজেই data-র মধ্যে স্বাভাবিক দল (group) খুঁজে বের করে — কোন কোন customer একে অপরের
মতো আচরণ করে। এটাই clustering।"
এই episode-এ দুটো সবচেয়ে দরকারি unsupervised technique শিখব — K-Means (দল খোঁজা) ও
PCA (মাত্রা কমানো)।
❓ ২. সমস্যা: Supervised বনাম Unsupervised
Supervised (আগের episode-গুলো)
data-তে label (y) আছে।
লক্ষ্য: X থেকে y predict করা।
উদাহরণ: churn (হ্যাঁ/না), house price।
Unsupervised (আজ)
কোনো label নেই, শুধু X।
লক্ষ্য: data-র লুকানো গঠন/দল খোঁজা।
উদাহরণ: customer segmentation, topic খোঁজা।
মনে রাখুন distinction: Classification-এ আপনি আগে থেকে জানেন কয়টা class ও কোনটা কী
(label আছে)। Clustering-এ আপনি জানেন না — model নিজেই দল বানায়, তারপর আপনি সেই দলগুলোর অর্থ
ব্যাখ্যা করেন।
🎯 ৩. Clustering কী? K-Means-এর গল্প (৩ স্তরে)
Level 1 — সহজ intuition
একটা পার্টিতে অচেনা মানুষ। কেউ বলে দেয়নি কে কোন দলের। কিন্তু আপনি খেয়াল করলেন — কিছু মানুষ কাছাকাছি
দাঁড়িয়ে গল্প করছে, আরেক দল আরেক কোণে। আপনি স্বাভাবিকভাবেই "দল" চিনে ফেললেন। K-Means ঠিক এটাই করে —
যারা "কাছাকাছি" (মিল বেশি) তাদের এক দলে ফেলে।
Level 2 — technical ভাবে কী হচ্ছে
আপনি বলে দেন কয়টা দল চান (k)। K-Means প্রতিটা দলের একটা কেন্দ্র (centroid) ধরে, তারপর
প্রতিটা point-কে তার সবচেয়ে কাছের centroid-এর দলে দেয় (সাধারণত Euclidean distance)। এরপর centroid-গুলো
দলের গড় অবস্থানে সরে যায়। এই দুই ধাপ বারবার চলে যতক্ষণ centroid আর নড়ে না।
Level 3 — engineer perspective
Engineer হিসেবে মনে রাখবেন — K-Means distance-নির্ভর, তাই feature scaling বাধ্যতামূলক
(নাহলে বড় স্কেলের feature, যেমন "টাকা", ছোট স্কেলের feature, যেমন "order সংখ্যা"-কে চাপা দেবে)। আর k
আপনাকে বেছে দিতে হয় — এটাই সবচেয়ে বড় practical চ্যালেঞ্জ।
🖼️ ৪. Visual: K-Means কীভাবে ধাপে ধাপে কাজ করে
ধাপ ০: এলোমেলো k=২ centroid (X) বসানো
o o o
o o o X o o
o o X o o o
ধাপ ১: প্রতিটা point কাছের centroid-এর দলে যায়
[A A] [B]
[A A A] X [B B]
[A A] X [B B B]
ধাপ ২: centroid দলের গড়ে সরে যায় (X নতুন জায়গায়)
[A A] [B]
[A A X A] [B X B]
[A A] [B B B]
ধাপ ১-২ বারবার চলে -> centroid স্থির হলে থামে (converge)
💻 ৫. কোড: K-Means দিয়ে segmentation
কেন scikit-learn? classical unsupervised algorithm-এর জন্য এটাই standard, API সহজ ও সুসংগত।
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
# উদাহরণ data (বাস্তবে: customer/job feature বসবে)
X, _ = make_blobs(n_samples=500, centers=3,
cluster_std=1.2, random_state=42)
# ধাপ ১: scaling — K-Means distance-নির্ভর, তাই আবশ্যক
X_scaled = StandardScaler().fit_transform(X)
# ধাপ ২: K-Means (k=3), n_init=10 => ভালো শুরু বেছে নেয়
km = KMeans(n_clusters=3, n_init=10, random_state=42)
labels = km.fit_predict(X_scaled)
print("প্রতিটা point-এর cluster:", labels[:10])
print("centroid আকার:", km.cluster_centers_.shape)
print("inertia (কম = ভালো):", round(km.inertia_, 2))
fit_predict প্রতিটা point-কে একটা cluster নম্বর দেয় (0,1,2...)। এই নম্বর শুধুই label —
"cluster 0" মানে "সবচেয়ে ভালো" নয়। দল বানানোর পর আপনাকেই বিশ্লেষণ করতে হবে প্রতিটা দলের বৈশিষ্ট্য কী।
📐 ৬. কয়টা cluster? Elbow ও Silhouette method
সবচেয়ে বড় প্রশ্ন — k কত হবে? দুটো জনপ্রিয় উপায়:
- Elbow method: বিভিন্ন k-এর জন্য inertia (দলের ভেতর distance-এর যোগফল) plot করুন।
যেখানে curve হঠাৎ "কনুই"-এর মতো বাঁক নেয়, সেটাই ভালো k।
- Silhouette score: মাপে প্রতিটা point নিজের দলে কতটা মানানসই বনাম পাশের দলের চেয়ে।
মান -১ থেকে +১; বেশি মানে ভালো আলাদা দল।
from sklearn.metrics import silhouette_score
for k in range(2, 7):
km = KMeans(n_clusters=k, n_init=10, random_state=42)
lab = km.fit_predict(X_scaled)
sil = silhouette_score(X_scaled, lab)
print("k=%d inertia=%.1f silhouette=%.3f"
% (k, km.inertia_, sil))
# সবচেয়ে বেশি silhouette + elbow দেখে k বাছুন
k বাছাই বিজ্ঞান আর ব্যবসায়িক বোধ দুটোরই মিশ্রণ। Elbow/Silhouette পথ দেখায়, কিন্তু শেষমেশ দলগুলো
ব্যাখ্যা করা যায় কি না সেটাই আসল — "৩টা দল হলো premium, regular, dormant customer" — এমন
অর্থপূর্ণ ভাগই কাজে লাগে।
🎯 ৭. PCA কী? মাত্রা কমানোর গল্প (৩ স্তরে)
Level 1 — সহজ intuition
একটা ৩D বস্তুর ছবি তুললে সেটা ২D কাগজে আসে — কিছু তথ্য হারায়, কিন্তু মূল আকৃতি বোঝা যায়। PCA ঠিক
তাই করে — অনেক feature (উচ্চ মাত্রা) থেকে কম feature-এ নামায়, যাতে সবচেয়ে বেশি তথ্য (variance) ধরে থাকে।
Level 2 — technical ভাবে কী হচ্ছে
PCA এমন নতুন অক্ষ (principal component) খুঁজে বের করে যেগুলোর দিকে data-র variance
সবচেয়ে বেশি। প্রথম component সবচেয়ে বেশি variance ধরে, দ্বিতীয়টা তার পরে, এভাবে। তারপর কম-গুরুত্বপূর্ণ
component বাদ দিয়ে মাত্রা কমানো হয়। এটা একটা linear transformation।
Level 3 — engineer perspective
PCA কেন লাগে? (১) অনেক feature থাকলে model ধীর হয় ও overfit করতে পারে — "curse of dimensionality";
(২) visualization — ৫০ feature-কে ২D-তে নামিয়ে plot করা যায়; (৩) noise কমানো। তবে সাবধান — PCA-এর পর
নতুন axis-গুলো আর মানুষের বোধগম্য feature থাকে না (interpretability হারায়)।
🖼️ ৮. Visual: PCA কীভাবে তথ্য ধরে রাখে
২টা feature (2D) -> ১টা principal component (1D)
feature2
| o o
| o o o <- data একটা কোনাকুনি দিকে ছড়ানো
| o o o
|o o o
+-------------- feature1
PCA নতুন অক্ষ (PC1) বসায় ঠিক সেই দিকে যেখানে
ছড়ানো (variance) সবচেয়ে বেশি:
PC1 (সবচেয়ে বেশি variance এই দিকে)
/
/ o o o o o <- এখন শুধু PC1-এর উপর দূরত্ব দিয়েই
/ o o o o বেশিরভাগ তথ্য ধরে রাখা যায়
/ o o o
💻 ৯. কোড: PCA দিয়ে dimensionality reduction
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# PCA-ও scale-sensitive => আগে standardize করুন
X_scaled = StandardScaler().fit_transform(X)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print("আগের আকার:", X_scaled.shape)
print("PCA-এর পরে:", X_pca.shape)
print("প্রতিটা component কত variance ধরল:",
pca.explained_variance_ratio_.round(3))
print("মোট ধরা variance:",
round(pca.explained_variance_ratio_.sum(), 3))
explained_variance_ratio_ বলে প্রতিটা component মূল তথ্যের কত ভাগ ধরল। যদি প্রথম ২টা
component মিলে ০.৯৫ (৯৫%) ধরে, তাহলে বাকি feature বাদ দিয়ে সামান্য তথ্য হারিয়ে অনেক সরল model পাওয়া যায়।
🧪 ১০. Experiment: PCA + K-Means একসাথে
বাস্তব pipeline-এ প্রায়ই PCA দিয়ে মাত্রা কমিয়ে, তারপর K-Means clustering করা হয় (দ্রুত ও কম noise):
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
pipe = Pipeline([
("scale", StandardScaler()),
("pca", PCA(n_components=2)),
("kmeans", KMeans(n_clusters=3, n_init=10, random_state=42)),
])
labels = pipe.fit_predict(X)
# silhouette মাপতে PCA-transformed data লাগবে
X_reduced = pipe[:-1].transform(X) # scale + pca পর্যন্ত
print("silhouette:", round(silhouette_score(X_reduced, labels), 3))
কী দেখবেন: PCA দিয়ে মাত্রা কমানোর পরও যদি silhouette ভালো থাকে, তাহলে বুঝবেন
কম feature-এই দল স্পষ্ট — model হালকা হলো, তথ্য প্রায় অটুট থাকল। Pipeline ব্যবহার করায় scaling/PCA
সবসময় সঠিক ক্রমে হয়।
🇧🇩 ১১. Bangladesh উদাহরণ ও Boss Question
Daraz-এর মতো e-commerce বা GP/Robi-এর মতো telco প্রতিদিন লক্ষ লক্ষ customer নিয়ে কাজ করে। কোনো label
নেই, তবু তারা জানতে চায় — কোন কোন ধরনের customer আছে? K-Means দিয়ে তারা customer segment বানায়
(high-value, occasional, churn-risk), তারপর প্রতিটা segment-এ আলাদা offer পাঠায়। PCA দিয়ে শত শত
behavioral feature-কে হালকা করে দ্রুত বিশ্লেষণ করে।
💼 Boss Question
Boss: "আমাদের তো কোনো labeled data নেই। তাহলে এই clustering দিয়ে আমার লাভটা কোথায়?"
উত্তর: "স্যার, এটাই এর সৌন্দর্য — label ছাড়াই আমরা customer-দের স্বাভাবিক দল বের করতে
পারি। যেমন — কারা বেশি খরচ করে, কারা চলে যাওয়ার ঝুঁকিতে। তারপর প্রতিটা দলে আলাদা marketing/offer দিলে
খরচ কমে, conversion বাড়ে। মানে labeled data না থাকলেও data থেকে সরাসরি business সিদ্ধান্ত — এটাই
unsupervised learning-এর business value।"
🔎 ১২. Job Requirement Decoder
JD-তে দেখবেন: "Familiarity with clustering (K-Means) and dimensionality reduction (PCA)."
১. কী বোঝায়? label ছাড়া data-তে group খোঁজা ও feature কমানো আপনি পারেন।
২. কেন চায়? segmentation, EDA, noise কমানো ও বড় feature space সামলাতে এগুলো লাগে।
৩. কোন সমস্যা সমাধান করে? "labeled data নেই কিন্তু data থেকে insight চাই" — এই সমস্যা।
৪. junior-এর কী জানা লাগে? K-Means-এর ধাপ, scaling কেন আবশ্যক, k বাছাই (elbow/silhouette),
PCA কী করে, explained_variance_ratio_।
৫. এখনই কী master লাগে না? DBSCAN, hierarchical clustering, t-SNE/UMAP-এর গণিত, kernel PCA — পরে।
৬. GitHub-এ কীভাবে দেখাবে? customer segmentation notebook — elbow plot, silhouette, ২D PCA scatter
যেখানে cluster রং করা, আর প্রতিটা segment-এর ব্যাখ্যা।
৭. Interview-তে কী জিজ্ঞেস করতে পারে? "K-Means কীভাবে কাজ করে?", "k কীভাবে বাছবেন?",
"K-Means-এ scaling কেন জরুরি?", "PCA কী ও কখন ব্যবহার করবেন?", "Clustering vs classification পার্থক্য?"
⚠️ ১৩. সাধারণ ভুল
ভুল ১: scaling ছাড়া K-Means/PCA চালানো। → বড়-স্কেলের feature ফলাফল নষ্ট করে; আগে StandardScaler।
ভুল ২: cluster নম্বরকে (0,1,2) অর্থপূর্ণ label ভাবা। → এগুলো শুধু id; আপনাকে ব্যাখ্যা করতে হবে।
ভুল ৩: k অনুমানে বসিয়ে দেওয়া। → elbow/silhouette + business বোধ দিয়ে বাছুন।
ভুল ৪: PCA-কে feature selection ভাবা। → PCA নতুন combined axis বানায়, মূল feature বাছে না।
ভুল ৫: সবসময় PCA করা। → কম feature বা interpretability দরকার হলে PCA এড়িয়ে চলুন।
🎤 ১৪. Interview Prep
প্রশ্ন ১: K-Means কীভাবে কাজ করে?
উত্তর: k centroid বসায় → প্রতিটা point কাছের centroid-এর দলে যায় → centroid দলের গড়ে সরে →
converge না হওয়া পর্যন্ত repeat।
প্রশ্ন ২: Optimal k কীভাবে বাছবেন?
উত্তর: Elbow method (inertia curve-এর কনুই) ও Silhouette score; সাথে business ব্যাখ্যা।
প্রশ্ন ৩: PCA কী এবং কখন ব্যবহার করবেন?
উত্তর: variance ধরে রেখে মাত্রা কমানোর technique; বেশি feature, visualization বা noise কমাতে দরকার।
প্রশ্ন ৪: K-Means ও PCA-তে scaling কেন জরুরি?
উত্তর: দুটোই distance/variance-নির্ভর; unscaled feature হলে বড়-স্কেলের feature আধিপত্য করে ফল বিকৃত করে।
✍️ ১৫. হাতে-কলমে
P1-এর Bangladesh Job Market data (বা যেকোনো customer data) নিন:
১. কিছু numeric feature বাছুন (যেমন salary, experience_years)।
২. StandardScaler দিয়ে scale করুন।
৩. k=2..6 এর জন্য silhouette বের করে সেরা k বাছুন।
৪. সেই k দিয়ে K-Means চালিয়ে cluster বের করুন।
৫. PCA(2) দিয়ে ২D scatter plot বানান, cluster অনুযায়ী রং দিন।
৬. প্রতিটা cluster-কে ২-৩ শব্দে নাম দিন (যেমন "junior-low-salary")।
প্রশ্ন: cluster-গুলো কি ব্যবসায়িকভাবে অর্থপূর্ণ? scaling না করলে ফল কতটা বদলায়?
🚀 ১৬. Project Connection ও সারসংক্ষেপ
Flagship "Bangladesh Tech Career Assistant"-এ K-Means দিয়ে আমরা মিল-থাকা চাকরি বা
skill-দল আলাদা করতে পারি (যেমন "data role", "web role", "DevOps role") — কোনো label ছাড়াই। আর PCA
পরে (Series 07-08) embedding-এর উচ্চ মাত্রা visualize করতে কাজে দেবে। মনে রাখুন — clustering দিয়ে
তৈরি label পরে supervised model-এর feature হিসেবেও ব্যবহার করা যায়।
এই Episode-এ শিখলাম:
✓ Supervised (label আছে) বনাম Unsupervised (label নেই) — মূল পার্থক্য
✓ K-Means: centroid → assign → move → repeat; দল বানায়, নম্বর শুধুই id
✓ k বাছাই: Elbow ও Silhouette + business বোধ
✓ PCA: variance ধরে রেখে মাত্রা কমানো; explained_variance_ratio_ দেখে কত ধরল বোঝা
✓ K-Means ও PCA দুটোতেই feature scaling আবশ্যক
✓ Pipeline দিয়ে scale → PCA → K-Means সঠিক ক্রমে চালানো
পরবর্তী Episode: Feature Engineering — model-এর আসল শক্তি data থেকেই আসে। দেখব কীভাবে
কাঁচা data থেকে ভালো feature বানালে সাধারণ model-ও চমকে দেয়।