Двоичная классификация цветов Ириса с использованием SVM

Beginner

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

Введение

В этом руководстве мы рассмотрим процесс использования различных ядер SVM для классификации. Будем использовать датасет Iris, который содержит измерения цветов. Этот датасет имеет три класса, но мы будем использовать только два из них для бинарной классификации.

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

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

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

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

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

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

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets, svm

iris = datasets.load_iris()
X = iris.data
y = iris.target

X = X[y!= 0, :2]
y = y[y!= 0]

Подготовка данных

Далее мы подготовим данные для обучения и тестирования. Мы разделим данные на 90% для обучения и 10% для тестирования.

n_sample = len(X)

np.random.seed(0)
order = np.random.permutation(n_sample)
X = X[order]
y = y[order].astype(float)

X_train = X[: int(0.9 * n_sample)]
y_train = y[: int(0.9 * n_sample)]
X_test = X[int(0.9 * n_sample) :]
y_test = y[int(0.9 * n_sample) :]

Обучение модели с разными ядрами

Теперь мы обучим модель SVM с использованием трех разных ядер: линейного (linear), радиального базисного (rbf) и полиномиального (poly). Для каждого ядра мы подберем модель к обучающим данным, построим границу решения и покажем точность на тестовых данных.

## fit the model
for kernel in ("linear", "rbf", "poly"):
    clf = svm.SVC(kernel=kernel, gamma=10)
    clf.fit(X_train, y_train)

    plt.figure()
    plt.clf()
    plt.scatter(
        X[:, 0], X[:, 1], c=y, zorder=10, cmap=plt.cm.Paired, edgecolor="k", s=20
    )

    ## Circle out the test data
    plt.scatter(
        X_test[:, 0], X_test[:, 1], s=80, facecolors="none", zorder=10, edgecolor="k"
    )

    plt.axis("tight")
    x_min = X[:, 0].min()
    x_max = X[:, 0].max()
    y_min = X[:, 1].min()
    y_max = X[:, 1].max()

    XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
    Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()])

    ## Put the result into a color plot
    Z = Z.reshape(XX.shape)
    plt.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
    plt.contour(
        XX,
        YY,
        Z,
        colors=["k", "k", "k"],
        linestyles=["--", "-", "--"],
        levels=[-0.5, 0, 0.5],
    )

    plt.title(kernel)
    plt.show()

    print(f"Accuracy with {kernel} kernel: {clf.score(X_test, y_test)}")

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

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

Обзор

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