Перейти к основному содержанию
Ctrl+K
scikit-learn homepage scikit-learn homepage
  • Установить
  • Руководство пользователя
  • API
  • Примеры
  • Сообщество
    • Начало работы
    • История выпусков
    • Глоссарий
    • Разработка
    • Часто задаваемые вопросы
    • Поддержка
    • Связанные проекты
    • Дорожная карта
    • Управление
    • О нас
  • GitHub
  • Установить
  • Руководство пользователя
  • API
  • Примеры
  • Сообщество
  • Начало работы
  • История выпусков
  • Глоссарий
  • Разработка
  • Часто задаваемые вопросы
  • Поддержка
  • Связанные проекты
  • Дорожная карта
  • Управление
  • О нас
  • GitHub

Навигация по разделам

  • Основные изменения в выпуске
    • Основные нововведения в scikit-learn 1.8
    • Основные новости выпуска scikit-learn 1.7
    • Основные новости выпуска scikit-learn 1.6
    • Основные новости выпуска scikit-learn 1.5
    • Основные нововведения выпуска scikit-learn 1.4
    • Основные изменения в выпуске scikit-learn 1.3
    • Основные новости выпуска scikit-learn 1.2
    • Основные изменения в выпуске scikit-learn 1.1
    • Основные новости выпуска scikit-learn 1.0
    • Основные нововведения scikit-learn 0.24
    • Основные новости выпуска scikit-learn 0.23
    • Основные нововведения в выпуске scikit-learn 0.22
  • Бикластеризация
    • Демонстрация алгоритма Spectral Biclustering
    • Демонстрация алгоритма спектральной совместной кластеризации
    • Бикластеризация документов с помощью алгоритма спектральной совместной кластеризации
  • Калибровка
    • Сравнение калибровки классификаторов
    • Кривые калибровки вероятности
    • Калибровка вероятностей для классификации на 3 класса
    • Калибровка вероятностей классификаторов
  • Классификация
    • Сравнение классификаторов
    • Линейный и квадратичный дискриминантный анализ с эллипсоидом ковариации
    • Нормальный, Ledoit-Wolf и OAS линейный дискриминантный анализ для классификации
    • Построить график вероятности классификации
    • Распознавание рукописных цифр
  • Кластеризация
    • Демонстрация кластеризации K-Means на данных рукописных цифр
    • Демонстрация структурированной иерархической кластеризации Уорда на изображении монет
    • Демонстрация алгоритма кластеризации mean-shift
    • Коррекция на случайность в оценке производительности кластеризации
    • Агломеративная кластеризация с разными метриками
    • Пример инициализации K-Means++
    • Сравнение производительности биссекционного K-средних и обычного K-средних
    • Сравнение BIRCH и MiniBatchKMeans
    • Сравнение различных алгоритмов кластеризации на игрушечных наборах данных
    • Сравнение различных методов иерархической связи на игрушечных наборах данных
    • Сравнение алгоритмов кластеризации K-Means и MiniBatchKMeans
    • Демонстрация алгоритма кластеризации DBSCAN
    • Демонстрация алгоритма кластеризации HDBSCAN
    • Демонстрация алгоритма кластеризации OPTICS
    • Демонстрация алгоритма кластеризации с распространением аффинности
    • Демонстрация предположений k-means
    • Эмпирическая оценка влияния инициализации k-means
    • Агломерация признаков
    • Агломерация признаков против одномерного отбора
    • Иерархическая кластеризация со структурой и без
    • Индуктивная кластеризация
    • Онлайн-обучение словаря частей лиц
    • Построить дендрограмму иерархической кластеризации
    • Сегментация изображения греческих монет на регионы
    • Выбор количества кластеров с помощью анализа силуэта для кластеризации KMeans
    • Спектральная кластеризация для сегментации изображений
    • Различные агломеративные кластеризации на 2D-вложении цифр
    • Пример векторного квантования
  • Оценка ковариации
    • Оценка Ледойта-Вольфа против OAS оценки
    • Робастная оценка ковариации и релевантность расстояний Махаланобиса
    • Робастная vs эмпирическая оценка ковариации
    • Оценка ковариации сжатием: LedoitWolf vs OAS и максимальное правдоподобие
    • Оценка разреженной обратной ковариации
  • Перекрестное разложение
    • Сравнить методы перекрёстного разложения
    • Регрессия на главных компонентах против регрессии методом частичных наименьших квадратов
  • Примеры наборов данных
    • Построение случайно сгенерированного многометочного набора данных
  • Деревья решений
    • Регрессия дерева решений
    • Построить поверхность решений деревьев решений, обученных на наборе данных ирисов
    • Пост-обрезка деревьев решений с обрезкой по стоимости сложности
    • Понимание структуры дерева решений
  • Разложение
    • Разделение слепых источников с использованием FastICA
    • Сравнение LDA и PCA 2D проекции набора данных Iris
    • Разложения набора данных Faces
    • Факторный анализ (с вращением) для визуализации паттернов
    • FastICA на 2D облаках точек
    • Удаление шума изображений с использованием обучения словаря
    • Инкрементальный PCA
    • Ядерный PCA
    • Выбор модели с вероятностным PCA и факторным анализом (FA)
    • Анализ главных компонент (PCA) на наборе данных Iris
    • Разреженное кодирование с предвычисленным словарём
  • Разработка оценщиков
    • __sklearn_is_fitted__ как API для разработчиков
  • Ансамблевые методы
    • Поддержка категориальных признаков в градиентном бустинге
    • Объедините предикторы с помощью стекинга
    • Сравнение моделей случайных лесов и градиентного бустинга на гистограммах
    • Сравнение случайных лесов и мета-оценщика с множественным выходом
    • Регрессия решающего дерева с AdaBoost
    • Ранняя остановка в градиентном бустинге
    • Важность признаков с использованием леса деревьев
    • Преобразования признаков с ансамблями деревьев
    • Признаки в деревьях с градиентным бустингом на гистограммах
    • Оценки Gradient Boosting Out-of-Bag
    • Градиентный бустинг для регрессии
    • Регуляризация градиентного бустинга
    • Преобразование признаков с хешированием с использованием полностью случайных деревьев
    • Пример IsolationForest
    • Монотонные ограничения
    • Многоклассовые деревья решений с бустингом AdaBoost
    • Ошибки OOB для случайных лесов
    • Построить индивидуальные и голосующие регрессионные предсказания
    • Построить поверхности решений ансамблей деревьев на наборе данных ирисов
    • Интервалы прогнозирования для регрессии градиентного бустинга
    • Один оценщик против бэггинга: декомпозиция смещения-дисперсии
    • Двухклассовый AdaBoost
    • Визуализация вероятностных предсказаний VotingClassifier
  • Примеры на основе реальных наборов данных
    • Компрессионное зондирование: реконструкция томографии с априорным распределением L1 (Lasso)
    • Пример распознавания лиц с использованием собственных лиц и SVM
    • Удаление шума с изображения с использованием ядерного PCA
    • Лаггированные признаки для прогнозирования временных рядов
    • Влияние сложности модели
    • Классификация текстовых документов вне памяти
    • Обнаружение выбросов на реальном наборе данных
    • Задержка предсказания
    • Моделирование распределения видов
    • Инженерия временных признаков
    • Извлечение тем с использованием неотрицательной матричной факторизации и латентного размещения Дирихле
    • Визуализация структуры фондового рынка
    • Главный собственный вектор Википедии
  • Выбор признаков
    • Сравнение F-теста и взаимной информации
    • Основанный на модели и последовательный отбор признаков
    • Конвейер ANOVA SVM
    • Рекурсивное исключение признаков
    • Рекурсивное исключение признаков с перекрестной проверкой
    • Одномерный отбор признаков
  • Замороженные оценщики
    • Примеры использования FrozenEstimator
  • Гауссовские смеси моделей
    • Анализ вариации байесовской гауссовой смеси с априорным типом концентрации
    • Оценка плотности для гауссовской смеси
    • Методы инициализации GMM
    • Ковариации GMM
    • Эллипсоиды гауссовской смеси
    • Выбор модели гауссовской смеси
    • Гауссова смесь моделей синусоидальной кривой
  • Гауссовский процесс для машинного обучения
    • Способность гауссовского процесса регрессии (GPR) оценивать уровень шума данных
    • Сравнение ядерной гребневой регрессии и регрессии по методу Гауссовских процессов
    • Прогнозирование уровня CO2 на наборе данных Mona Loa с использованием гауссовской регрессии (GPR)
    • Регрессия гауссовских процессов: базовый вводный пример
    • Гауссовский процесс классификации (GPC) на наборе данных iris
    • Гауссовские процессы на дискретных структурах данных
    • Иллюстрация классификации гауссовским процессом (GPC) на наборе данных XOR
    • Иллюстрация априорного и апостериорного гауссовских процессов для различных ядер
    • Изолинии равной вероятности для классификации гауссовских процессов (GPC)
    • Вероятностные предсказания с гауссовским процессом классификации (GPC)
  • Обобщенные линейные модели
    • Сравнение линейных байесовских регрессоров
    • Аппроксимация кривой с использованием байесовской гребневой регрессии
    • Границы решений мультиномиальной и логистической регрессии One-vs-Rest
    • Ранняя остановка стохастического градиентного спуска
    • Обучение Elastic Net с предвычисленной матрицей Грама и взвешенными выборками
    • HuberRegressor против Ridge на наборе данных с сильными выбросами
    • Совместный отбор признаков с многозадачным Lasso
    • L1-штраф и разреженность в логистической регрессии
    • Модели на основе L1 для разреженных сигналов
    • Выбор модели Lasso с помощью информационных критериев
    • Выбор модели Lasso: AIC-BIC / перекрёстная проверка
    • Lasso на плотных и разреженных данных
    • Пути Lasso, Lasso-LARS и Elastic Net
    • Классификация MNIST с использованием мультиномиальной логистической регрессии + L1
    • Многоклассовая разреженная логистическая регрессия на 20newsgroups
    • Метод наименьших квадратов с неотрицательными ограничениями
    • One-Class SVM против One-Class SVM с использованием стохастического градиентного спуска
    • Метод наименьших квадратов и гребневая регрессия
    • Orthogonal Matching Pursuit
    • Построение коэффициентов Ridge как функции регуляризации
    • Построение многоклассового SGD на наборе данных iris
    • Пуассоновская регрессия и ненормальные потери
    • Полиномиальная и сплайновая интерполяция
    • Квантильная регрессия
    • Регуляризационный путь L1-логистической регрессии
    • Коэффициенты Ridge как функция L2-регуляризации
    • Робастная оценка линейной модели
    • Робастная оценка линейной модели с использованием RANSAC
    • SGD: Гиперплоскость максимального разделяющего запаса
    • SGD: Штрафы
    • SGD: Взвешенные выборки
    • SGD: выпуклые функции потерь
    • Регрессия Тейла-Сена
    • Регрессия Твиди для страховых случаев
  • Инспекция
    • Распространённые ошибки в интерпретации коэффициентов линейных моделей
    • Неспособность машинного обучения выводить причинно-следственные связи
    • Графики частичной зависимости и индивидуального условного ожидания
    • Важность перестановок против важности признаков случайного леса (MDI)
    • Важность перестановок с мультиколлинеарными или коррелированными признаками
  • Аппроксимация ядра
    • Масштабируемое обучение с полиномиальной аппроксимацией ядра
  • Обучение многообразию
    • Сравнение методов обучения многообразий
    • Методы обучения многообразий на разрезанной сфере
    • Обучение многообразию на рукописных цифрах: Locally Linear Embedding, Isomap…
    • load_files
    • Снижение размерности Swiss Roll и Swiss-Hole
    • t-SNE: Влияние различных значений perplexity на форму
  • Разное
    • Расширенное построение графиков с частичной зависимостью
    • Сравнение алгоритмов обнаружения аномалий для выявления выбросов на игрушечных наборах данных
    • Сравнение ядерной регрессии гребня и SVR
    • Отображение конвейеров
    • Отображение оценщиков и сложных конвейеров
    • Оценка оценщиков обнаружения выбросов
    • Аппроксимация явного отображения признаков для RBF-ядер
    • Завершение лица с помощью многоканальных оценщиков
    • Представляем set_output API
    • Изотоническая регрессия
    • Маршрутизация метаданных
    • Многометочная классификация
    • Кривая ROC с API визуализации
    • Граница Джонсона-Линденштрауса для вложения с помощью случайных проекций
    • Визуализации с объектами Display
  • Импутация пропущенных значений
    • Заполнение пропущенных значений перед построением оценщика
    • Заполнение пропущенных значений с вариантами IterativeImputer
  • Выбор модели
    • Баланс сложности модели и кросс-валидационной оценки
    • Graham Clenaghan
    • Сравнение рандомизированного поиска и поиска по сетке для оценки гиперпараметров
    • Сравнение между поиском по сетке и последовательным сокращением вдвое
    • Пользовательская стратегия повторного обучения для поиска по сетке с кросс-валидацией
    • Демонстрация многометрической оценки на cross_val_score и GridSearchCV
    • Кривая компромисса ошибок обнаружения (DET)
    • Влияние регуляризации модели на ошибку обучения и тестирования
    • Оценить производительность классификатора с помощью матрицы ошибок
    • Многоклассовая рабочая характеристика приемника (ROC)
    • Вложенная и невложенная перекрестная проверка
    • Построение перекрестно проверенных предсказаний
    • Построение кривых обучения и проверка масштабируемости моделей
    • Пост-фактумная настройка точки отсечения функции принятия решений
    • Последующая настройка порога принятия решений для обучения с учетом стоимости
    • Precision-Recall
    • Рабочая характеристика приёмника (ROC) с перекрёстной проверкой
    • Примерный пайплайн для извлечения и оценки текстовых признаков
    • Статистическое сравнение моделей с использованием поиска по сетке
    • Последовательные итерации деления пополам
    • Тест с перестановками для значимости оценки классификации
    • Недообучение vs. Переобучение
    • Визуализация поведения кросс-валидации в scikit-learn
  • Многоклассовые методы
    • Обзор мета-оценщиков для многоклассового обучения
  • Многовариантные методы
    • Многометочная классификация с использованием цепочки классификаторов
  • Ближайшие соседи
    • Приближенные ближайшие соседи в TSNE
    • Кэширование ближайших соседей
    • Сравнение ближайших соседей с анализом компонент соседства и без него
    • Снижение размерности с помощью анализа компонентов соседства
    • Оценка плотности ядра распределения видов
    • Оценка плотности ядра
    • Классификация по ближайшему центроиду
    • Классификация методом ближайших соседей
    • Регрессия методом ближайших соседей
    • Иллюстрация анализа компонентов соседства
    • Обнаружение новизны с помощью локального фактора выбросов (LOF)
    • Обнаружение выбросов с помощью фактора локальных выбросов (LOF)
    • Простое одномерное ядерное сглаживание плотности
  • Нейронные сети
    • Сравнение стохастических стратегий обучения для MLPClassifier
    • Признаки ограниченной машины Больцмана для классификации цифр
    • Изменение регуляризации в многослойном перцептроне
    • Visualization of MLP weights on MNIST
  • Конвейеры и составные оценщики
    • Трансформер столбцов с разнородными источниками данных
    • Трансформер столбцов со смешанными типами
    • Объединение нескольких методов извлечения признаков
    • Эффект преобразования целей в регрессионной модели
    • Конвейеризация: объединение PCA и логистической регрессии
    • Выбор уменьшения размерности с помощью Pipeline и GridSearchCV
  • Предобработка
    • Сравнение влияния различных масштабировщиков на данные с выбросами
    • Сравнение Target Encoder с другими кодировщиками
    • Демонстрация различных стратегий KBinsDiscretizer
    • Дискретизация признаков
    • Важность масштабирования признаков
    • Преобразует данные в нормальное распределение
    • Внутренняя перекрестная подгонка Target Encoder
    • Использование KBinsDiscretizer для дискретизации непрерывных признаков
  • Полуавтоматическая классификация
    • Граница решения полуконтролируемых классификаторов против SVM на наборе данных Iris
    • Влияние изменения порога для самообучения
    • Распространение меток по кругам: Обучение сложной структуре
    • Распространение меток цифр: Активное обучение
    • Распространение меток на цифрах: Демонстрация производительности
    • Полу-контролируемая классификация на текстовом наборе данных
  • Метод опорных векторов
    • Одноклассовый SVM с нелинейным ядром (RBF)
    • Построение границ классификации с различными ядрами SVM
    • Построение различных классификаторов SVM на наборе данных iris
    • Построить опорные векторы в LinearSVC
    • Параметры SVM с RBF-ядром
    • Пример границ SVM
    • Пример разрешения ничьей в SVM
    • SVM с пользовательским ядром
    • SVM-Anova: SVM с одномерным отбором признаков
    • SVM: Разделяющая гиперплоскость с максимальным зазором
    • SVM: Разделяющая гиперплоскость для несбалансированных классов
    • SVM: Взвешенные образцы
    • Масштабирование параметра регуляризации для SVC
    • Регрессия на основе метода опорных векторов (SVR) с использованием линейных и нелинейных ядер
  • Работа с текстовыми документами
    • Классификация текстовых документов с использованием разреженных признаков
    • Кластеризация текстовых документов с использованием k-means
    • Сравнение FeatureHasher и DictVectorizer
  • Примеры
  • Выбор модели
  • Статистическое сравнение моделей с использованием поиска по сетке

