Spec-Zone.ru › scikit-learn

Примечание

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

Многозначная классификация с помощью цепочки классификаторов

В этом примере показано, как использовать ClassifierChain для решения задачи многозначной классификации.

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

Эта стратегия не позволяет моделировать взаимоотношения между различными задачами. ClassifierChain является мета-эстиматором (то есть эстиматором, принимающим внутренний эстиматор), который реализует более сложную стратегию. Ансамбль бинарных классификаторов используется как цепочка, где предсказание классификатора в цепочке используется в качестве признака для обучения следующего классификатора для новой метки. Таким образом, эти дополнительные признаки позволяют каждой цепочке использовать корреляции между метками.

Значение метрики подобья Якобсона для цепочки, как правило, больше, чем для набора независимых базовых моделей.

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

Загрузка набора данных

В этом примере используется набор данных yeast, содержащий 2417 точек данных, каждая из которых имеет 103 признака и 14 возможных меток. Каждая точка данных имеет хотя бы одну метку. В качестве базовой модели сначала обучим классификатор логистической регрессии для каждой из 14 меток. Для оценки производительности этих классификаторов мы предсказываем на тестовом наборе и вычисляем коэффициент подобья Якобсона для каждой выборки.

import matplotlib.pyplot as plt
import numpy as np

from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split

# Load a multi-label dataset from https://www.openml.org/d/40597
X, Y = fetch_openml("yeast", version=4, return_X_y=True)
Y = Y == "TRUE"
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

Обучение моделей

Обучаем LogisticRegression, обернутый OneVsRestClassifier, и ансамбль нескольких ClassifierChain.

LogisticRegression, обернутый OneVsRestClassifier

Так как по умолчанию LogisticRegression не может обрабатывать данные с несколькими целевыми переменными, нам необходимо использовать OneVsRestClassifier. После обучения модели мы вычисляем коэффициент подобья Якобсона.

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import jaccard_score
from sklearn.multiclass import OneVsRestClassifier

base_lr = LogisticRegression()
ovr = OneVsRestClassifier(base_lr)
ovr.fit(X_train, Y_train)
Y_pred_ovr = ovr.predict(X_test)
ovr_jaccard_score = jaccard_score(Y_test, Y_pred_ovr, average="samples")

Цепочка бинарных классификаторов

Поскольку модели в каждой цепочке упорядочены случайно, существуют значительные различия в производительности между цепочками. Вероятно, существует оптимальное упорядочение классов в цепочке, которое даст наилучшую производительность. Однако мы не знаем это упорядочение a priori. Вместо этого мы можем построить ансамбль голосования классификаторов цепочек, усреднив бинарные предсказания цепочек и применив порог 0,5. Коэффициент подобья Якобсона ансамбля больше, чем у независимых моделей, и, как правило, превышает значение для каждой цепочки в ансамбле (хотя это не гарантировано при случайном порядке цепочек).

from sklearn.multioutput import ClassifierChain

chains = [ClassifierChain(base_lr, order="random", random_state=i) for i in range(10)]
for chain in chains:
    chain.fit(X_train, Y_train)

Y_pred_chains = np.array([chain.predict_proba(X_test) for chain in chains])
chain_jaccard_scores = [
    jaccard_score(Y_test, Y_pred_chain >= 0.5, average="samples")
    for Y_pred_chain in Y_pred_chains
]

Y_pred_ensemble = Y_pred_chains.mean(axis=0)
ensemble_jaccard_score = jaccard_score(
    Y_test, Y_pred_ensemble >= 0.5, average="samples"
)

Графическое отображение результатов

Построим график значений коэффициента подобья Якобсона для независимой модели, каждой из цепочек и ансамбля (обратите внимание, что вертикальная ось на этом графике не начинается с 0).

model_scores = [ovr_jaccard_score] + chain_jaccard_scores + [ensemble_jaccard_score]

model_names = (
    "Independent",
    "Chain 1",
    "Chain 2",
    "Chain 3",
    "Chain 4",
    "Chain 5",
    "Chain 6",
    "Chain 7",
    "Chain 8",
    "Chain 9",
    "Chain 10",
    "Ensemble",
)

x_pos = np.arange(len(model_names))

fig, ax = plt.subplots(figsize=(7, 4))
ax.grid(True)
ax.set_title("Classifier Chain Ensemble Performance Comparison")
ax.set_xticks(x_pos)
ax.set_xticklabels(model_names, rotation="vertical")
ax.set_ylabel("Jaccard Similarity Score")
ax.set_ylim([min(model_scores) * 0.9, max(model_scores) * 1.1])
colors = ["r"] + ["b"] * len(chain_jaccard_scores) + ["g"]
ax.bar(x_pos, model_scores, alpha=0.5, color=colors)
plt.tight_layout()
plt.show()
Classifier Chain Ensemble Performance Comparison

Интерпретация результатов

Из этого графика можно сделать три основных вывода:

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

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_classifier_chain_yeast.ipynb

Download Python source code: plot_classifier_chain_yeast.py

Download zipped: plot_classifier_chain_yeast.zip

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

Обзор мета-эстиматоров многоклассовой тренировки

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

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

Преобразование признаков с ансамблем деревьев

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/multioutput/plot_classifier_chain_yeast.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API