Chapter 04

ডেটা হ্যান্ডলিং

Data Handling
🎬 কেন ডেটাই সব?
একটি প্রবাদ আছে — "Garbage in, garbage out"। আপনার মডেল যত শক্তিশালীই হোক, ডেটা নোংরা হলে আউটপুটও নোংরা হবে। সফল DL প্রজেক্টের ৭০% সময় খরচ হয় ডেটা পরিষ্কার ও প্রস্তুত করতে। এই অধ্যায়ে আমরা সেই কাজগুলো শিখব।

ডেটার ধরন

Tabular

Excel/CSV-এর মতো — row ও column।

Image

ছবি — pixel-এর matrix।

Text

লেখা — শব্দের sequence।

Audio/Time-series

সময়ের সাথে পরিবর্তিত সংকেত।

ডেটা লোড করা

import pandas as pd

# CSV
df = pd.read_csv("data.csv")

# Excel
df = pd.read_excel("data.xlsx")

# JSON
df = pd.read_json("data.json")

# প্রথম ৫ row দেখুন
print(df.head())
print(df.info())       # column type, missing value
print(df.describe())   # summary statistics

Missing Value — অসম্পূর্ণ ডেটা

বাস্তব ডেটায় প্রায়ই কিছু value missing থাকে। তিনটি কৌশল আছে — মুছে ফেলা, পূরণ করা, বা ফ্ল্যাগ করা।

# missing value চেক
print(df.isnull().sum())

# কৌশল ১: যেসব row-তে missing আছে — drop
df_clean = df.dropna()

# কৌশল ২: গড় দিয়ে পূরণ (numeric column)
df["age"] = df["age"].fillna(df["age"].mean())

# কৌশল ৩: সবচেয়ে common value দিয়ে পূরণ (category)
df["city"] = df["city"].fillna(df["city"].mode()[0])

Categorical Data — সংখ্যায় রূপান্তর

মডেল শুধু সংখ্যা বোঝে — "Dhaka", "Chittagong" বোঝে না। তাই category-কে সংখ্যায় বদলাতে হয়।

One-Hot Encoding

# pandas দিয়ে
df_encoded = pd.get_dummies(df, columns=["city"])
# নতুন column: city_Dhaka, city_Chittagong, city_Sylhet

Label Encoding

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df["grade_encoded"] = le.fit_transform(df["grade"])
# A→0, B→1, C→2

Normalization ও Standardization

মডেলে যদি একটি feature 0–1 আর আরেকটি 0–10000 হয়, training অস্থির হবে। তাই সব feature-কে একই scale-এ আনতে হয়।

from sklearn.preprocessing import StandardScaler, MinMaxScaler

# Min-Max: 0 থেকে 1-এর মধ্যে
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)

# Standard: গড় 0, std 1
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
📌 কখন কোনটি?
  • MinMax: Image pixel (0–255 → 0–1), neural network input।
  • Standard: যখন ডেটা সাধারণত Gaussian distribution-এর মতো।

Train / Validation / Test Split

একটি মডেলকে কখনো সম্পূর্ণ ডেটায় train করে সম্পূর্ণ ডেটায় test করবেন না — সেটা পরীক্ষায় উত্তর দেখে পরীক্ষা দেওয়ার মতো। তিন ভাগে ভাগ করুন।

Train 70%
Val 15%
Test 15%

সাধারণ অনুপাত — ছোট ডেটায় 80/10/10, বড় ডেটায় 98/1/1 ও হয়।

from sklearn.model_selection import train_test_split

# প্রথমে train+val ও test আলাদা
X_train_val, X_test, y_train_val, y_test = train_test_split(
    X, y, test_size=0.15, random_state=42
)

# তারপর train আর val
X_train, X_val, y_train, y_val = train_test_split(
    X_train_val, y_train_val, test_size=0.176, random_state=42
)

Image ডেটা — বিশেষ প্রক্রিয়া

