Train, validation और test सेट्स
डेटा के एक हिस्से का इस्तेमाल सीखने के लिए करें, दूसरे का सही विकल्प चुनने के लिए, और तीसरे का इस्तेमाल—जिसे सिर्फ आखिर में एक बार छुआ जाए—नतीजे रिपोर्ट करने के लिए करें। साथ ही छोटे डेटासेट्स के लिए cross-validation।
60 सेकंड में
Train, validation और test सेट्स
डेटा के एक हिस्से का इस्तेमाल सीखने के लिए करें, दूसरे का सही विकल्प चुनने के लिए, और तीसरे का इस्तेमाल—जिसे सिर्फ आखिर में एक बार छुआ जाए—नतीजे रिपोर्ट करने के लिए करें। साथ ही…
| सेट | काम | आप इसे कितनी बार देखते हैं |
|---|---|---|
| Training सेट | मॉडल इससे अपने weights सीखता है | हर समय |
| Validation सेट | आप मॉडलों की तुलना करते हैं और depth या k जैसी सेटिंग्स चुनते हैं | कई बार |
| Test सेट | आप किसी भी पसंद से अछूते डेटा पर, केवल एक बार, फ़ाइनल स्कोर रिपोर्ट करते हैं | एक बार, सबसे आखिर में |
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
# First keep 20% aside as the sealed test set
X_rest, X_test, y_rest, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y)
# Then split the rest into training and validation
X_train, X_val, y_train, y_val = train_test_split(
X_rest, y_rest, test_size=0.25, random_state=42, stratify=y_rest)
print("train:", len(X_train), " validation:", len(X_val), " test:", len(X_test))Cross-validation: छोटे डेटा का बेहतर इस्तेमाल
- 1
बाँटें (Split)
ट्रेनिंग डेटा को, मान लीजिए, 5 फ़ोल्ड्स में बाँटें। - 2
घुमाएँ (Rotate)
4 फ़ोल्ड्स पर ट्रेन करें, 5वें पर स्कोर देखें। इसे दोहराएँ ताकि हर फ़ोल्ड एक बार अलग रखा जाए। - 3
औसत निकालें (Average)
इन 5 स्कोर्स का औसत (mean) आपका validation स्कोर है। इनका फैलाव दिखाता है कि यह कितना स्थिर है। - 4
पूरा करें (Finish)
चुने गए मॉडल को पूरे ट्रेनिंग डेटा पर फिर से ट्रेन करें, फिर टेस्ट सेट पर एक बार स्कोर देखें।
cross_val_score(model, X_train, y_train, cv=5) आपके लिए यह रोटेशन खुद कर देता है। अगर मॉडल स्केलर (scaler) वाली पाइपलाइन है, तो स्केलर हर फ़ोल्ड के अंदर फिर से फ़िट होता है, इसलिए कुछ भी लीक नहीं होता।टेस्ट सेट लीक होने के आम तरीके
- बाँटने से पहले पूरे डेटा को तैयार करना: सभी पंक्तियों का इस्तेमाल करके स्केलर फ़िट करना, छूटे हुए मान (missing values) भरना या फ़ीचर्स चुनना। पहले बाँटें, या पाइपलाइन का इस्तेमाल करें।
- सेट्स के बीच डुप्लीकेट्स: ट्रेनिंग और टेस्ट में एक जैसा उदाहरण (या लगभग उसकी कॉपी) होना। बाँटने से पहले डुप्लीकेट्स हटाएँ।
- समय का घालमेल: समय के साथ बदलने वाले डेटा (जैसे कीमतें) के लिए, पुराने समय पर ट्रेन करें और आने वाले समय पर टेस्ट करें। रैंडम तरीके से बाँटने पर मॉडल "भविष्य देख लेता है"।
- ग्रुप्स का अलग-अलग बँटना: दोनों सेट्स में एक ही व्यक्ति या एक ही फ़ार्म की कई पंक्तियाँ होना। मॉडल पैटर्न के बजाय उस व्यक्ति को पहचान लेता है। हर ग्रुप को एक ही सेट में रखें (scikit-learn में इसके लिए
GroupKFoldहै)। - बार-बार झाँकना: हर बदलाव के बाद टेस्ट स्कोर पर "बस एक नज़र और" डालना।
random_state=42 को बदलकर दूसरे नंबर डालें। साइज़ वही रहेगा, लेकिन पंक्तियाँ बदल जाएँगी। छोटे डेटासेट्स के लिए यह क्यों मायने रखता है?और देखें और पढ़ें
लैब
एक k-nearest-neighbours मॉडल जिसका k ट्रेनिंग डेटा पर 5-fold cross-validation से चुना गया है, और फिर एक सील टेस्ट सेट पर सिर्फ एक बार उसका स्कोर निकाला गया है।
समस्या
- शुरुआती कोड रन करें। यह ब्रेस्ट कैंसर डेटा के 20% हिस्से को टेस्ट सेट के रूप में सील कर देता है।
candidatesमें हर k के लिए,StandardScalerऔरKNeighborsClassifier(n_neighbors=k)की पाइपलाइन का इस्तेमाल करके, सिर्फ ट्रेनिंग पंक्तियों पर औसत 5-fold cross-validation accuracy की गणना करें। इसेcv_scores[k]में स्टोर करें।- सबसे ज़्यादा औसत स्कोर वाले k को
best_kपर सेट करें। - उस k के साथ
final_modelबनाएँ, इसे सभी ट्रेनिंग पंक्तियों पर फ़िट करें, औरfinal_test_accको इसकी टेस्ट accuracy पर सेट करें। यह अकेला मौका है जब आप टेस्ट सेट को छूते हैं। - k और स्कोर्स की टेबल प्रिंट करें, फिर फ़ाइनल नंबर।
प्रैक्टिस लैब
कोड में बदलाव करें और इसे रन करें। Python आपके ब्राउज़र में चलता है — हमारे सर्वर पर कुछ नहीं भेजा जाता।
कोई आउटपुट नहीं। वैल्यूज़ देखने के लिए print(...) जोड़ें।
आपका काम तब पूरा होगा जब
कठिन सवाल
उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।
Q1k = 5, 7 और 9 के लिए CV स्कोर्स में 0.01 से भी कम का अंतर है। इसका क्या मतलब निकाला जाए?दिखाएं
ये अंतर लगभग 450 पंक्तियों पर cross-validation के उतार-चढ़ाव (noise) के दायरे में ही हैं। इनमें से कोई भी k चुनना सही है। आप फ़ोल्ड स्कोर्स के फैलाव को देख सकते हैं, किसी आसान या ज़्यादा स्थिर विकल्प को चुन सकते हैं, या सबसे ऊपर वाले को चुन सकते हैं बिना यह दावा किए कि वह सच में बेहतर है।
Q2आपकी फ़ाइनल टेस्ट accuracy सबसे अच्छे CV स्कोर से थोड़ी कम है। क्या कुछ गड़बड़ है?दिखाएं
ज़रूरी नहीं। आठ CV स्कोर्स में से सबसे अच्छा चुनना उस k के पक्ष में जाता है जिसकी किस्मत थोड़ी अच्छी रही हो, इसलिए सबसे अच्छा CV स्कोर थोड़ा ज़रूरत से ज़्यादा अच्छा दिखता है। इसके अलावा टेस्ट सेट में केवल 114 पंक्तियाँ हैं। थोड़ी गिरावट सामान्य है। एक बड़ी गिरावट होने पर ही लीकेज या सेट्स के बीच अंतर की जाँच करने की ज़रूरत होती है।
अक्सर पूछे जाने वाले सवाल
मुझे किस साइज़ में डेटा बाँटना चाहिए?
ट्रेनिंग, validation और टेस्ट के लिए 60/20/20 या 70/15/15 आम पसंद हैं। cross-validation के साथ, लगभग 20% टेस्ट सेट के रूप में रखें और बाकी पर cross-validate करें। बहुत बड़े डेटा के साथ, validation और टेस्ट के लिए छोटे हिस्से भी काफ़ी होते हैं।
कितने फ़ोल्ड्स?
5 या 10 आम हैं। ज़्यादा फ़ोल्ड्स हर बार ट्रेनिंग के लिए ज़्यादा डेटा इस्तेमाल करते हैं, लेकिन समय ज़्यादा लेते हैं।
मॉडल चुनने के बाद, क्या मुझे ट्रेनिंग और validation डेटा को मिलाकर फिर से ट्रेन करना चाहिए?
अक्सर हाँ: सेटिंग्स तय हो जाने के बाद, ज़्यादा डेटा पर दोबारा ट्रेन करने से आमतौर पर फ़ायदा होता है। फिर टेस्ट सेट पर एक बार स्कोर देखें। फ़ाइनल नंबर मिलने से पहले टेस्ट सेट को ट्रेनिंग में कभी न जोड़ें।
अगर मेरा टेस्ट स्कोर मेरे validation स्कोर से बहुत खराब हो तो क्या होगा?
यह महज़ इत्तेफ़ाक हो सकता है (छोटा टेस्ट सेट होने पर), या हो सकता है कि आपकी सेटिंग्स validation डेटा पर ओवरफ़िट हो गई हों, या टेस्ट डेटा बाकी डेटा से अलग हो। इसे ईमानदारी से रिपोर्ट करें और जाँच करें। टेस्ट सेट पर चुपचाप ट्यूनिंग जारी न रखें।
पाठ का टेस्ट
5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।