Активное обучение с использованием распространения меток

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Советы по работе с виртуальной машиной

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

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/semi_supervised("Semi-Supervised Learning") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/semi_supervised -.-> lab-49184{{"Активное обучение с использованием распространения меток"}} ml/sklearn -.-> lab-49184{{"Активное обучение с использованием распространения меток"}} end

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

Начнем с загрузки набора данных цифр из библиотеки scikit-learn.

from sklearn import datasets

digits = datasets.load_digits()

Перемешивание и разделение данных

Далее мы перемешаем и разделим набор данных на помеченные и не помеченные части. Начнем с только 10 помеченных точек.

import numpy as np

rng = np.random.RandomState(0)
indices = np.arange(len(digits.data))
rng.shuffle(indices)

X = digits.data[indices[:330]]
y = digits.target[indices[:330]]
images = digits.images[indices[:330]]

n_total_samples = len(y)
n_labeled_points = 10
unlabeled_indices = np.arange(n_total_samples)[n_labeled_points:]

Обучение модели распространения меток

Теперь мы обучим модель распространения меток на помеченных точках данных и используем ее для предсказания меток оставшихся не помеченных точек данных.

from sklearn.semi_supervised import LabelSpreading

lp_model = LabelSpreading(gamma=0.25, max_iter=20)
lp_model.fit(X, y_train)
predicted_labels = lp_model.transduction_[unlabeled_indices]

Выбор наиболее неопределенных точек

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

from scipy import stats

pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)
uncertainty_index = np.argsort(pred_entropies)[::-1]
uncertainty_index = uncertainty_index[np.in1d(uncertainty_index, unlabeled_indices)][:5]

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

Мы добавим метки, введенные вручную, к помеченным точкам данных и обучим модель на них.

y_train[uncertainty_index] = y[uncertainty_index]
lp_model.fit(X, y_train)

Повторение

Мы повторим процесс выбора пяти наиболее неопределенных точек, добавления их меток к помеченным точкам данных и обучения модели, пока не получим 30 помеченных точек данных.

max_iterations = 3

for i in range(max_iterations):
    if len(unlabeled_indices) == 0:
        print("No unlabeled items left to label.")
        break

    ## select top five uncertain points
    pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)
    uncertainty_index = np.argsort(pred_entropies)[::-1]
    uncertainty_index = uncertainty_index[np.in1d(uncertainty_index, unlabeled_indices)][:5]

    ## add labels to labeled data points
    y_train[uncertainty_index] = y[uncertainty_index]

    ## train the model
    lp_model.fit(X, y_train)

    ## remove labeled data points from the unlabeled set
    delete_indices = np.array([], dtype=int)
    for index, image_index in enumerate(uncertainty_index):
        (delete_index,) = np.where(unlabeled_indices == image_index)
        delete_indices = np.concatenate((delete_indices, delete_index))
    unlabeled_indices = np.delete(unlabeled_indices, delete_indices)
    n_labeled_points += len(uncertainty_index)

Резюме

В целом, в этом практическом занятии была продемонстрирована техника активного обучения с использованием распространения меток для обучения распознаванию рукописных цифр. Мы начали с обучения модели распространения меток с использованием только 10 помеченных точек и итеративно выбирали пять наиболее неопределенных точек для присвоения им меток, пока не получили 30 помеченных точек данных. Эта техника активного обучения может быть полезна для минимизации количества помеченных точек данных, необходимых для обучения модели, при максимальном повышении ее производительности.