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

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

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

Чтобы увидеть больше таких руководств и курсов, посетите DataCamp:

В этом уроке вы затронете следующие темы:

  • Опорные векторные машины
  • Как это работает?
  • ядра
  • Построение классификатора в Scikit-learn
  • Настройка гиперпараметров
  • Преимущества и недостатки
  • Вывод

Опорные векторные машины

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

Векторы поддержки

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

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

Гиперплоскость — это плоскость принятия решений, разделяющая набор объектов, принадлежащих к разным классам.

Допуск

Маржа — это промежуток между двумя линиями на ближайших точках класса. Рассчитывается как перпендикулярное расстояние от линии до опорных векторов или ближайших точек. Если маржа между классами больше, чем она считается хорошей маржей, в противном случае это плохая маржа.

Первоначально опубликовано на https://www.datacamp.com/community/tutorials/random-forests-classifier-python

Как работает SVM?

Основная цель состоит в том, чтобы наилучшим образом разделить данный набор данных. Расстояние между ближайшими точками называется запасом. Цель состоит в том, чтобы выбрать гиперплоскость с максимально возможным запасом между опорными векторами в заданном наборе данных. SVM ищет максимальную маргинальную гиперплоскость, выполнив следующие шаги:

  1. Создавайте гиперплоскости, которые лучше разделяют классы. На рисунке слева показаны три гиперплоскости черного, синего и оранжевого цветов. Здесь синий и оранжевый имеют более высокие ошибки классификации, но черный правильно разделяет два класса.

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

Работа с нелинейными и неразделимыми плоскостями

Некоторые задачи нельзя решить с помощью линейной гиперплоскости, как показано на рисунке ниже (слева).

В такой ситуации SVM использует трюк ядра для преобразования входного пространства в пространство большего размера, как показано справа. Точки данных нанесены на оси x и z (Z — это квадрат суммы x и y: z=x²=y²). Теперь вы можете легко разделить эти точки, используя линейное разделение.

Ядра SVM

Алгоритм SVM реализован на практике с использованием ядра. Ядро преобразует пространство входных данных в требуемую форму. SVM использует технику, называемую трюком ядра. Здесь ядро ​​берет низкоразмерное входное пространство и преобразует его в многомерное пространство. Другими словами, вы можете сказать, что он преобразует неразделимые проблемы в разделимые, добавляя к ним больше измерений. Это наиболее полезно в задаче нелинейного разделения. Трюк с ядром помогает нам построить более точный классификатор.

  • Линейное ядро ​​Линейное ядро ​​можно использовать как нормальное скалярное произведение любых двух заданных наблюдений. Произведение двух векторов представляет собой сумму произведений каждой пары входных значений.
K(x, xi) = sum(x * xi)
  • Полиномиальное ядро ​​Полиномиальное ядро ​​является более обобщенной формой линейного ядра. Полиномиальное ядро ​​может различать искривленное или нелинейное входное пространство.
K(x,xi) = 1 + sum(x * xi)^d

Где d - степень многочлена. d=1 аналогично линейному преобразованию. Степень необходимо указать вручную в алгоритме обучения.

  • Ядро радиальной базисной функции Ядро радиальной базисной функции — это популярная функция ядра, обычно используемая в классификации машин опорных векторов. RBF может отображать входное пространство в бесконечномерное пространство.
