Сравнение онлайн-решателей для классификации рукописных цифр

Beginner

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

Введение

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

Советы по ВМ

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

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

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

Загрузка и предобработка данных

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

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

## Загрузка набора данных digits
X, y = datasets.load_digits(return_X_y=True)

## Разделение данных на обучающий и тестовый наборы
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

## Масштабирование данных, чтобы они имели нулевое среднее и единичную дисперсию
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

Определение классификаторов

Мы определим несколько онлайн-решателей для классификации, каждый с различными гиперпараметрами. Будем использовать следующие классификаторы:

  • SGDClassifier
  • Perceptron
  • PassiveAggressiveClassifier
  • LogisticRegression
from sklearn.linear_model import SGDClassifier, Perceptron, PassiveAggressiveClassifier, LogisticRegression

classifiers = [
    ("SGD", SGDClassifier(max_iter=1000)),
    ("Perceptron", Perceptron(max_iter=1000)),
    ("Passive-Aggressive I", PassiveAggressiveClassifier(max_iter=1000, loss="hinge", C=1.0, tol=1e-4)),
    ("Passive-Aggressive II", PassiveAggressiveClassifier(max_iter=1000, loss="squared_hinge", C=1.0, tol=1e-4)),
    ("LogisticRegression", LogisticRegression(max_iter=1000))
]

Обучение и оценка классификаторов

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

heldout = [0.01, 0.05, 0.25, 0.5, 0.75, 0.9, 0.95]
rounds = 10
xx = 1.0 - np.array(heldout)

for name, clf in classifiers:
    print("Training %s" % name)
    yy = []
    for i in heldout:
        yy_ = []
        for r in range(rounds):
            X_train_, X_test_, y_train_, y_test_ = train_test_split(X_train, y_train, test_size=i, random_state=r)
            clf.fit(X_train_, y_train_)
            y_pred = clf.predict(X_test_)
            yy_.append(1 - np.mean(y_pred == y_test_))
        yy.append(np.mean(yy_))
    plt.plot(xx, yy, label=name)

plt.legend(loc="upper right")
plt.xlabel("Proportion of training data")
plt.ylabel("Test error rate")
plt.show()

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

Из графика можно наблюдать, что классификаторы SGDClassifier, Perceptron и Passive-Aggressive работают похожим образом, при этом Passive-Aggressive II имеет несколько лучшую производительность. Классификатор LogisticRegression показывает наилучшие результаты в целом, с наименьшим коэффициентом ошибки тестирования для всех пропорций обучающих данных.

Резюме

В этом практическом занятии мы сравнили производительность различных онлайн-решателей для классификации рукописных цифр. Мы наблюдали, что классификатор LogisticRegression показывает наилучшие результаты в целом, а классификаторы SGDClassifier, Perceptron и Passive-Aggressive работают похожим образом. Это сравнение может помочь нам выбрать наиболее подходящий классификатор для нашего конкретного problema и набора данных.