Примечание

Перейти в конец чтобы скачать полный пример кода или запустить этот пример в браузере через JupyterLite или Binder.

Статистическое сравнение моделей с использованием поиска по сетке#

Этот пример иллюстрирует, как статистически сравнить производительность моделей, обученных и оцененных с использованием GridSearchCV.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Мы начнем с моделирования данных в форме луны (где идеальное разделение между классами нелинейно), добавив к ним умеренный уровень шума. Точки данных будут принадлежать одному из двух возможных классов для прогнозирования двумя признаками. Мы смоделируем 50 образцов для каждого класса:

import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.datasets import make_moons

X, y = make_moons(noise=0.352, random_state=1, n_samples=100)

sns.scatterplot(
    x=X[:, 0], y=X[:, 1], hue=y, marker="o", s=25, edgecolor="k", legend=False
).set_title("Data")
plt.show()
Data

Мы сравним производительность SVC оценщики, которые различаются по своим kernel параметр, чтобы определить, какой выбор этого гиперпараметра лучше всего предсказывает наши смоделированные данные. Мы оценим производительность моделей с помощью RepeatedStratifiedKFold, повторяя 10 раз стратифицированную кросс-валидацию с 10 фолдами, используя различную рандомизацию данных в каждом повторении. Производительность будет оцениваться с помощью roc_auc_score.