K(x,xi) = exp(-gamma * sum((x – xi)^2)

Здесь гамма — это параметр, который находится в диапазоне от 0 до 1. Более высокое значение гаммы будет идеально соответствовать обучающему набору данных, что приводит к переобучению. Гамма=0,1 считается хорошим значением по умолчанию. Значение гаммы необходимо указать вручную в алгоритме обучения.

Построение классификатора в Scikit-learn

До сих пор вы узнали о теоретических основах SVM. Теперь вы узнаете о его реализации на Python с помощью scikit-learn.

В части построения модели вы можете использовать набор данных рака, который является очень известной проблемой классификации нескольких классов. Этот набор данных рассчитывается на основе оцифрованного изображения тонкоигольной аспирации (ТАБ) массы молочной железы. Они описывают характеристики ядер клеток, присутствующих на изображении.

Набор данных содержит 30 признаков (средний радиус, средняя текстура, средний периметр, средняя площадь, средняя гладкость, средняя компактность, средняя вогнутость, средние вогнутые точки, средняя симметрия, средняя фрактальная размерность, ошибка радиуса, ошибка текстуры, ошибка периметра, ошибка площади, ошибка гладкости, ошибка компактности, ошибка вогнутости, ошибка вогнутых точек, ошибка симметрии, ошибка фрактальной размерности, наихудший радиус, наихудшая текстура, наихудший периметр, наихудшая площадь, наихудшая гладкость, наихудшая компактность, наихудшая вогнутость, наихудшая вогнутость, наихудшая симметрия и наихудшая фрактальная размерность) и мишень (вид рака).

Эти данные имеют два типа классов рака: злокачественный (вредный) и доброкачественный (неопасный). Здесь вы можете построить модель для классификации типа рака. Набор данных доступен в библиотеке scikit-learn, или вы также можете загрузить его из библиотеки машинного обучения UCI.

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

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

#Import scikit-learn dataset library
from sklearn import datasets
#Load dataset
cancer = datasets.load_breast_cancer()

Изучение данных

После того, как вы загрузили набор данных, вы можете узнать о нем немного больше. Вы можете проверить функции и целевые имена.

# print the names of the 13 features
print("Features: ", cancer.feature_names)
# print the label type of cancer('malignant' 'benign')
print("Labels: ", cancer.target_names)

Output:
Features:  ['mean radius' 'mean texture' 'mean perimeter' 'mean area'
 'mean smoothness' 'mean compactness' 'mean concavity'
 'mean concave points' 'mean symmetry' 'mean fractal dimension'
 'radius error' 'texture error' 'perimeter error' 'area error'
 'smoothness error' 'compactness error' 'concavity error'
 'concave points error' 'symmetry error' 'fractal dimension error'
 'worst radius' 'worst texture' 'worst perimeter' 'worst area'
 'worst smoothness' 'worst compactness' 'worst concavity'
 'worst concave points' 'worst symmetry' 'worst fractal dimension']
Labels:  ['malignant' 'benign']

Давайте рассмотрим его еще немного. вы также можете проверить форму набора данных с помощью shape.

# print data(feature)shape
cancer.data.shape

Output:
(569, 30)

Давайте проверим 5 лучших записей набора функций.

# print the cancer data features (top 5 records)
print(cancer.data[0:2])

Output:
[[1.799e+01 1.038e+01 1.228e+02 1.001e+03 1.184e-01 2.776e-01 3.001e-01
  1.471e-01 2.419e-01 7.871e-02 1.095e+00 9.053e-01 8.589e+00 1.534e+02
  6.399e-03 4.904e-02 5.373e-02 1.587e-02 3.003e-02 6.193e-03 2.538e+01
  1.733e+01 1.846e+02 2.019e+03 1.622e-01 6.656e-01 7.119e-01 2.654e-01
  4.601e-01 1.189e-01]
 [2.057e+01 1.777e+01 1.329e+02 1.326e+03 8.474e-02 7.864e-02 8.690e-02
  7.017e-02 1.812e-01 5.667e-02 5.435e-01 7.339e-01 3.398e+00 7.408e+01
  5.225e-03 1.308e-02 1.860e-02 1.340e-02 1.389e-02 3.532e-03 2.499e+01
  2.341e+01 1.588e+02 1.956e+03 1.238e-01 1.866e-01 2.416e-01 1.860e-01
  2.750e-01 8.902e-02]]

Давайте проверим записи целевого набора.

# print the cancer labels (0:malignant, 1:benign)
print(cancer.target[0:20])

Output:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]

Разделение данных

Чтобы понять производительность модели, хорошей стратегией является разделение набора данных на обучающий набор и тестовый набор.

Давайте разделим набор данных с помощью функции train_test_split(). вам нужно передать в основном 3 параметра: функцию, цель и размер test_set. Кроме того, вы можете использовать random_state для случайного выбора записей.

