Справедливое сравнение моделей
Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 38 из 58.
Сравнивать модели на одном разбиении — всё равно что подбрасывать монету: модели может достаться удачная тестовая выборка. Вместо этого дайте каждой модели одни и те же пять блоков. Для 150 банкнот, настоящих или фальшивых:
k-NN и логистическая регрессия различаются в пределах погрешности, и k-NN работает стабильнее. Дерево отстаёт.
Разделитель KFold один раз перемешивает строки и передаёт каждой модели одинаковые фолды:
from sklearn.model_selection import KFold
folds = KFold(n_splits=5, shuffle=True, random_state=0)
for model in [knn, logistic, tree]:
scores = cross_val_score(model, X, y, cv=folds)
print(f"{scores.mean():.3f} {scores.std():.3f}")Он выводит числа на диаграмме:
0.867 0.042
0.873 0.074
0.807 0.077Выберите наибольшее среднее значение; если средние значения близки, выберите меньшее стандартное отклонение.
Задание
СреднеСайт с рецептами предсказывает, какие посетители приготовят рецепт, который они открыли. В стартовом коде оцениваются три модели на одном разбиении, и дерево побеждает. Проверь это корректно; программа считывает количество фолдов.
- Создай
KFoldс таким количеством разбиений,shuffle=Trueиrandom_state=0. - Проведи кросс-валидацию каждой модели на этих фолдах; выведи среднее и стандартное отклонение с точностью до 3 знаков после запятой.
- Выведи модель с наибольшим средним значением.
Для других посетителей и значения 5:
One split picks: k-NN
k-NN: mean 0.833, std 0.045
logistic: mean 0.860, std 0.044
tree: mean 0.787, std 0.029
Cross-validation picks: logisticПопробуйте сами
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
n_folds = int(input())
# Не меняйте строки ниже: 300 посетителей, 6 привычек просмотра; метка 1 означает, что они приготовили блюдо по рецепту
X, y = make_classification(n_samples=300, n_features=6, n_informative=4, n_redundant=0,
flip_y=0.06, class_sep=0.8, random_state=0)
names = ["k-NN", "logistic", "tree"]
models = [KNeighborsClassifier(), LogisticRegression(max_iter=1000),
DecisionTreeClassifier(max_depth=4, random_state=0)]
# Одно разбиение определяет победителя
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
single = []
for model in models:
model.fit(X_train, y_train)
single.append(model.score(X_test, y_test))
print(f"One split picks: {names[np.argmax(single)]}")
# Напишите свой код ниже
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Обучение с учителем
1Ваша первая модель
Обучение на примерахОбучающая и тестовая выборкиОбучение и предсказаниеОценка моделиПовторение: сортировщик семян4Логистическая регрессия
Предсказания «да» или «нет»Порог принятия решенияВеса как свидетельстваНесколько классовПовторение: спам-фильтр2Метод ближайших соседей
Как работает k-NNВыбор kГраницы принятия решенийМасштабирование признаков для поиска соседейПовторение: соседи для вин5Оценка классификаторов
Матрица ошибокТочность и полнотаF1-мераНесбалансированные классыROC-кривыеПовторение: скрининговый тест8Кросс-валидация
K-блочная проверкаСправедливое сравнение моделейПоиск по сеткеПовторение: ремонт скейтбордов11Проект: виды пингвинов
Знакомство с пингвинамиПодготовка данныхВыбор моделиНастройка лучшей моделиЗапуск моделиПотренируйтесь самостоятельно: Онлайн-компилятор Python