from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold
from sklearn.svm import SVC

param_grid = [
    {"kernel": ["linear"]},
    {"kernel": ["poly"], "degree": [2, 3]},
    {"kernel": ["rbf"]},
]

svc = SVC(random_state=0)

cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=10, random_state=0)

search = GridSearchCV(estimator=svc, param_grid=param_grid, scoring="roc_auc", cv=cv)
search.fit(X, y)
GridSearchCV(cv=RepeatedStratifiedKFold(n_repeats=10, n_splits=10, random_state=0),
             estimator=SVC(random_state=0),
             param_grid=[{'kernel': ['linear']},
                         {'degree': [2, 3], 'kernel': ['poly']},
                         {'kernel': ['rbf']}],
             scoring='roc_auc')
В среде Jupyter, пожалуйста, перезапустите эту ячейку, чтобы показать HTML-представление, или доверьтесь блокноту.
На GitHub HTML-представление не может отображаться, попробуйте загрузить эту страницу с помощью nbviewer.org.
Параметры
estimator оценщик: объект оценщика

Предполагается, что это реализует интерфейс оценщика scikit-learn.
Либо оценщик должен предоставлять функцию ``score``,
или ``scoring`` должны быть переданы.
SVC(random_state=0)
param_grid param_grid: словарь или список словарей

Словарь с именами параметров (`str`) в качестве ключей и списками
настройки параметров для перебора в качестве значений или список таких
словарями, в этом случае сетки, охватываемые каждым словарем
в списке исследуются. Это позволяет осуществлять поиск по любой последовательности
наборов параметров.
[{'kernel': ['linear']}, {'degree': [2, 3], 'kernel': ['poly']}, ...]
оценка scoring: str, callable, list, tuple или dict, по умолчанию=None