from PIL import Image
import numpy as np

img = Image.open("cat.jpg").convert("RGB")
img = img.resize((224, 224))           # সব ছবি একই আকার
arr = np.array(img) / 255.0            # 0-255 → 0-1 normalize
print(arr.shape)                        # (224, 224, 3)

Data Augmentation — ছবি বাড়ানো

১০০০ ছবি কম মনে হচ্ছে? একই ছবিকে ঘুরিয়ে, কাত করে, brightness বদলে আরো ৫০০০ ছবি বানানো যায়। এটাই data augmentation — overfitting কমায়।

from torchvision import transforms

train_transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(15),
    transforms.ColorJitter(brightness=0.2, contrast=0.2),
    transforms.ToTensor(),
])

Text ডেটা — Tokenization

sentence = "আমি বাংলা ভাষা ভালোবাসি"

# সহজ tokenization
tokens = sentence.split()
print(tokens)   # ['আমি', 'বাংলা', 'ভাষা', 'ভালোবাসি']

# vocabulary বানানো
vocab = {word: idx for idx, word in enumerate(set(tokens))}

# token → number
ids = [vocab[w] for w in tokens]

Imbalanced Dataset

১০০০টি ছবির মধ্যে ৯৫০টা "Cat" আর ৫০টা "Dog" হলে মডেল শুধু "Cat" বললেই ৯৫% accuracy পাবে — কিন্তু আসলে কিছুই শেখেনি। সমাধান:

  • Oversampling: minority class-এর ছবি ডুপ্লিকেট/augment করুন।
  • Undersampling: majority class থেকে কিছু কমান।
  • Class weights: loss function-এ minority-কে বেশি weight দিন।
  • SMOTE: synthetic example তৈরি করুন।

সাধারণ ভুল ধারণা

⚠️ যা এড়িয়ে চলবেন
  • Data Leakage: test set থেকে scaler fit করা — কখনো না। শুধু train-এ fit, test-এ transform।
  • Train ও test-এ আলাদা augmentation — test-এ কোনো augmentation দরকার নেই।
  • সব column-এ blindly fillna করা — context বুঝে decide করুন।
  • Image normalize না করা — training অস্থির হবে।

অনুশীলন

১. একটি CSV (যেমন Titanic) ডাউনলোড করে missing value handle করুন।

২. একটি ছবি লোড করে normalize করুন এবং shape print করুন।

৩. Iris dataset-কে 70/15/15 ভাগে split করে train, val, test set বানান।

৪. একটি বাংলা sentence-এর simple tokenizer ও vocabulary তৈরি করুন।

মিনি প্রজেক্ট

🚀 আজকের চ্যালেঞ্জ
Kaggle থেকে Titanic dataset নিন। সম্পূর্ণ pipeline বানান — load → missing value → encode → scale → split। শেষে train/val/test-এর shape print করুন। এটাই আপনার প্রথম "real" data preprocessing pipeline।

ইন্টারভিউ প্রশ্ন

  1. Normalization ও Standardization-এর পার্থক্য কী?
  2. One-hot ও label encoding-এর পার্থক্য কী?
  3. Data leakage কী এবং কেন বিপজ্জনক?
  4. Imbalanced dataset কীভাবে handle করবেন?
  5. কেন validation set আলাদা রাখা হয়?

সারসংক্ষেপ

✨ এই অধ্যায়ে যা শিখলাম
  • ডেটার ধরন — tabular, image, text, time-series।
  • Missing value হ্যান্ডলিং, encoding, scaling।
  • Train/Validation/Test split — ও কেন গুরুত্বপূর্ণ।
  • Image augmentation, text tokenization।
  • Imbalanced dataset-এর সমাধান।
  • এই অধ্যায়ে আমাদের Phase 0 (ভিত্তি প্রস্তুতি) শেষ। পরের Phase-এ আমরা সত্যিকারের নিউরাল নেটওয়ার্ক বানানো শুরু করব।