Метод опорных векторов

Машина опорных векторов (SVM) — это алгоритм обучения с учителем, в основном используемый для задач классификации и регрессии.

Основная идея SVM — найти оптимальную гиперплоскость, разделяющую данные разных классов. Эта гиперплоскость должна не только правильно классифицировать данные, но и максимизировать зазор между двумя классами.

Гиперплоскость:

  • В двумерном пространстве гиперплоскость — это прямая линия.
  • В трёхмерном пространстве гиперплоскость — это плоскость.
  • В многомерном пространстве гиперплоскость — это гиперплоскость, разделяющая пространство.

Опорные векторы:

  • Опорные векторы — это точки выборки, ближайшие к гиперплоскости. Эти опорные векторы имеют решающее значение для определения гиперплоскости.
  • SVM выбирает оптимальную гиперплоскость, максимизируя расстояние от опорных векторов до гиперплоскости (то есть максимизируя зазор).

Максимальный зазор:

  • Цель SVM — максимизировать зазор классификации, сохраняя границу решения как можно дальше от точек данных двух классов. Это позволяет эффективно снизить ошибку обобщения модели.

Ядровый трюк:

  • Для линейно неразделимых данных SVM использует ядерные функции, чтобы отобразить данные в пространство более высокой размерности, в котором данные могут стать линейно разделимыми.
  • Обычно используемые ядерные функции включают: линейное ядро, полиномиальное ядро, ядро радиальной базисной функции (RBF) и т. д.

Процесс классификации SVM

  1. Выбор гиперплоскости: найти гиперплоскость, максимизирующую отступ классификации.
  2. Обучение опорных векторов: с помощью алгоритма SVM выберите точки выборки, ближайшие к гиперплоскости, в качестве опорных векторов.
  3. Поиск оптимальной гиперплоскости путём максимизации отступа: выберите оптимальную гиперплоскость, которая максимизирует отступ.
  4. Использование ядерных функций для обработки нелинейных задач: отобразите данные в высокоразмерное пространство с помощью ядерных функций, чтобы решить проблемы нелинейной разделимости.

Реализация SVM на Python

Далее мы будем использоватьscikit-learnбиблиотека для реализации простого классификатора SVM.

1. Установка необходимых библиотек

Сначала убедитесь, что вы установилиscikit-learnбиблиотека. Если она не установлена, можно использовать следующую команду для её установки:

pip install scikit-learn

2. Импорт библиотек

Пример

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

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

Мы будем использоватьscikit-learnвстроенный набор данных Iris.

Пример

# Загрузить набор данных Iris
iris = datasets.load_iris()
X = iris.data[:, :2]  # Использовать только первые два признака
y = iris.target

4. Разделение обучающей и тестовой выборок

Пример

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

5. Обучение модели SVM

Пример

# Создать классификатор SVM
clf = svm.SVC(kernel='linear')  # Использовать линейную функцию ядра

# Обучаем модель
clf.fit(X_train, y_train)

6. Предсказание и оценка

Пример

# Сделать прогнозы на тестовой выборке
y_pred = clf.predict(X_test)

# Вычислите точность
accuracy = accuracy_score(y_test, y_pred)
print(f"Точность модели: {accuracy:.2f}")

7. Визуализация результатов

Пример

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Загрузить набор данных Iris
iris = datasets.load_iris()
X = iris.data[:, :2]  # Использовать только первые два признака
y = iris.target

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

# Создать классификатор SVM
clf = svm.SVC(kernel='linear')  # Использовать линейную функцию ядра

# Обучаем модель
clf.fit(X_train, y_train)

# Сделать прогнозы на тестовой выборке
y_pred = clf.predict(X_test)

# Вычислите точность
accuracy = accuracy_score(y_test, y_pred)
print(f"Точность модели: {accuracy:.2f}")

# Построить границу решения
def plot_decision_boundary(X, y, model):
    h = .02  # Размер шага сетки
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlabel('Длина чашелистика')
    plt.ylabel('Ширина чашелистика')
    plt.title('Граница решения SVM')
    plt.show()

plot_decision_boundary(X_train, y_train, clf)

Выполните приведённый выше код, вывод:

模型准确率: 0.80

Изображение отображается как:

Другие расширения