Стратегия оценки производительности кросс-валидированной модели на
тестовый набор.

Если `scoring` представляет собой единичную оценку, можно использовать:

- одиночная строка (см. :ref:`scoring_string_names`);
- вызываемый объект (см. :ref:`scoring_callable`), который возвращает одно значение;
- `None`, `estimator`'s
:ref:`критерий оценки по умолчанию ` используется.

Если `scoring` представляет несколько оценок, можно использовать:

- список или кортеж уникальных строк;
- вызываемый объект, возвращающий словарь, где ключи — это метрика
имена и значения — это оценки метрик;
- словарь с именами метрик в качестве ключей и вызываемыми объектами в качестве значений.

См. :ref:`multimetric_grid_search` для примера.
'roc_auc'
n_jobs n_jobs: int, default=None

Количество параллельно выполняемых задач.
``None`` означает 1, если не в контексте :obj:`joblib.parallel_backend`.
``-1`` означает использование всех процессоров. См. :term:`Глоссарий `
для получения дополнительной информации.

.. versionchanged:: v0.20
`n_jobs` значение по умолчанию изменено с 1 на None
None
refit refit: bool, str или callable, по умолчанию=True

Переобучение оценщика с использованием наилучших найденных параметров на всем
набора данных.

Для оценки по нескольким метрикам это должно быть `str`, обозначающий
scorer, который будет использоваться для поиска наилучших параметров для повторного обучения
оценщик в конце.

Когда существуют соображения, отличные от максимальной оценки в
выбора лучшего оценщика, ``refit`` может быть установлен в функцию, которая
возвращает выбранный ``best_index_`` по ``cv_results_``. В этом случае
случае, ``best_estimator_`` и ``best_params_`` будут установлены
в соответствии с возвращенным ``best_index_``, в то время как ``best_score_``
атрибут будет недоступен.

Переобученный оценщик доступен в ``best_estimator_``
атрибут и позволяет использовать ``predict`` непосредственно на этом
экземпляр ``GridSearchCV``.

Также для оценки по нескольким метрикам атрибуты ``best_index_``,
``best_score_`` и ``best_params_`` будут доступны только если
``refit`` установлен, и все они будут определены относительно этого конкретного
scorer.

См. параметр ``scoring`` для получения дополнительной информации о нескольких метриках
оценка.

