Feature Engineering: Encoding, Scaling aur Naye Features

Lesson 19 of 26

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

Python
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

Plain Text
     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

Python
print(pd.get_dummies(df["city"], prefix="city", dtype=int))

Output

Plain Text
   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

Python
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

Plain Text
['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

Python
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

Plain Text
  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

Python
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

Plain Text
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

Python
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

Plain Text
   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

Python
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

Plain Text
Train se seekha mean: [8.10e+04 3.63e+01]

Is kaam ko automatic aur safe banane ke liye scikit-learn ka Pipeline aur ColumnTransformer hai — ye hum project wale lesson me use karenge. Detail me: sklearn.preprocessing Complete Guide aur Categorical Data Handling.