# Import train_test_split function
from sklearn.model_selection import train_test_split
# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.3,random_state=109) # 70% training and 30% test

Создание модели

Давайте построим модель машины опорных векторов. Во-первых, импортируйте модуль SVM и создайте объект классификатора опорных векторов, передав ядро ​​аргумента в качестве линейного ядра в функции SVC().

Затем подгоните вашу модель к набору поездов, используя fit(), и выполните прогнозирование тестового набора, используя предсказать().

In [13]:

#Import svm model
from sklearn import svm
#Create a svm Classifier
clf = svm.SVC(kernel='linear') # Linear Kernel
#Train the model using the training sets
clf.fit(X_train, y_train)
#Predict the response for test dataset
y_pred = clf.predict(X_test)

Оценка модели

Оценим, насколько точно классификатор или модель может предсказать рак молочной железы у пациентов.

Точность можно вычислить путем сравнения фактических значений набора тестов и прогнозируемых значений.

#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
# Model Accuracy: how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

Output:
Accuracy: 0.9649122807017544

Ну, вы получили классификацию 96,49%, что считается очень хорошей точностью.

Для дальнейшей оценки вы также можете проверить точность и полноту модели.

# Model Precision: what percentage of positive tuples are labeled as such?
print("Precision:",metrics.precision_score(y_test, y_pred))
# Model Recall: what percentage of positive tuples are labelled as such?
print("Recall:",metrics.recall_score(y_test, y_pred))

Output:
Precision: 0.9811320754716981
Recall: 0.9629629629629629

Что ж, вы получили точность 98% и полноту 96%, что считается очень хорошей точностью и полнотой.

Настройка гиперпараметров

  • Ядро: основной функцией ядра является преобразование входных данных данного набора данных в требуемую форму. Существуют различные типы функций, такие как линейная, полиномиальная и радиальная базисная функция (RBF). Полиномиальный и RBF полезны для нелинейной гиперплоскости. Полиномиальные ядра и ядра RBF вычисляют линию разделения в более высоком измерении. В некоторых приложениях предлагается использовать более сложное ядро ​​для разделения криволинейных и нелинейных классов. Это преобразование может привести к более точным классификаторам.
  • Регуляризация: Параметр регуляризации в параметре Python Scikit-learn C, используемый для поддержания регуляризации. Здесь C — параметр штрафа, который представляет ошибочную классификацию или ошибку. Неправильная классификация или термин ошибки сообщает оптимизации SVM, насколько допустима ошибка. Вот как вы можете контролировать компромисс между границей решения и сроком ошибочной классификации. Меньшее значение C вызывает гиперплоскость с малым полем, а большое значение C вызывает гиперплоскость с большим полем.
  • Гамма: более низкое значение гаммы слабо соответствует набору обучающих данных, тогда как более высокое значение гаммы точно соответствует набору обучающих данных, что приводит к переоснащению. Другими словами, вы можете сказать, что низкое значение гаммы учитывает только близлежащие точки при расчете разделительной линии, тогда как высокое значение гаммы учитывает все точки при расчете разделительной линии.

Преимущества

Классификаторы SVM обеспечивают хорошую точность и выполняют более быстрое прогнозирование по сравнению с алгоритмом Naïve Bayes. Они также используют меньше памяти, поскольку используют подмножество точек обучения на этапе принятия решения. SVM хорошо работает с четким полем разделения и с большим размерным пространством.

Недостаток

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

Вывод

Поздравляем, вы добрались до конца этого урока!

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

Я с нетерпением жду любых отзывов или вопросов. Вы можете задать вопрос, оставив комментарий, и я постараюсь ответить на него.

Первоначально опубликовано на https://www.datacamp.com/community/tutorials/random-forests-classifier-python

Хотите изучить науку о данных, загляните на DataCamp.

Больше таких статей вы можете найти в моем блоге Machine Learning Geek.

Свяжитесь со мной в Linkedin: https://www.linkedin.com/in/avinash-navlani/