ML models sirf numbers samajhte hain, aur unhe features ka scale bhi pareshaan karta hai. Feature engineering ka matlab hai raw data ko aise features me badalna jo model ke liye useful hon. Aksar accha feature engineering, fancy model se zyada farq daalta hai.
Setup
import pandas as pd
df = pd.DataFrame({
"city": ["Delhi", "Mumbai", "Pune", "Delhi", "Mumbai"],
"size": ["S", "M", "L", "M", "S"],
"income": [35000, 82000, 54000, 120000, 41000],
"age": [22, 35, 29, 48, 26],
"signup_date": pd.to_datetime(["2026-01-15", "2026-02-03", "2026-02-20",
"2026-03-08", "2026-03-30"]),
})
print(df)
Output
city size income age signup_date
0 Delhi S 35000 22 2026-01-15
1 Mumbai M 82000 35 2026-02-03
2 Pune L 54000 29 2026-02-20
3 Delhi M 120000 48 2026-03-08
4 Mumbai S 41000 26 2026-03-30
One-hot encoding (categories jinka koi order nahi)
City jaise column me Delhi = 1, Mumbai = 2 likhna galat hai — model samjhega Mumbai 'Delhi se do guna' hai. Isliye har category ka alag 0/1 column banate hain:
Example
print(pd.get_dummies(df["city"], prefix="city", dtype=int))
Output
city_Delhi city_Mumbai city_Pune
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
4 0 1 0
ML pipelines me scikit-learn ka OneHotEncoder use hota hai, kyunki ye training me dekhi categories yaad rakhta hai:
Example
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(sparse_output=False, handle_unknown="ignore")
encoded = encoder.fit_transform(df[["city"]])
print(encoder.get_feature_names_out())
print(encoded)
Output
['city_Delhi' 'city_Mumbai' 'city_Pune']
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]
[0. 1. 0.]]
Ordinal encoding (categories jinka order hai)
Size S < M < L — yaha order matter karta hai, to numbers de sakte hain:
Example
from sklearn.preprocessing import OrdinalEncoder
ordinal = OrdinalEncoder(categories=[["S", "M", "L"]])
df["size_code"] = ordinal.fit_transform(df[["size"]]).ravel()
print(df[["size", "size_code"]])
Output
size size_code
0 S 0.0
1 M 1.0
2 L 2.0
3 M 1.0
4 S 0.0
Scaling
Income hazaaron me hai aur age dahaiyon me. KNN, Logistic Regression, K-Means jaise models me bade numbers wala feature 'jeet' jaata hai. Scaling se sab features barabar ke level pe aa jaate hain:
Example
from sklearn.preprocessing import MinMaxScaler, StandardScaler
standard = StandardScaler().fit_transform(df[["income", "age"]])
minmax = MinMaxScaler().fit_transform(df[["income", "age"]])
print("StandardScaler (mean 0, std 1):")
print(standard.round(2))
print("\nMinMaxScaler (0 se 1):")
print(minmax.round(2))
Output
StandardScaler (mean 0, std 1):
[[-1. -1.1 ]
[ 0.5 0.33]
[-0.4 -0.33]
[ 1.71 1.77]
[-0.81 -0.66]]
MinMaxScaler (0 se 1):
[[0. 0. ]
[0.55 0.5 ]
[0.22 0.27]
[1. 1. ]
[0.07 0.15]]
Scaler | Result | Kab |
|---|---|---|
StandardScaler | Mean 0, std 1 | Zyadatar models ke liye default |
MinMaxScaler | 0 se 1 ke beech | Jab fixed range chahiye (jaise images, neural nets) |
RobustScaler | Median aur IQR se | Jab outliers zyada hon |
Decision Tree aur Random Forest ko scaling ki zaroorat nahi hoti.
Naye features banana
Example
df["signup_month"] = df["signup_date"].dt.month
df["signup_day"] = df["signup_date"].dt.day_name()
df["age_group"] = pd.cut(df["age"], bins=[0, 25, 40, 100],
labels=["Young", "Adult", "Senior"])
df["income_per_age"] = (df["income"] / df["age"]).round(0)
print(df[["signup_month", "signup_day", "age", "age_group", "income_per_age"]])
Output
signup_month signup_day age age_group income_per_age
0 1 Thursday 22 Young 1591.0
1 2 Tuesday 35 Adult 2343.0
2 2 Friday 29 Adult 1862.0
3 3 Sunday 48 Senior 2500.0
4 3 Monday 26 Adult 1577.0
Sabse badi galti: data leakage
Scaler ya imputer ko poore data pe fit karna galat hai — test data ki jaankari training me 'leak' ho jaati hai aur score jhootha accha aata hai. Hamesha sirf train data pe fit kariye, aur test pe sirf transform:
Example
from sklearn.model_selection import train_test_split
X_train, X_test = train_test_split(df[["income", "age"]], test_size=0.4, random_state=0)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train) # train pe fit + transform
X_test_scaled = scaler.transform(X_test) # test pe sirf transform
print("Train se seekha mean:", scaler.mean_.round(1))
Output
Train se seekha mean: [8.10e+04 3.63e+01]
Is kaam ko automatic aur safe banane ke liye scikit-learn ka
PipelineaurColumnTransformerhai — ye hum project wale lesson me use karenge. Detail me: sklearn.preprocessing Complete Guide aur Categorical Data Handling.