Метод опорных векторов
Машина опорных векторов (SVM) — это алгоритм обучения с учителем, в основном используемый для задач классификации и регрессии.
Основная идея SVM — найти оптимальную гиперплоскость, разделяющую данные разных классов. Эта гиперплоскость должна не только правильно классифицировать данные, но и максимизировать зазор между двумя классами.
Гиперплоскость:
- В двумерном пространстве гиперплоскость — это прямая линия.
- В трёхмерном пространстве гиперплоскость — это плоскость.
- В многомерном пространстве гиперплоскость — это гиперплоскость, разделяющая пространство.
Опорные векторы:
- Опорные векторы — это точки выборки, ближайшие к гиперплоскости. Эти опорные векторы имеют решающее значение для определения гиперплоскости.
- SVM выбирает оптимальную гиперплоскость, максимизируя расстояние от опорных векторов до гиперплоскости (то есть максимизируя зазор).
Максимальный зазор:
- Цель SVM — максимизировать зазор классификации, сохраняя границу решения как можно дальше от точек данных двух классов. Это позволяет эффективно снизить ошибку обобщения модели.
Ядровый трюк:
- Для линейно неразделимых данных SVM использует ядерные функции, чтобы отобразить данные в пространство более высокой размерности, в котором данные могут стать линейно разделимыми.
- Обычно используемые ядерные функции включают: линейное ядро, полиномиальное ядро, ядро радиальной базисной функции (RBF) и т. д.
Процесс классификации SVM
- Выбор гиперплоскости: найти гиперплоскость, максимизирующую отступ классификации.
- Обучение опорных векторов: с помощью алгоритма SVM выберите точки выборки, ближайшие к гиперплоскости, в качестве опорных векторов.
- Поиск оптимальной гиперплоскости путём максимизации отступа: выберите оптимальную гиперплоскость, которая максимизирует отступ.
- Использование ядерных функций для обработки нелинейных задач: отобразите данные в высокоразмерное пространство с помощью ядерных функций, чтобы решить проблемы нелинейной разделимости.
Реализация SVM на Python
Далее мы будем использоватьscikit-learnбиблиотека для реализации простого классификатора SVM.
1. Установка необходимых библиотек
Сначала убедитесь, что вы установилиscikit-learnбиблиотека. Если она не установлена, можно использовать следующую команду для её установки:
pip install scikit-learn
2. Импорт библиотек
Пример
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 = 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
Пример
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 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
Изображение отображается как:
