पाठ 16 / 27
Leakage के बिना Train, Validation और Test बँटवारे
संबंधित rows साथ रखें ताकि test score ईमानदार रहे।
Row से नहीं, समूह से बाँटें
मॉडल को मापने के लिए ऐसा डेटा चाहिए जिस पर वह कभी प्रशिक्षित नहीं हुआ: settings चुनने और जल्दी रुकने को validation set, और अंत में एक बार छुआ जाने वाला test set। Leakage तब होता है जब near-duplicates या वही ग्राहक, दस्तावेज़ या बातचीत दोनों तरफ़ दिखें, जिससे score मॉडल की चापलूसी करता है। उस इकाई से बाँटें जो अनदेखी रहनी चाहिए (ग्राहक, दस्तावेज़, thread), पहले de-duplicate करें, और test set को prompt लिखने या उदाहरण चुनने में प्रयुक्त किसी भी चीज़ से मुक्त रखें। Test set छोटा हो तो कहें और अनिश्चितता बताएँ।
Group बँटवारा बनाम random बँटवारा, चलाकर
मैंने यह सादे Python 3 (सिर्फ़ standard library) से उदाहरण संख्याओं के साथ चलाया। 40 rows का group-aware बँटवारा ग्राहकों को अलग रखता है (कोई ग्राहक दोनों तरफ़ नहीं)। उन्हीं rows का सादा random बँटवारा 10 में से 6 ग्राहकों को दोनों तरफ़ रखता है।
import hashlib, random
def split_by_group(examples, key, test_frac=0.2):
"""Keep every example from the same customer/document in ONE split, so near-duplicates cannot leak across."""
def bucket(k): return int(hashlib.md5(k.encode()).hexdigest(), 16) % 100 / 100
train, test = [], []
for ex in examples: (test if bucket(ex[key]) < test_frac else train).append(ex)
return train, test
rows = [{"customer": f"c{i % 10}", "text": f"ticket {i}"} for i in range(40)]
train, test = split_by_group(rows, "customer")
shared = {r["customer"] for r in train} & {r["customer"] for r in test}
print(f"train {len(train)} rows, test {len(test)} rows; customers appearing in both splits: {sorted(shared)}")
rnd = random.Random(0); rnd.shuffle(rows); naive_train, naive_test = rows[:32], rows[32:]
shared2 = {r["customer"] for r in naive_train} & {r["customer"] for r in naive_test}
print(f"naive random split: customers in both splits: {len(shared2)} of 10 <- leakage risk")
Output:
train 32 rows, test 8 rows; customers appearing in both splits: [] naive random split: customers in both splits: 6 of 10 <- leakage risk
Test set को freeze करें
Test set अलग रखें, उसे सिर्फ़ अंतिम रिपोर्टिंग में देखें, और उस पर कभी tune न करें।
त्वरित जाँच: Data leakage क्या है?
- बहुत कम epochs
- Dataset file खो जाना
- बँटवारे के दोनों तरफ़ संबंधित या दोहराए rows, जो score फुला देते हैं
- डेटा को encrypt करना
Answer
बँटवारे के दोनों तरफ़ संबंधित या दोहराए rows, जो score फुला देते हैं — उस इकाई से बाँटें जो अनदेखी रहनी चाहिए।