Spec-Zone.ru › scikit-learn

Примечание

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

Влияние изменения порога для самообучения

В данном примере показано влияние изменения порога на самообучение. Загружается набор данных breast_cancer, и метки удаляются таким образом, что метки имеют только 50 из 569 образцов. На этом наборе данных подгоняется SelfTrainingClassifier, с различными порогами.

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

При низких пороговых значениях (в [0.4, 0.5]) классификатор обучается на образцах, которые были помечены с низкой уверенностью. Эти образцы с низкой уверенностью, вероятно, имеют неправильные предсказанные метки, и в результате подгонка на этих неправильных метках приводит к низкой точности. Обратите внимание, что классификатор помечает почти все образцы и использует только одну итерацию.

При очень высоких пороговых значениях (в [0.9, 1)) мы наблюдаем, что классификатор не увеличивает свой набор данных (количество образцов, помеченных самим классификатором, равно 0). В результате точность, достигнутая с порогом 0.9999, такая же, как и точность, которую достиг бы обычный контролируемый классификатор.

Оптимальная точность находится между этими крайностями при пороге около 0.7.

plot self training varying threshold
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

import matplotlib.pyplot as plt
import numpy as np

from sklearn import datasets
from sklearn.metrics import accuracy_score
from sklearn.model_selection import StratifiedKFold
from sklearn.semi_supervised import SelfTrainingClassifier
from sklearn.svm import SVC
from sklearn.utils import shuffle

n_splits = 3

X, y = datasets.load_breast_cancer(return_X_y=True)
X, y = shuffle(X, y, random_state=42)
y_true = y.copy()
y[50:] = -1
total_samples = y.shape[0]

base_classifier = SVC(probability=True, gamma=0.001, random_state=42)

x_values = np.arange(0.4, 1.05, 0.05)
x_values = np.append(x_values, 0.99999)
scores = np.empty((x_values.shape[0], n_splits))
amount_labeled = np.empty((x_values.shape[0], n_splits))
amount_iterations = np.empty((x_values.shape[0], n_splits))

for i, threshold in enumerate(x_values):
    self_training_clf = SelfTrainingClassifier(base_classifier, threshold=threshold)

    # We need manual cross validation so that we don't treat -1 as a separate
    # class when computing accuracy
    skfolds = StratifiedKFold(n_splits=n_splits)
    for fold, (train_index, test_index) in enumerate(skfolds.split(X, y)):
        X_train = X[train_index]
        y_train = y[train_index]
        X_test = X[test_index]
        y_test = y[test_index]
        y_test_true = y_true[test_index]

        self_training_clf.fit(X_train, y_train)

        # The amount of labeled samples that at the end of fitting
        amount_labeled[i, fold] = (
            total_samples
            - np.unique(self_training_clf.labeled_iter_, return_counts=True)[1][0]
        )
        # The last iteration the classifier labeled a sample in
        amount_iterations[i, fold] = np.max(self_training_clf.labeled_iter_)

        y_pred = self_training_clf.predict(X_test)
        scores[i, fold] = accuracy_score(y_test_true, y_pred)


ax1 = plt.subplot(211)
ax1.errorbar(
    x_values, scores.mean(axis=1), yerr=scores.std(axis=1), capsize=2, color="b"
)
ax1.set_ylabel("Accuracy", color="b")
ax1.tick_params("y", colors="b")

ax2 = ax1.twinx()
ax2.errorbar(
    x_values,
    amount_labeled.mean(axis=1),
    yerr=amount_labeled.std(axis=1),
    capsize=2,
    color="g",
)
ax2.set_ylim(bottom=0)
ax2.set_ylabel("Amount of labeled samples", color="g")
ax2.tick_params("y", colors="g")

ax3 = plt.subplot(212, sharex=ax1)
ax3.errorbar(
    x_values,
    amount_iterations.mean(axis=1),
    yerr=amount_iterations.std(axis=1),
    capsize=2,
    color="b",
)
ax3.set_ylim(bottom=0)
ax3.set_ylabel("Amount of iterations")
ax3.set_xlabel("Threshold")

plt.show()

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_self_training_varying_threshold.ipynb

Download Python source code: plot_self_training_varying_threshold.py

Download zipped: plot_self_training_varying_threshold.zip

Примеры по теме

Настройка порогового значения функции принятия решения после обучения

Важность перестановки с многоколлинеарными или коррелированными признаками

Основные моменты выпуска scikit-learn 1.5

График случайно сгенерированного набора данных с множественной меткой

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

Spec-Zone.ru

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