Ответ
Размер валидационной выборки (hold-out set) нелинейно зависит от общего объёма данных. Основной принцип: для маленьких датасетов нужна относительно большая доля для валидации, чтобы оценка была статистически значимой. Для больших датасетов абсолютного числа примеров в небольшой доле уже достаточно для надёжной оценки.
Эмпирические правила, которые я применяю на практике:
- Маленький датасет (< 10k примеров): 20-30% на валидацию. Часто вместо простого разбиения использую кросс-валидацию (CV), чтобы максимально использовать данные для обучения и получить устойчивую оценку.
- Средний датасет (10k — 1M примеров): 10-20%.
- Большой датасет (> 1M примеров): 1-5% часто достаточно, так как даже 1% от миллиона — это 10 000 примеров для оценки.
Пример кода с адаптивным разбиением:
from sklearn.model_selection import train_test_split
import numpy as np
# Допустим, у нас есть датасет X, y
n_samples = len(X)
# Определяем долю для валидации в зависимости от размера
if n_samples < 10000:
test_size = 0.25 # 25%
elif n_samples < 1000000:
test_size = 0.15 # 15%
else:
test_size = 0.05 # 5%
X_train, X_val, y_train, y_val = train_test_split(
X, y,
test_size=test_size,
random_state=42,
stratify=y # Стратификация для сохранения распределения классов
)
print(f"Размер обучающей выборки: {len(X_train)}")
print(f"Размер валидационной выборки: {len(X_val)}")
Важно: Для крошечных датасетов (несколько сотен строк) стоит рассмотреть leave-one-out или k-fold CV с k близким к N.