Выбор метода разделения (сплита) данных является важным этапом при построении моделей машинного обучения. Правильный выбор сплита позволяет добиться более точных и обобщающих моделей.
Данные делятся на две части: обучающая выборка (train set) и тестовая выборка (test set). Обычно деление производится в пропорции 70/30 или 80/20. Когда у вас достаточно большой набор данных.Для быстрой оценки производительности модели.
from sklearn.model_selection import train_test_split
# Исходные данные
X = ...
y = ...
# Деление данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Данные делятся на K частей (фолдов). Модель обучается K раз, каждый раз используя K-1 частей для обучения и одну часть для тестирования. Результаты оцениваются как среднее значение по всем фолдам. Когда нужно уменьшить влияние случайности, особенно при небольшом объеме данных. Для более надежной оценки производительности модели.
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
# Исходные данные
X = ...
y = ...
# Модель
model = RandomForestClassifier()
# K-кратная кросс-валидация
scores = cross_val_score(model, X, y, cv=5)
print(f"Средняя точность: {scores.mean()}")
Подобно K-Fold Cross-Validation, но деление на фолды производится таким образом, чтобы в каждом фолде сохранялись пропорции классов, как в исходных данных. Для задач классификации, особенно при наличии несбалансированных классов.
from sklearn.model_selection import StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
# Исходные данные
X = ...
y = ...
# Стратифицированная K-кратная кросс-валидация
skf = StratifiedKFold(n_splits=5)
model = RandomForestClassifier()
scores = cross_val_score(model, X, y, cv=skf)
print(f"Средняя точность: {scores.mean()}")
Частный случай K-Fold Cross-Validation, где K равно количеству образцов в данных. Каждый раз модель обучается на всех образцах, кроме одного, который используется для тестирования. При очень небольших наборах данных, где важно использовать как можно больше данных для обучения.
from sklearn.model_selection import LeaveOneOut
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
# Исходные данные
X = ...
y = ...
# LOOCV
loo = LeaveOneOut()
model = LogisticRegression()
scores = cross_val_score(model, X, y, cv=loo)
print(f"Средняя точность: {scores.mean()}")
Ставь 👍 и забирай 📚 Базу знаний