# Leakage के बिना Train, Validation और Test बँटवारे — Fine-tuning बनाम Prompting

Source: https://www.skillbyai.com/hi/fine-tuning/x-split

> संबंधित 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 ग्राहकों को दोनों तरफ़ रखता है।

```python
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 न करें।

**Quiz:** Data leakage क्या है?

- [ ] बहुत कम epochs
- [ ] Dataset file खो जाना
- [x] बँटवारे के दोनों तरफ़ संबंधित या दोहराए rows, जो score फुला देते हैं
- [ ] डेटा को encrypt करना

*Answer:* बँटवारे के दोनों तरफ़ संबंधित या दोहराए rows, जो score फुला देते हैं. उस इकाई से बाँटें जो अनदेखी रहनी चाहिए।