См. :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_digits.py`
чтобы увидеть, как разработать пользовательскую стратегию выбора с использованием вызываемого объекта
через `refit`.

См. :ref:`этот пример
`
для примера использования ``refit=callable`` для балансировки модели
сложность и кросс-валидированный балл.

.. versionchanged:: 0.20
Добавлена поддержка callable.
True
cv cv: int, генератор перекрестной проверки или итерируемый объект, по умолчанию=None

Определяет стратегию разделения для кросс-валидации.
Возможные значения для cv:

- None, чтобы использовать стандартную 5-кратную перекрёстную проверку,
- целое число, чтобы указать количество фолдов в `(Stratified)KFold`,
- :term:`CV splitter`,
- Итерируемый объект, возвращающий (обучающая, тестовая) разбиения в виде массивов индексов.

Для целочисленных/None входов, если оценщик является классификатором и ``y``
либо бинарная, либо многоклассовая, используется :class:`StratifiedKFold`. Во всех
в других случаях используется :class:`KFold`. Эти разделители создаются
с `shuffle=False`, чтобы разбиения были одинаковыми при всех вызовах.

См. :ref:`Руководство пользователя ` для различных
стратегии перекрестной проверки, которые можно использовать здесь.

.. versionchanged:: 0.22
Значение по умолчанию ``cv``, если None, изменено с 3-кратной на 5-кратную перекрестную проверку.
RepeatedStrat...andom_state=0)
verbose verbose: int

Управляет подробностью вывода: чем выше, тем больше сообщений.

- >1 : время вычисления для каждого фолда и кандидата параметра
отображается;
- >2 : оценка также отображается;
- >3 : также отображаются индексы фолда и кандидатных параметров
вместе со временем начала вычислений.
0
pre_dispatch pre_dispatch: int или str, по умолчанию='2*n_jobs'

Управляет количеством задач, отправляемых во время параллельного
выполнение. Уменьшение этого числа может быть полезно, чтобы избежать
взрывное увеличение потребления памяти при отправке большего количества задач
чем могут обработать процессоры. Этот параметр может быть:

- None, в этом случае все задачи немедленно создаются и запускаются. Используйте
это для легких и быстро выполняемых задач, чтобы избежать задержек из-за выполнения по требованию
создание заданий
- Целое число, указывающее точное общее количество создаваемых задач
- Строка, задающая выражение как функцию от n_jobs, например '2*n_jobs'
'2*n_jobs'
error_score error_score: 'raise' или числовое значение, по умолчанию=np.nan

Значение, присваиваемое оценке при возникновении ошибки в обучении оценщика.
Если установлено значение 'raise', ошибка вызывается. Если задано числовое значение,
Вызывается предупреждение FitFailedWarning. Этот параметр не влияет на повторную подгонку
шаг, который всегда будет вызывать ошибку.
nan
return_train_score return_train_score: bool, default=False

Если ``False``, атрибут ``cv_results_`` не будет включать обучающие
. Наличие разных классов моделей с соответствующими именами упрощает пользователям поиск этих регрессионных моделей. Во-вторых, если бы все 5 упомянутых линейных моделей были объединены в один класс, были бы параметры с множеством опций, такие как
Вычисление обучающих оценок используется для получения представления о том, как различные
настройки параметров влияют на компромисс между переобучением и недообучением.
Однако вычисление оценок на обучающем наборе может быть вычислительно
дорого и не является строго необходимым для выбора параметров, которые
дают наилучшую обобщающую производительность.

.. versionadded:: 0.19

SpectralClustering
Значение по умолчанию изменено с ``True`` на ``False``
False
SVC(random_state=0)
Параметры
C C: float, default=1.0

Параметр регуляризации. Сила регуляризации
обратно пропорционально C. Должно быть строго положительным. Штраф
является квадратичным штрафом l2. Для интуитивной визуализации эффектов
масштабирования параметра регуляризации C, см.
:ref:`sphx_glr_auto_examples_svm_plot_svm_scale_c.py`.
1.0
ядро kernel: {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'} или callable, default='rbf'

Указывает тип ядра, используемый в алгоритме. Если
если не задано, будет использоваться 'rbf'. Если задана вызываемая функция, она используется для
предварительно вычислить матрицу ядра из матриц данных; эта матрица должна быть
массив формы ``(n_samples, n_samples)``. Для интуитивного
визуализацию различных типов ядер см.
:ref:`sphx_glr_auto_examples_svm_plot_svm_kernels.py`.
'rbf'
степень degree: int, по умолчанию=3

Степень полиномиальной ядерной функции ('poly').
Должно быть неотрицательным. Игнорируется всеми другими ядрами.
3
gamma gamma: {'scale', 'auto'} или float, по умолчанию='scale'

Коэффициент ядра для 'rbf', 'poly' и 'sigmoid'.

- если передано ``gamma='scale'`` (по умолчанию), то используется
1 / (n_features * X.var()) в качестве значения gamma,
- если 'auto', использует 1 / n_features
- если float, должен быть неотрицательным.

.. versionchanged:: 0.22
Значение по умолчанию для ``gamma`` изменилось с 'auto' на 'scale'.
'scale'
coef0 coef0: float, по умолчанию=0.0

Независимый член в функции ядра.
Это значимо только для 'poly' и 'sigmoid'.
0.0
сжатие shrinking: bool, по умолчанию=True

Использовать ли эвристику сжатия.
См. :ref:`Руководство пользователя `.
True
вероятность probability: bool, default=False

Включить ли оценку вероятностей. Это должно быть включено до
при вызове `fit`, замедлит этот метод, поскольку он внутренне использует
5-кратная перекрестная проверка, и `predict_proba` может быть несовместима с
`predict`. Подробнее в :ref:`Руководстве пользователя `.
False
tol tol: float, по умолчанию=1e-3

Допуск для критерия остановки.
0.001
cache_size cache_size: float, default=200

Укажите размер кэша ядра (в МБ).
200
class_weight class_weight: dict или 'balanced', по умолчанию=None

Установить параметр C класса i в class_weight[i]*C для
SVC. Если не указано, предполагается, что все классы имеют
вычисление градиента с
Режим "balanced" использует значения y для автоматической настройки
веса, обратно пропорциональные частотам классов во входных данных
как ``n_samples / (n_classes * np.bincount(y))``.
None
verbose verbose: bool, default=False

Включить подробный вывод. Обратите внимание, что эта настройка использует
настройка времени выполнения на процесс в libsvm, которая, если включена, может не работать
правильно в многопоточном контексте.
False
max_iter max_iter: int, default=-1

Жесткое ограничение на итерации внутри решателя, или -1 для отсутствия ограничения.
-1
decision_function_shape decision_function_shape: {'ovo', 'ovr'}, default='ovr'

Возвращать ли функцию принятия решений 'один против всех' ('ovr') формы
(n_samples, n_classes), как и все другие классификаторы, или оригинальный
функция принятия решений 'один против одного' ('ovo') из libsvm, имеющая форму
(n_samples, n_classes * (n_classes - 1) / 2). Однако обратите внимание, что
внутренне всегда используется один-против-одного ('ovo') как стратегия многоклассовой классификации
для обучения моделей; матрица ovr строится только из матрицы ovo.
Параметр игнорируется для бинарной классификации.

.. versionchanged:: 0.19
decision_function_shape по умолчанию имеет значение 'ovr'.

.. versionadded:: 0.17
*decision_function_shape='ovr'* рекомендуется.

.. versionchanged:: 0.17
Устаревшие *decision_function_shape='ovo' и None*.
'ovr'
break_ties break_ties: bool, default=False

Если true, ``decision_function_shape='ovr'``, и количество классов > 2,
:term:`predict` будет разрешать ничьи в соответствии со значениями уверенности
:term:`decision_function`; иначе первый класс среди связанных
классов возвращается. Обратите внимание, что разрешение ничьих имеет
относительно высокая вычислительная стоимость по сравнению с простым предсказанием. См.
:ref:`sphx_glr_auto_examples_svm_plot_svm_tie_breaking.py` для
пример его использования с ``decision_function_shape='ovr'``.

.. versionadded:: 0.22
False
random_state random_state: int, экземпляр RandomState или None, по умолчанию=None

Управляет псевдослучайной генерацией чисел для перемешивания данных для
оценки вероятностей. Игнорируется, когда `probability` равно False.
Передайте целое число для воспроизводимого вывода при множественных вызовах функции.
См. :term:`Глоссарий `.
0


Теперь мы можем проверить результаты нашего поиска, отсортированные по их mean_test_score:

import pandas as pd

results_df = pd.DataFrame(search.cv_results_)
results_df = results_df.sort_values(by=["rank_test_score"])
results_df = results_df.set_index(
    results_df["params"].apply(lambda x: "_".join(str(val) for val in x.values()))
).rename_axis("kernel")
results_df[["params", "rank_test_score", "mean_test_score", "std_test_score"]]
params rank_test_score mean_test_score std_test_score
ядро
rbf {'kernel': 'rbf'} 1 0.9400 0.079297
линейный {'kernel': 'linear'} 2 0.9300 0.077846
3_poly {'degree': 3, 'kernel': 'poly'} 3 0.9044 0.098776
2_poly {'degree': 2, 'kernel': 'poly'} 4 0.6852 0.169106


Мы видим, что оценщик, использующий 'rbf' ядро показало наилучший результат, за ним следует 'linear'. Оба оценщика с 'poly' ядро показало худшие результаты, при этом использование полинома второй степени дало гораздо более низкую производительность, чем все другие модели.

Обычно анализ на этом заканчивается, но половина истории отсутствует. Вывод GridSearchCV не предоставляет информацию об уверенности в различиях между моделями. Мы не знаем, являются ли эти статистически значимым. Чтобы оценить это, нам нужно провести статистический тест. В частности, чтобы сравнить производительность двух моделей, мы должны статистически сравнить их AUC-оценки. Есть 100 выборок (AUC-оценок) для каждой модели, так как мы повторили 10 раз 10-кратную перекрестную проверку.

Однако оценки моделей не являются независимыми: все модели оцениваются на тот же 100 разделов, увеличивая корреляцию между производительностью моделей. Поскольку некоторые разделы данных могут сделать различение классов особенно легким или трудным для всех моделей, оценки моделей будут ковариировать.

Давайте исследуем этот эффект разделения, построив график производительности всех моделей в каждом фолде и вычислив корреляцию между моделями по фолдам:

# create df of model scores ordered by performance
model_scores = results_df.filter(regex=r"split\d*_test_score")

# plot 30 examples of dependency between cv fold and AUC scores
fig, ax = plt.subplots()
sns.lineplot(
    data=model_scores.transpose().iloc[:30],
    dashes=False,
    palette="Set1",
    marker="o",
    alpha=0.5,
    ax=ax,
)
ax.set_xlabel("CV test fold", size=12, labelpad=10)
ax.set_ylabel("Model AUC", size=12)
ax.tick_params(bottom=True, labelbottom=False)
plt.show()

# print correlation of AUC scores across folds
print(f"Correlation of models:\n {model_scores.transpose().corr()}")
plot grid search stats
Correlation of models:
 kernel       rbf    linear    3_poly    2_poly
kernel
rbf     1.000000  0.882561  0.783392  0.351390
linear  0.882561  1.000000  0.746492  0.298688
3_poly  0.783392  0.746492  1.000000  0.355440
2_poly  0.351390  0.298688  0.355440  1.000000

Мы можем наблюдать, что производительность моделей сильно зависит от фолда.

Как следствие, если мы предположим независимость между выборками, мы будем недооценивать дисперсию, вычисленную в наших статистических тестах, увеличивая количество ложноположительных ошибок (т.е. обнаружение значимой разницы между моделями, когда такой разницы не существует) [1].

Для этих случаев были разработаны несколько статистических тестов с коррекцией дисперсии. В этом примере мы покажем, как реализовать один из них (так называемый скорректированный t-тест Надо и Бенжио) в рамках двух различных статистических подходов: частотного и байесовского.

Сравнение двух моделей: частотный подход#

Мы можем начать с вопроса: «Значительно ли первая модель лучше второй модели (при ранжировании по mean_test_score)?

Чтобы ответить на этот вопрос с использованием частотного подхода, можно провести парный t-тест и вычислить p-значение. Это также известно как тест Дибольда-Мариано в литературе по прогнозированию. [5]. Многие варианты такого t-критерия были разработаны для учёта проблемы 'независимости выборок', описанной в предыдущем разделе. Мы будем использовать тот, который доказал получение наивысших показателей воспроизводимости (которые оценивают, насколько схожа производительность модели при её оценке на разных случайных разбиениях одного и того же набора данных), сохраняя при этом низкий уровень ложноположительных и ложноотрицательных результатов: скорректированный t-критерий Надо и Бенжио [2] который использует 10-кратно повторенную 10-кратную перекрестную проверку [3].

Этот скорректированный парный t-тест вычисляется как:

\[t=\frac{\frac{1}{k \cdot r}\sum_{i=1}^{k}\sum_{j=1}^{r}x_{ij}} {\sqrt{(\frac{1}{k \cdot r}+\frac{n_{test}}{n_{train}})\hat{\sigma}^2}}\]

где \(k\) это количество фолдов, \(r\) количество повторений в перекрестной проверке, \(x\) разница в производительности моделей, \(n_{test}\) это количество образцов, используемых для тестирования, \(n_{train}\) — это количество образцов, используемых для обучения, и \(\hat{\sigma}^2\) представляет дисперсию наблюдаемых различий.

Давайте реализуем исправленный правосторонний парный t-тест, чтобы оценить, является ли производительность первой модели значительно лучше, чем у второй модели. Наша нулевая гипотеза заключается в том, что вторая модель работает как минимум так же хорошо, как и первая.

import numpy as np
from scipy.stats import t


def corrected_std(differences, n_train, n_test):
    """Corrects standard deviation using Nadeau and Bengio's approach.

    Parameters
    ----------
    differences : ndarray of shape (n_samples,)
        Vector containing the differences in the score metrics of two models.
    n_train : int
        Number of samples in the training set.
    n_test : int
        Number of samples in the testing set.

    Returns
    -------
    corrected_std : float
        Variance-corrected standard deviation of the set of differences.
    """
    # kr = k times r, r times repeated k-fold crossvalidation,
    # kr equals the number of times the model was evaluated
    kr = len(differences)
    corrected_var = np.var(differences, ddof=1) * (1 / kr + n_test / n_train)
    corrected_std = np.sqrt(corrected_var)
    return corrected_std


def compute_corrected_ttest(differences, df, n_train, n_test):
    """Computes right-tailed paired t-test with corrected variance.

    Parameters
    ----------
    differences : array-like of shape (n_samples,)
        Vector containing the differences in the score metrics of two models.
    df : int
        Degrees of freedom.
    n_train : int
        Number of samples in the training set.
    n_test : int
        Number of samples in the testing set.

    Returns
    -------
    t_stat : float
        Variance-corrected t-statistic.
    p_val : float
        Variance-corrected p-value.
    """
    mean = np.mean(differences)
    std = corrected_std(differences, n_train, n_test)
    t_stat = mean / std
    p_val = t.sf(np.abs(t_stat), df)  # right-tailed t-test
    return t_stat, p_val
model_1_scores = model_scores.iloc[0].values  # scores of the best model
model_2_scores = model_scores.iloc[1].values  # scores of the second-best model

differences = model_1_scores - model_2_scores

n = differences.shape[0]  # number of test sets
df = n - 1
n_train = len(next(iter(cv.split(X, y)))[0])
n_test = len(next(iter(cv.split(X, y)))[1])

t_stat, p_val = compute_corrected_ttest(differences, df, n_train, n_test)
print(f"Corrected t-value: {t_stat:.3f}\nCorrected p-value: {p_val:.3f}")
Corrected t-value: 0.750
Corrected p-value: 0.227

Мы можем сравнить скорректированные t- и p-значения с нескорректированными:

t_stat_uncorrected = np.mean(differences) / np.sqrt(np.var(differences, ddof=1) / n)
p_val_uncorrected = t.sf(np.abs(t_stat_uncorrected), df)

print(
    f"Uncorrected t-value: {t_stat_uncorrected:.3f}\n"
    f"Uncorrected p-value: {p_val_uncorrected:.3f}"
)
Uncorrected t-value: 2.611
Uncorrected p-value: 0.005

Используя обычный уровень значимости alpha на p=0.05, мы наблюдаем, что нескорректированный t-тест делает вывод, что первая модель значительно лучше второй.

С исправленным подходом, напротив, мы не обнаруживаем эту разницу.

Однако в последнем случае частотный подход не позволяет нам сделать вывод, что первая и вторая модели имеют эквивалентную производительность. Если мы хотим сделать это утверждение, нам нужно использовать байесовский подход.

Сравнение двух моделей: байесовский подход#

Мы можем использовать байесовскую оценку для вычисления вероятности того, что первая модель лучше второй. Байесовская оценка выведет распределение, за которым следует среднее \(\mu\) различий в производительности двух моделей.

Чтобы получить апостериорное распределение, нам нужно определить априорное распределение, которое моделирует наши представления о том, как распределено среднее значение до просмотра данных, и умножить его на функцию правдоподобия, которая вычисляет, насколько вероятны наблюдаемые различия, учитывая значения, которые может принимать среднее значение различий.

Байесовская оценка может быть выполнена во многих формах для ответа на наш вопрос, но в этом примере мы реализуем подход, предложенный Benavoli и коллегами [4].

Один из способов определения нашего апостериорного распределения с использованием замкнутого выражения — выбрать сопряженное априорное распределение для функции правдоподобия. Бенаволи и коллеги [4] показывают, что при сравнении производительности двух классификаторов мы можем смоделировать априорное распределение как нормально-гамма распределение (с неизвестными средним и дисперсией) сопряженное с нормальным правдоподобием, чтобы таким образом выразить апостериорное как нормальное распределение. Маргинализируя дисперсию из этого нормального апостериорного распределения, мы можем определить апостериорное распределение параметра среднего как t-распределение Стьюдента. Конкретно:

\[St(\mu;n-1,\overline{x},(\frac{1}{n}+\frac{n_{test}}{n_{train}}) \hat{\sigma}^2)\]

где \(n\) — это общее количество выборок, \(\overline{x}\) представляет среднюю разницу в оценках, \(n_{test}\) это количество образцов, используемых для тестирования, \(n_{train}\) — это количество образцов, используемых для обучения, и \(\hat{\sigma}^2\) представляет дисперсию наблюдаемых различий.

Обратите внимание, что мы используем скорректированную дисперсию Надо и Бенжио в нашем Байесовском подходе.

Давайте вычислим и построим апостериорное распределение:

# initialize random variable
t_post = t(
    df, loc=np.mean(differences), scale=corrected_std(differences, n_train, n_test)
)

Построим апостериорное распределение:

x = np.linspace(t_post.ppf(0.001), t_post.ppf(0.999), 100)

plt.plot(x, t_post.pdf(x))
plt.xticks(np.arange(-0.04, 0.06, 0.01))
plt.fill_between(x, t_post.pdf(x), 0, facecolor="blue", alpha=0.2)
plt.ylabel("Probability density")
plt.xlabel(r"Mean difference ($\mu$)")
plt.title("Posterior distribution")
plt.show()
Posterior distribution

Мы можем рассчитать вероятность того, что первая модель лучше второй, вычислив площадь под кривой апостериорного распределения от нуля до бесконечности. И наоборот: мы можем рассчитать вероятность того, что вторая модель лучше первой, вычислив площадь под кривой от минус бесконечности до нуля.

better_prob = 1 - t_post.cdf(0)

print(
    f"Probability of {model_scores.index[0]} being more accurate than "
    f"{model_scores.index[1]}: {better_prob:.3f}"
)
print(
    f"Probability of {model_scores.index[1]} being more accurate than "
    f"{model_scores.index[0]}: {1 - better_prob:.3f}"
)
Probability of rbf being more accurate than linear: 0.773
Probability of linear being more accurate than rbf: 0.227

В отличие от частотного подхода, мы можем вычислить вероятность того, что одна модель лучше другой.

Обратите внимание, что мы получили результаты, аналогичные тем, что в частотном подходе. Учитывая наш выбор априорных распределений, мы по сути выполняем те же вычисления, но можем делать другие утверждения.

Область практической эквивалентности#

Иногда нас интересует определение вероятностей того, что наши модели имеют эквивалентную производительность, где "эквивалентность" определяется практическим способом. Наивный подход [4] будет определять оценщики как практически эквивалентные, когда они отличаются менее чем на 1% по точности. Но мы также могли бы определить эту практическую эквивалентность с учетом решаемой задачи. Например, разница в 5% по точности означала бы увеличение продаж на $1000, и мы считаем любую величину выше этого релевантной для нашего бизнеса.

В этом примере мы определим Область Практической Эквивалентности (ROPE) как \([-0.01, 0.01]\). That is, we will consider two models as practically equivalent if they differ by less than 1% in their performance.

Чтобы вычислить вероятности практической эквивалентности классификаторов, мы рассчитываем площадь под кривой апостериорного распределения в интервале ROPE:

rope_interval = [-0.01, 0.01]
rope_prob = t_post.cdf(rope_interval[1]) - t_post.cdf(rope_interval[0])

print(
    f"Probability of {model_scores.index[0]} and {model_scores.index[1]} "
    f"being practically equivalent: {rope_prob:.3f}"
)
Probability of rbf and linear being practically equivalent: 0.432

Мы можем построить, как апостериорное распределение распределено по интервалу ROPE:

x_rope = np.linspace(rope_interval[0], rope_interval[1], 100)

plt.plot(x, t_post.pdf(x))
plt.xticks(np.arange(-0.04, 0.06, 0.01))
plt.vlines([-0.01, 0.01], ymin=0, ymax=(np.max(t_post.pdf(x)) + 1))
plt.fill_between(x_rope, t_post.pdf(x_rope), 0, facecolor="blue", alpha=0.2)
plt.ylabel("Probability density")
plt.xlabel(r"Mean difference ($\mu$)")
plt.title("Posterior distribution under the ROPE")
plt.show()
Posterior distribution under the ROPE

Как предложено в [4], мы можем дополнительно интерпретировать эти вероятности, используя те же критерии, что и частотный подход: вероятность попадания внутрь ROPE больше 95% (уровень значимости 5%)? В этом случае мы можем заключить, что обе модели практически эквивалентны.

Байесовский подход к оценке также позволяет нам вычислить, насколько мы не уверены в нашей оценке разницы. Это можно рассчитать с помощью достоверных интервалов. Для заданной вероятности они показывают диапазон значений, которые может принимать оцениваемая величина, в нашем случае средняя разница в производительности. Например, 50% достоверный интервал [x, y] говорит нам, что существует 50% вероятность того, что истинная (средняя) разница в производительности между моделями находится между x и y.

Определим доверительные интервалы наших данных, используя 50%, 75% и 95%:

cred_intervals = []
intervals = [0.5, 0.75, 0.95]

for interval in intervals:
    cred_interval = list(t_post.interval(interval))
    cred_intervals.append([interval, cred_interval[0], cred_interval[1]])

cred_int_df = pd.DataFrame(
    cred_intervals, columns=["interval", "lower value", "upper value"]
).set_index("interval")
cred_int_df
нижнее значение верхнее значение
интервал
0.50 0.000977 0.019023
0.75 -0.005422 0.025422
0.95 -0.016445 0.036445


Как показано в таблице, существует 50% вероятность того, что истинная средняя разница между моделями будет находиться между 0.000977 и 0.019023, 70% вероятность того, что она будет между -0.005422 и 0.025422, и 95% вероятность того, что она будет между -0.016445 и 0.036445.



Попарное сравнение всех моделей: частотный подход#

Мы также могли бы быть заинтересованы в сравнении производительности всех наших моделей, оценённых с GridSearchCV. В этом случае мы будем запускать наш статистический тест несколько раз, что приводит нас к проблема множественных сравнений.

Существует много возможных способов решения этой проблемы, но стандартный подход — применить Поправка Бонферрони. Bonferroni может быть вычислен путём умножения p-значения на количество сравнений, которые мы тестируем.

Давайте сравним производительность моделей с использованием скорректированного t-теста:

from itertools import combinations
from math import factorial

n_comparisons = factorial(len(model_scores)) / (
    factorial(2) * factorial(len(model_scores) - 2)
)
pairwise_t_test = []

for model_i, model_k in combinations(range(len(model_scores)), 2):
    model_i_scores = model_scores.iloc[model_i].values
    model_k_scores = model_scores.iloc[model_k].values
    differences = model_i_scores - model_k_scores
    t_stat, p_val = compute_corrected_ttest(differences, df, n_train, n_test)
    p_val *= n_comparisons  # implement Bonferroni correction
    # Bonferroni can output p-values higher than 1
    p_val = 1 if p_val > 1 else p_val
    pairwise_t_test.append(
        [model_scores.index[model_i], model_scores.index[model_k], t_stat, p_val]
    )

pairwise_comp_df = pd.DataFrame(
    pairwise_t_test, columns=["model_1", "model_2", "t_stat", "p_val"]
).round(3)
pairwise_comp_df
model_1 model_2 t_стат p_val
0 rbf линейный 0.750 1.000
1 rbf 3_poly 1.657 0.302
2 rbf 2_poly 4.565 0.000
3 линейный 3_poly 1.111 0.807
4 линейный 2_poly 4.276 0.000
5 3_poly 2_poly 3.851 0.001


Мы наблюдаем, что после корректировки на множественные сравнения единственная модель, которая значительно отличается от других, — это '2_poly'. 'rbf', модель, занявшая первое место по GridSearchCV, незначительно не отличается от 'linear' или '3_poly'.



Попарное сравнение всех моделей: байесовский подход#

При использовании байесовской оценки для сравнения нескольких моделей нам не нужно корректировать множественные сравнения (по причинам, см. [4]).

Мы можем провести попарные сравнения тем же способом, что и в первом разделе:

pairwise_bayesian = []

for model_i, model_k in combinations(range(len(model_scores)), 2):
    model_i_scores = model_scores.iloc[model_i].values
    model_k_scores = model_scores.iloc[model_k].values
    differences = model_i_scores - model_k_scores
    t_post = t(
        df, loc=np.mean(differences), scale=corrected_std(differences, n_train, n_test)
    )
    worse_prob = t_post.cdf(rope_interval[0])
    better_prob = 1 - t_post.cdf(rope_interval[1])
    rope_prob = t_post.cdf(rope_interval[1]) - t_post.cdf(rope_interval[0])

    pairwise_bayesian.append([worse_prob, better_prob, rope_prob])

pairwise_bayesian_df = pd.DataFrame(
    pairwise_bayesian, columns=["worse_prob", "better_prob", "rope_prob"]
).round(3)

pairwise_comp_df = pairwise_comp_df.join(pairwise_bayesian_df)
pairwise_comp_df
model_1 model_2 t_стат p_val worse_prob better_prob rope_prob
0 rbf линейный 0.750 1.000 0.068 0.500 0.432
1 rbf 3_poly 1.657 0.302 0.018 0.882 0.100
2 rbf 2_poly 4.565 0.000 0.000 1.000 0.000
3 линейный 3_poly 1.111 0.807 0.063 0.750 0.187
4 линейный 2_poly 4.276 0.000 0.000 1.000 0.000
5 3_poly 2_poly 3.851 0.001 0.000 1.000 0.000


Используя байесовский подход, мы можем вычислить вероятность того, что модель работает лучше, хуже или практически эквивалентно другой.

Результаты показывают, что модель, занявшая первое место по GridSearchCV 'rbf', имеет приблизительно 6.8% шанс быть хуже, чем 'linear', и 1.8% вероятность быть хуже, чем '3_poly'. 'rbf' и 'linear' имеют 43% вероятность быть практически эквивалентными, в то время как 'rbf' и '3_poly' имеют 10% шанс быть таковыми.

Аналогично выводам, полученным с использованием частотного подхода, все модели имеют 100% вероятность быть лучше, чем '2_poly', и ни один из них не имеет практически эквивалентной производительности с последним.



Ключевые выводы#

  • Небольшие различия в показателях производительности могут легко оказаться случайными, а не потому, что одна модель предсказывает систематически лучше другой. Как показано в этом примере, статистика может сказать, насколько это вероятно.

  • При статистическом сравнении производительности двух моделей, оцененных в GridSearchCV, необходимо скорректировать рассчитанную дисперсию, которая может быть недооценена, поскольку оценки моделей не являются независимыми друг от друга.

  • Частотный подход, использующий (скорректированный по дисперсии) парный t-тест, может сказать нам, является ли производительность одной модели лучше другой с степенью уверенности выше случайной.

  • Байесовский подход может предоставить вероятности того, что одна модель лучше, хуже или практически эквивалентна другой. Он также может сказать нам, насколько мы уверены в том, что истинные различия наших моделей попадают в определенный диапазон значений.

  • При статистическом сравнении нескольких моделей требуется коррекция множественных сравнений при использовании частотного подхода.

Ссылки

[1]

Dietterich, T. G. (1998). Приближенные статистические тесты для сравнения алгоритмов обучения с учителем для классификацииNeural computation, 10(7).

[2]

Nadeau, C., & Bengio, Y. (2000). Оценка ошибки обобщения. В Advances in neural information processing systems.

[3]

Bouckaert, R. R., & Frank, E. (2004). Оценка воспроизводимости тестов значимости для сравнения алгоритмов обучения. На Тихоокеанско-Азиатской конференции по обнаружению знаний и интеллектуальному анализу данных.

[4] (1,2,3,4,5)

Benavoli, A., Corani, G., Demšar, J., & Zaffalon, M. (2017). Время для перемен: руководство по сравнению нескольких классификаторов с помощью байесовского анализа. Журнал исследований машинного обучения, 18(1). См. библиотеку Python, сопровождающую эту статью здесь.

[5]

Diebold, F.X. & Mariano R.S. (1995). Сравнение прогностической точности Journal of Business & economic statistics, 20(1), 134-144.

Общее время выполнения скрипта: (0 минут 1.701 секунд)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_grid_search_stats.ipynb

Download Python source code: plot_grid_search_stats.py

Download zipped: plot_grid_search_stats.zip

Связанные примеры

Тест с перестановками для значимости оценки классификации

Тест с перестановками для значимости оценки классификации

Сравнение калибровки классификаторов

Сравнение калибровки классификаторов

Распространённые ошибки в интерпретации коэффициентов линейных моделей

Распространённые ошибки в интерпретации коэффициентов линейных моделей

Примерный пайплайн для извлечения и оценки текстовых признаков

Примерный пайплайн для извлечения и оценки текстовых признаков

Галерея, созданная Sphinx-Gallery





предыдущий

Примерный пайплайн для извлечения и оценки текстовых признаков

next

Последовательные итерации деления пополам

На этой странице
  • Сравнение двух моделей: частотный подход
  • Сравнение двух моделей: байесовский подход
    • Область практической эквивалентности
  • Попарное сравнение всех моделей: частотный подход
  • Попарное сравнение всех моделей: байесовский подход
  • Ключевые выводы

Эта страница

  • Показать исходный код
Скачать исходный код
Скачать Jupyter notebook
Скачать в архиве
Launch JupyterLite
Launch binder

© Авторские права 2007 - 2025, разработчики scikit-learn (лицензия BSD).