अध्याय ५ · खण्ड II · 26 मिनेट
मोडेलका सेटिङ ट्युन गर्ने
हाइपरपारामिटर — तपाईंले तालिमअघि सेट गर्ने नब — ले तपाईंको मोडेल कति राम्रो हुन सक्छ चुपचाप निर्धारण गर्छन्। यो खण्ड तिनलाई ट्युन गर्ने मानक औजार हो: GridSearchCV, RandomizedSearchCV, र 78% मोडेललाई 86% मोडेलबाट छुट्ट्याउने व्यवहारिक ज्ञान।
तपाईंले तालिम दिने हरेक मोडेलमा सेटिङ हुन्छन् — max_depth, n_neighbors, alpha, n_estimators — जुन तपाईंले तालिमअघि छान्नुहुन्छ र अप्टिमाइजेसन प्रक्रियाले समायोजन गर्दैन। यी हाइपरपारामिटर हुन्, र तिनलाई राम्रोसँग छान्नु प्रायः औसत मोडेल र बलियो मोडेलबीचको फरक हुन्छ। यो खण्ड हाइपरपारामिटर स्पेस व्यवस्थित रूपमा खोज्ने र सर्वोत्तम संयोजन भेट्ने मानक scikit-learn उपकरण-पेटी हो — परीक्षण-सेट जानकारी तपाईंको छनोटमा नलीक गरी।
पारामिटर बनाम हाइपरपारामिटर
उपयोगी भेद:
-
पारामिटर मोडेल भित्रका नब हुन् जुन तालिमले समायोजन गर्छ — लोजिस्टिक रिग्रेसनका भार, निर्णय रुखका विभाजन, k-means का cluster केन्द्र। तपाईंले यिनलाई सिधै सेट गर्नुहुन्न;
model.fit(...)ले गर्छ। -
हाइपरपारामिटर मोडेलका सेटिङ हुन् जुन तपाईंले तालिमअघि छान्नुहुन्छ —
max_depth,learning_rate,n_neighbors। तपाईं यिनलाई स्पष्ट रूपमा सेट गर्नुहुन्छ; तालिमले छुँदैन।
ट्युनिङ भनेको तालिम प्राप्त मोडेललाई सर्वोत्तम (उच्चतम cross-validation शुद्धता, न्यूनतम cross-validation MSE, आदि) बनाउने हाइपरपारामिटर मान भेट्ने हो।
गलत तरिका
सामान्य सुरुआती दृष्टिकोण:
# यसो नगर्नुहोस्
for depth in [3, 5, 10, 20]:
model = DecisionTreeClassifier(max_depth=depth)
model.fit(X_train, y_train)
test_acc = model.score(X_test, y_test)
print(f"depth={depth}: {test_acc:.3f}")
# अनि सर्वोत्तम गहिराइसँग तैनात गर्नुहोस्
समस्या: तपाईंले परीक्षण सेटमा ट्युन गर्नुभयो। “सर्वोत्तम” गहिराइ त्यो हो जुन विशिष्ट परीक्षण सेटमा तपाईंसँग जे छ त्यसमा सबैभन्दा राम्रो प्रदर्शन गर्छ। त्यो सङ्ख्या अब सामान्यीकरणको इमानदार अनुमान होइन — तपाईंले सिधै परीक्षण-सेट स्कोर अनुकूलन गर्नुभयो।
सही दृष्टिकोण हाइपरपारामिटरलाई अलग्गै प्रमाणीकरण सेट (वा cross-validation, राम्रो संस्करण) मा मूल्याङ्कन गर्ने, परीक्षण सेटलाई अन्तिम रिपोर्टसम्म नछुने, र त्यसपछि मात्र इमानदार प्रदर्शन जाँच्ने हो।
सही तरिका: GridSearchCV
scikit-learn को GridSearchCV ले भारी उठाउँछ:
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
param_grid = {
"n_estimators": [50, 100, 200],
"max_depth": [3, 5, 10, None],
"min_samples_split": [2, 5, 10],
}
grid = GridSearchCV(
RandomForestClassifier(random_state=42),
param_grid=param_grid,
cv=5, # तालिम डाटामा 5-fold cross-validation
scoring="accuracy",
n_jobs=-1, # सबै CPU कोर प्रयोग गर्नुहोस्
verbose=1,
)
grid.fit(X_train, y_train)
print(f"Best params: {grid.best_params_}")
print(f"Best CV score: {grid.best_score_:.3f}")
# अछूता परीक्षण सेटमा इमानदार मूल्याङ्कन, एक पटक, अन्त्यमा
print(f"Test accuracy: {grid.score(X_test, y_test):.3f}")
के भर्खर भयो:
GridSearchCVले हाइपरपारामिटरको हरेक संयोजनका लागि नयाँ मोडेल तालिम दिन्छ (यहाँ, 3×4×3 = 36 संयोजन)।- हरेक संयोजनका लागि, यसले तालिम डाटामा 5-fold cross-validation गर्छ, 5 folds मा औसत स्कोर गणना गर्दै।
- यसले सर्वोत्तम औसत CV स्कोर भएको संयोजन राख्छ।
grid.best_estimator_तालिम डाटा सबैमा ती सर्वोत्तम हाइपरपारामिटरसँग तालिम दिइएको मोडेल हो।- तपाईं परीक्षण सेटमा एक पटक अन्त्यमा मूल्याङ्कन गर्नुहुन्छ। परीक्षण सेट ट्युनिङका बेला कहिल्यै छोइएको थिएन।
यो ट्युनिङका लागि सुनौलो मानक हो। एउटै तल्लो छेउ: धेरै हाइपरपारामिटर र धेरै मानसँग, ग्रिड छिटो बढ्छ। 5-fold CV सँग 36-संयोजन ग्रिडले 180 मोडेल तालिम दिन्छ। 1000-संयोजन ग्रिडले 5000 मोडेल तालिम दिन्छ। ठूला डाटासेटमा, यो महँगो हुन्छ।
RandomizedSearchCV — जब ग्रिड धेरै ठूलो हुन्छ
जब हाइपरपारामिटर स्पेस ठूलो हुन्छ, RandomizedSearchCV ले हरेक कोसिस गर्नुको सट्टा अनियमित संयोजनको नमुना लिन्छ:
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint, uniform
param_dist = {
"n_estimators": randint(50, 500),
"max_depth": randint(3, 20),
"min_samples_split": randint(2, 20),
"max_features": uniform(0.1, 0.9),
}
search = RandomizedSearchCV(
RandomForestClassifier(random_state=42),
param_distributions=param_dist,
n_iter=50, # 50 अनियमित संयोजन कोसिस गर्नुहोस्
cv=5,
scoring="accuracy",
n_jobs=-1,
random_state=42,
)
search.fit(X_train, y_train)
print(search.best_params_)
प्रति-सहज ज्ञानले, 50 प्रयासको RandomizedSearch ले प्रायः 200+ प्रयासको पूर्ण ग्रिड जस्तै लगभग उही सर्वोत्तम हाइपरपारामिटर भेट्छ। कारण: अधिकांश हाइपरपारामिटरमा केही मुख्य मान हुन्छन् जहाँ मोडेल राम्रोसँग प्रदर्शन गर्छ, र 50 अनियमित प्रयासले सामान्यतया कम्तीमा एकमा (वा नजिकै) पुग्न पर्याप्त हुन्छन्।
अधिकांश परियोजनाका लागि, 30-50 पुनरावृत्तिसहित RandomizedSearchCV GridSearchCV भन्दा बढी व्यवहारिक छ। जब तपाईंसँग सानो, राम्रोसँग बुझिएको हाइपरपारामिटर स्पेस छ तब GridSearch प्रयोग गर्नुहोस्।
कुन हाइपरपारामिटर ट्युन गर्ने?
यो पाठ्यक्रमका मोडेलहरूका लागि छोटो मार्गदर्शक:
Logistic regression: C (regularisation शक्तिको उल्टो, सानो = अधिक regularisation), penalty (l1 vs l2), class_weight।
Random forest: n_estimators (अधिक रुख = राम्रो, घट्दो प्रतिफलसँग), max_depth (overfitting नियन्त्रण गर्छ), min_samples_split, max_features (हरेक विभाजनमा हरेक रुखले विचार गर्ने फिचरहरूको सङ्ख्या — forest विविधताका लागि प्रमुख नब)।
Gradient boosting (GradientBoostingClassifier वा xgboost): learning_rate, n_estimators, max_depth। यी तीन बलियोसँग अन्तरक्रिया गर्छन्; सँगै ट्युन गर्नुहोस्।
K-NN: n_neighbors, weights (uniform vs distance), metric।
Decision tree: max_depth, min_samples_split, min_samples_leaf।
अधिकांश tabular परियोजनाका लागि, तपाईंलाई सबै हाइपरपारामिटर ट्युन गर्नु पर्दैन। तपाईंको मोडेल कक्षाका लागि सबैभन्दा महत्त्वपूर्ण 2-3 छान्नु 80% gain समात्न पर्याप्त हुन्छ।
कार्यगत उदाहरण — random forest ट्युन गर्ने
परीक्षण शुद्धता 0.78 भएको पूर्वनिर्धारित random forest बाट सुरु गर्दै, हामी ट्युन गर्नेछौं र कति टाढा पुग्न सक्छौं हेर्नेछौं:
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
import time
# आधार
default = RandomForestClassifier(random_state=42)
default.fit(X_train, y_train)
print(f"Default: train={default.score(X_train, y_train):.3f} test={default.score(X_test, y_test):.3f}")
# ट्युन गरिएको
param_dist = {
"n_estimators": randint(100, 500),
"max_depth": randint(3, 30),
"min_samples_split": randint(2, 20),
"min_samples_leaf": randint(1, 10),
"max_features": ["sqrt", "log2", 0.3, 0.5],
}
start = time.time()
search = RandomizedSearchCV(
RandomForestClassifier(random_state=42),
param_distributions=param_dist,
n_iter=40,
cv=5,
scoring="f1",
n_jobs=-1,
random_state=42,
)
search.fit(X_train, y_train)
elapsed = time.time() - start
print(f"Search took {elapsed:.1f}s")
print(f"Best params: {search.best_params_}")
print(f"Best CV F1: {search.best_score_:.3f}")
print(f"Tuned test F1: {search.score(X_test, y_test):.3f}")
सामान्य नतिजा:
Default: train=0.998 test=0.778
Search took 67.4s
Best params: {'max_depth': 11, 'max_features': 'sqrt', 'min_samples_leaf': 4, 'min_samples_split': 14, 'n_estimators': 312}
Best CV F1: 0.804
Tuned test F1: 0.811
ट्युन गरिएको मोडेल परीक्षण F1 मा 3 प्रतिशत बिन्दु राम्रो छ, train/test खाडल बन्द भयो (कम overfitting), र मोडेल बढी बलियो छ। साठी सेकेन्ड कम्प्युट समयले 3-5 अङ्क वास्तविक प्रदर्शन किन्यो।
ट्युनिङ Pipeline भित्र काम गर्छ
तपाईं step_name__hyperparameter सिन्ट्याक्स प्रयोग गरेर Pipeline भित्र कुनै पनि चरणको हाइपरपारामिटर ट्युन गर्न सक्नुहुन्छ:
pipeline = Pipeline([
("scale", StandardScaler()),
("clf", LogisticRegression(max_iter=1000)),
])
param_grid = {
"clf__C": [0.01, 0.1, 1.0, 10.0, 100.0],
"clf__penalty": ["l1", "l2"],
"clf__solver": ["liblinear"],
}
grid = GridSearchCV(pipeline, param_grid, cv=5, scoring="f1")
grid.fit(X_train, y_train)
डबल underscore (clf__C) ले ग्रिड खोजलाई “pipeline को clf चरणको C हाइपरपारामिटर ट्युन गर्नुहोस्” भन्छ। यसले तपाईंलाई पूर्व-प्रशोधन र ट्युनिङलाई लीकेजबिना सफा रूपमा संयोजन गर्न दिन्छ।
समय बजेटबारे टिप्पणी
हाइपरपारामिटर खोज तपाईंको कम्प्युट बजेटले सीमित हुन्छ। उपयोगी नियम-अङ्गुष्ठ:
- छिटो अन्वेषण: 20-30 पुनरावृत्तिसहित
RandomizedSearchCV, 5-fold CV। ल्यापटपमा घण्टौं-देखि-रातभर। - उत्पादन मोडेल: छिटो अन्वेषणबाट पहिचान गरिएका हाइपरपारामिटरको केन्द्रित उपसमूहमा
GridSearchCV(वा 100+ पुनरावृत्तिसँग बढी ध्यानले RandomizedSearch)। - धेरै ठूला मोडेल / धेरै लामो तालिम: सबै ट्युन नगर्नुहोस्। प्रकाशित configurations बाट पूर्वनिर्धारित प्रयोग गर्नुहोस्, सबैभन्दा महत्त्वपूर्ण एक वा दुई हाइपरपारामिटर ट्युन गर्नुहोस्, र थप ट्युनिङमा घट्दो प्रतिफल छ स्वीकार्नुहोस्।
ट्युनिङ-बजेट वार्ता आफ्नो टिम र stakeholders सँग स्पष्ट हुन योग्य छ।
आफ्नो बुझाइ जाँच्नुहोस्
Quick check
—एक टिम सदस्यले फरक max_depth मानहरूमा `for` लूप चलाउँछन्, हरेक मोडेललाई तालिम सेटमा तालिम दिने र परीक्षण सेटमा स्कोर गर्ने। तिनले उच्चतम परीक्षण स्कोरसहितको गहिराइ छान्छन् र त्यो परीक्षण स्कोरलाई 'मोडेलको शुद्धता' का रूपमा रिपोर्ट गर्छन्। के गलत छ?
Quick check
—तपाईंसँग सम्भावित रूपमा ट्युन गर्ने 30 हाइपरपारामिटर छन्, प्रत्येकको 5 सम्भाव्य मान। पूर्ण ग्रिड खोजका लागि 5^30 प्रयास चाहिन्छ — असम्भव धेरै। व्यवहारिक दृष्टिकोण के हो?
अब के आउँछ
तपाईंले हाइपरपारामिटर इमानदारीसाथ छान्न सक्नुहुन्छ। अध्याय 5 को अन्तिम खण्डले हामीले सधैं चुपचाप प्रयोग गर्दै आएको प्रविधिलाई औपचारिक बनाउँछ: cross-validation। मोडेल प्रदर्शनको बढी इमानदार अनुमान पाउन धेरै splits मा तालिम र मूल्याङ्कन गर्ने अनुशासन — र तपाईंसँग ‘धेरै डाटा’ हुँदा पनि यो किन महत्त्वपूर्ण छ भन्ने साना कारण।