मशीन लर्निंग के बुनियादी सिद्धांतमध्यमपाठ 1145 मिनट का पाठ

Train, validation और test सेट्स

डेटा के एक हिस्से का इस्तेमाल सीखने के लिए करें, दूसरे का सही विकल्प चुनने के लिए, और तीसरे का इस्तेमाल—जिसे सिर्फ आखिर में एक बार छुआ जाए—नतीजे रिपोर्ट करने के लिए करें। साथ ही छोटे डेटासेट्स के लिए cross-validation।

पाठ वीडियो में

60 सेकंड में

Train, validation और test सेट्स

डेटा के एक हिस्से का इस्तेमाल सीखने के लिए करें, दूसरे का सही विकल्प चुनने के लिए, और तीसरे का इस्तेमाल—जिसे सिर्फ आखिर में एक बार छुआ जाए—नतीजे रिपोर्ट करने के लिए करें। साथ ही…

1/4
आसान शब्दों में
एक टीचर आपको सीखने के लिए प्रैक्टिस वर्कशीट देता है। फिर एक मॉक टेस्ट ताकि पता चले कि आप कहाँ खड़े हैं और क्या दोहराना है। फिर फ़ाइनल परीक्षा, ऐसे नए सवालों के साथ जो किसी ने नहीं देखे। अगर फ़ाइनल परीक्षा के सवाल लीक हो जाएँ, तो आपके नंबर यह नहीं दिखाएँगे कि आप सच में क्या जानते हैं। टेस्ट सेट फ़ाइनल परीक्षा की तरह है: इसे सील ही रखें।
डेटा के हर हिस्से का एक काम होता है:
सेटकामआप इसे कितनी बार देखते हैं
Training सेटमॉडल इससे अपने weights सीखता हैहर समय
Validation सेटआप मॉडलों की तुलना करते हैं और depth या k जैसी सेटिंग्स चुनते हैंकई बार
Test सेटआप किसी भी पसंद से अछूते डेटा पर, केवल एक बार, फ़ाइनल स्कोर रिपोर्ट करते हैंएक बार, सबसे आखिर में
टेस्ट सेट का इस्तेमाल करके सेटिंग्स क्यों न चुनें? क्योंकि टेस्ट स्कोर देखकर किया गया आपका हर फैसला मॉडल को उस टेस्ट सेट के हिसाब से थोड़ा ढाल (fit कर) देता है। कई कोशिशों के बाद, टेस्ट स्कोर ज़रूरत से ज़्यादा अच्छा दिखने लगता है: यह एक लेवल ऊपर की वही ओवरफ़िटिंग (overfitting) वाली समस्या है।
Python: a three-way splitpython
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: छोटे डेटा का बेहतर इस्तेमाल

कम डेटा होने पर, अकेला validation सेट छोटा होता है और उसका स्कोर अस्थिर (noisy) हो सकता है। k-fold cross-validation ट्रेनिंग डेटा को k हिस्सों (folds) में बाँटता है। यह k बार ट्रेन करता है, हर बार validation के लिए एक अलग फ़ोल्ड को अलग रखता है, और स्कोर्स का औसत निकालता है। ट्रेनिंग की हर पंक्ति (row) validation के लिए एक बार इस्तेमाल होती है।
  1. 1

    बाँटें (Split)

    ट्रेनिंग डेटा को, मान लीजिए, 5 फ़ोल्ड्स में बाँटें।
  2. 2

    घुमाएँ (Rotate)

    4 फ़ोल्ड्स पर ट्रेन करें, 5वें पर स्कोर देखें। इसे दोहराएँ ताकि हर फ़ोल्ड एक बार अलग रखा जाए।
  3. 3

    औसत निकालें (Average)

    इन 5 स्कोर्स का औसत (mean) आपका validation स्कोर है। इनका फैलाव दिखाता है कि यह कितना स्थिर है।
  4. 4

    पूरा करें (Finish)

    चुने गए मॉडल को पूरे ट्रेनिंग डेटा पर फिर से ट्रेन करें, फिर टेस्ट सेट पर एक बार स्कोर देखें।
scikit-learn में, 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 से चुना गया है, और फिर एक सील टेस्ट सेट पर सिर्फ एक बार उसका स्कोर निकाला गया है।

~25 min

समस्या

  1. शुरुआती कोड रन करें। यह ब्रेस्ट कैंसर डेटा के 20% हिस्से को टेस्ट सेट के रूप में सील कर देता है।
  2. candidates में हर k के लिए, StandardScaler और KNeighborsClassifier(n_neighbors=k) की पाइपलाइन का इस्तेमाल करके, सिर्फ ट्रेनिंग पंक्तियों पर औसत 5-fold cross-validation accuracy की गणना करें। इसे cv_scores[k] में स्टोर करें।
  3. सबसे ज़्यादा औसत स्कोर वाले k को best_k पर सेट करें।
  4. उस k के साथ final_model बनाएँ, इसे सभी ट्रेनिंग पंक्तियों पर फ़िट करें, और final_test_acc को इसकी टेस्ट accuracy पर सेट करें। यह अकेला मौका है जब आप टेस्ट सेट को छूते हैं।
  5. 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%)।

टेस्ट देने और अपनी प्रोग्रेस सेव करने के लिए साइन इन करें