मशीन लर्निंग में एक कहावत है: कचरा अंदर, कचरा बाहर। आपके पास दुनिया का सबसे परिष्कृत एल्गोरिदम हो सकता है, लेकिन यदि आप इसे खराब तरीके से तैयार किया गया डेटा खिलाते हैं, तो परिणाम खराब होंगे। इसके विपरीत, उत्कृष्ट, सोच-समझकर तैयार किया गया डेटा दिया गया एक सरल एल्गोरिदम कच्चे, अव्यवस्थित डेटा दिए गए जटिल एल्गोरिदम से बेहतर प्रदर्शन कर सकता है।
फ़ीचर इंजीनियरिंग कच्चे डेटा को अभ्यावेदन में बदलने की कला है जिसे मशीन लर्निंग एल्गोरिदम प्रभावी ढंग से सीख सकते हैं। यह संभवतः व्यावहारिक मशीन लर्निंग में सबसे प्रभावशाली कौशल है - और यह वह जगह है जहां गहन डोमेन ज्ञान डेटा विज्ञान से मिलता है।
मशीन लर्निंग में, फ़ीचर उस चीज़ की कोई मापने योग्य संपत्ति या विशेषता है जिसका आप अनुमान लगाने की कोशिश कर रहे हैं। विशेषताएँ आपके मॉडल के इनपुट हैं; लेबल (या लक्ष्य) आउटपुट है।
घर की कीमत पूर्वानुमान मॉडल के लिए:
ईमेल स्पैम क्लासिफायरियर के लिए:
आपकी सुविधाओं की गुणवत्ता, मात्रा और प्रासंगिकता अक्सर आपके द्वारा चुने गए एल्गोरिदम से अधिक महत्वपूर्ण होती है।
वास्तविक दुनिया का डेटा गड़बड़ है। मशीन लर्निंग एल्गोरिदम की विशिष्ट आवश्यकताएं होती हैं जिन्हें कच्चा डेटा लगभग कभी भी संतुष्ट नहीं करता है:
फ़ीचर इंजीनियरिंग कच्चे डेटा और मॉडल-तैयार इनपुट के बीच अंतर को पाटने की प्रक्रिया है।
जब सुविधाओं के पैमाने बहुत भिन्न होते हैं, तो मॉडल को गुमराह किया जा सकता है। हजारों में मान वाला एक फीचर 0 और 1 के बीच मान वाले फीचर पर हावी हो सकता है।
साइन इन करें चर्चा में शामिल हों
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X_train)
# Before: age=[22, 65, 34], income=[18000, 95000, 42000]
# After: age=[0.0, 1.0, 0.27], income=[0.0, 1.0, 0.31]
न्यूनतम-अधिकतम स्केलिंग की तुलना में आउटलेर्स के लिए अधिक मजबूत:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)
# Transforms each feature to have mean=0, standard deviation=1
# Feature value → (value - mean) / std_dev
सामान्य नियम: डिफ़ॉल्ट रूप से मानकीकरण का उपयोग करें। जब आपको किसी विशिष्ट सीमाबद्ध सीमा (उदाहरण के लिए, तंत्रिका नेटवर्क इनपुट) में मानों की आवश्यकता हो तो न्यूनतम-अधिकतम का उपयोग करें।
"लाल/हरा/नीला" या "लंदन/मैनचेस्टर/बर्मिंघम" जैसी श्रेणियों में कोई प्राकृतिक संख्यात्मक क्रम नहीं है। अधिकांश एल्गोरिदम में उन्हें फीड करने से पहले आपको उन्हें एनकोड करना होगा।
प्रत्येक श्रेणी के लिए एक बाइनरी कॉलम बनाता है। सर्वोत्तम तब जब श्रेणियों का कोई अंतर्निहित क्रम न हो:
import pandas as pd
# Original: colour = ['red', 'green', 'blue', 'red']
df = pd.DataFrame({'colour': ['red', 'green', 'blue', 'red']})
encoded = pd.get_dummies(df['colour'], prefix='colour')
print(encoded)
# colour_blue colour_green colour_red
# 0 0 0 1
# 1 0 1 0
# 2 1 0 0
# 3 0 0 1
प्रत्येक श्रेणी को एक पूर्णांक में मैप करता है। केवल तभी उपयोग करें जब श्रेणियों का प्राकृतिक क्रम हो:
from sklearn.preprocessing import LabelEncoder
# Works for: ['low', 'medium', 'high'] → [0, 1, 2]
# DANGER: Don't use for unordered categories like cities —
# the model will incorrectly assume London(0) < Paris(1) < Tokyo(2)
le = LabelEncoder()
df['education_level'] = le.fit_transform(df['education_level'])
# 'school' → 0, 'undergraduate' → 1, 'postgraduate' → 2
वास्तविक दुनिया के डेटासेट में गुम डेटा लगभग सार्वभौमिक है। आपके पास कई विकल्प हैं:
लुप्त मानों को परिकलित विकल्प से भरें:
from sklearn.impute import SimpleImputer
import numpy as np
# Strategy options: 'mean', 'median', 'most_frequent', 'constant'
imputer = SimpleImputer(strategy='median')
X_imputed = imputer.fit_transform(X)
# For numerical data: median is robust to outliers
# For categorical data: use 'most_frequent'
कभी-कभी यह तथ्य कि डेटा गायब है, अपने आप में जानकारीपूर्ण होता है:
# Create a binary flag: 1 if income was missing, 0 if present
df['income_missing'] = df['income'].isna().astype(int)
# Then impute the original column
df['income'].fillna(df['income'].median(), inplace=True)
यदि किसी कॉलम में ~70-80% से अधिक गुम मान हैं (शायद ही जानकारीपूर्ण) तो उसे हटा दें। किसी पंक्ति को केवल तभी छोड़ें जब आपके पास पर्याप्त डेटा हो और पंक्ति अनियमित रूप से गायब हो (व्यवस्थित रूप से नहीं)।
यहीं पर फीचर इंजीनियरिंग एक कला बन जाती है। आप ऐसे फीचर्स बनाने के लिए डोमेन ज्ञान का उपयोग करते हैं जो कच्चे डेटा में दिखाई न देने वाले पैटर्न को कैप्चर करते हैं।
df['purchase_datetime'] = pd.to_datetime(df['purchase_datetime'])
# Extract meaningful components
df['hour_of_day'] = df['purchase_datetime'].dt.hour
df['day_of_week'] = df['purchase_datetime'].dt.dayofweek
df['is_weekend'] = (df['day_of_week'] >= 5).astype(int)
df['month'] = df['purchase_datetime'].dt.month
df['is_holiday'] = df['purchase_datetime'].isin(uk_holidays).astype(int)
एक अपरिष्कृत टाइमस्टैम्प मॉडल को सीधे तौर पर कुछ नहीं बताता; ये व्युत्पन्न विशेषताएं "धोखाधड़ी सुबह 3 बजे चरम पर" या "सप्ताहांत में बिक्री स्पाइक" जैसे पैटर्न को उजागर करती हैं।
# Square footage × number of bathrooms might be more predictive
# than either feature alone for house prices
df['size_per_bathroom'] = df['sqft'] / df['bathrooms']
# Ratio of income to loan amount — a classic credit risk feature
df['debt_to_income'] = df['loan_amount'] / df['annual_income']
from sklearn.feature_extraction.text import TfidfVectorizer
# Convert raw text to numerical feature matrix
vectorizer = TfidfVectorizer(max_features=1000, stop_words='english')
text_features = vectorizer.fit_transform(df['review_text'])
# Each word becomes a feature; its value reflects how important
# the word is in that document relative to the whole corpus
एक बार जब आप एक मॉडल बना लेते हैं, तो आप माप सकते हैं कि इसमें कौन सी सुविधाएँ सबसे उपयोगी लगीं। यह आपके मॉडल को समझने और यह तय करने के लिए कि कौन सी सुविधाएँ रखनी हैं या हटानी हैं, दोनों के लिए मूल्यवान है:
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# Get feature importances
importances = pd.Series(
model.feature_importances_,
index=feature_names
).sort_values(ascending=False)
print(importances.head(10))
# income_to_debt_ratio 0.187
# days_since_last_payment 0.143
# credit_utilisation 0.121
# ...
लगभग-शून्य महत्व वाली सुविधाओं को आमतौर पर प्रदर्शन को प्रभावित किए बिना हटाया जा सकता है - और उन्हें हटाने से मॉडल सरल हो जाता है, प्रशिक्षण का समय कम हो जाता है और सामान्यीकरण में सुधार हो सकता है।
जब आपके पास सैकड़ों या हजारों विशेषताएं होती हैं, तो मॉडल संघर्ष कर सकते हैं - इसे आयामीता का अभिशाप कहा जाता है। आयामीता में कमी की तकनीकें सबसे महत्वपूर्ण पैटर्न को संरक्षित करते हुए सुविधाओं को संपीड़ित करती हैं:
from sklearn.decomposition import PCA
# Reduce 100 features to 10 components that capture 95% of variance
pca = PCA(n_components=10)
X_reduced = pca.fit_transform(X_scaled)
print(f"Variance explained: {pca.explained_variance_ratio_.sum():.2%}")
# Variance explained: 94.7%
पीसीए (प्रिंसिपल कंपोनेंट एनालिसिस) सबसे आम दृष्टिकोण है, लेकिन अन्य में टी-एसएनई (विज़ुअलाइज़ेशन के लिए) और यूएमएपी (स्थानीय संरचना को संरक्षित करने के लिए) शामिल हैं।
आपके पास 'शहर' कॉलम वाला एक डेटासेट है जिसमें 50 अलग-अलग शहरों के नाम हैं। आपको किस एन्कोडिंग दृष्टिकोण का उपयोग करना चाहिए?