рекомендации

воскресенье, 3 февраля 2019 г.

Введение в алгоритм Support Vector Machine

Введение 
  
Освоение алгоритмов машинного обучения не всегда производится в правильной последовательности. Большинство начинают с изучения регрессии. Решает ли она ваши задачи? Как правило, нет! Потому что вы можете сделать гораздо больше, чем просто регрессия! 
  
К настоящему моменту я надеюсь, вы освоили Random Forest, алгоритм Naive Bayes и Ensemble Modeling. В этой статье я познакомлю вас с основами углубленного знания важнейшего алгоритма машинного обучения, support vector machines. 
  
Что такое Support Vector Machine? 
  
«Машина опорных векторов» (SVM) - это алгоритм машинного обучения с учителем, который можно использовать как для задач классификации, так и для регрессии. Тем не менее, в основном он используется в задачах классификации. В этом алгоритме мы строим каждый элемент данных как точку в n-мерном пространстве (где n - количество имеющихся у вас признаков), причем значением каждого признака является значение определенной координаты. Затем мы выполняем классификацию, находя гиперплоскость, которая очень хорошо разделяет два класса (посмотрите на скриншот ниже). 
  

  
Опорные векторы (Support Vectors- это просто координаты индивидуального наблюдения. Машина опорных векторов - это граница, которая лучше всего разделяет два класса (гиперплоскость/линия). 
  
Вы можете посмотреть определение опорных векторов и несколько примеров их работы здесь. 
  
Как это работает? 
  
Выше мы говорили о разделении двух классов гиперплоскостью. Теперь актуальный вопрос: «Как мы можем найти правильную гиперплоскость?». Не волнуйтесь, это не так сложно, как вы думаете! 
  
Давайте разберемся: 
  
Определите правильную гиперплоскость (сценарий-1): Здесь у нас есть три гиперплоскости (A, B и C). Теперь определите правильную гиперплоскость, чтобы классифицировать звезду и круг. 
  

      
Вам нужно запомнить правило определения правильной гиперплоскости: «Выберите гиперплоскость, которая лучше всего разделяет два класса». В этом сценарии гиперплоскость «B» отлично выполнила эту работу. 
  
Определите правильную гиперплоскость (сценарий-2): Здесь у нас есть три гиперплоскости (A, B и C), и все они хорошо разделяют классы. Теперь, как мы можем определить правильную гиперплоскость? 
  

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

      
Выше вы можете видеть, что margin для гиперплоскости C больше по сравнению с A и B. Следовательно, мы называем правильной гиперплоскость C. Другой причиной выбора гиперплоскости с более высоким значением margin является надежность. Если мы выберем гиперплоскость с низким margin, то существует большая вероятность ошибочной классификации. 
  
Определите правильную гиперплоскость (сценарий-3): Подсказка: для определения правильной гиперплоскости используйте правила, описанные в предыдущем разделе.  
  

  
Некоторые из вас, возможно, выбрали гиперплоскость B, поскольку она имеет более высокое значение margin по сравнению с A. Но здесь есть уловка. SVM выбирает гиперплоскость, которая точно классифицирует классы, до максимизации margin. Здесь гиперплоскость B имеет ошибку классификации, и A классифицирует все правильно. Следовательно, правильная гиперплоскость - это А. 
  
Можем ли мы классифицировать два класса (сценарий-4)?: Ниже я не могу разделить два класса, используя прямую линию, поскольку одна звезда находится на территории другого класса как выброс. 
  

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

  
Найдите гиперплоскость для разделения на классы (сценарий 5). В приведенном ниже сценарии мы не можем разделить классы линейной гиперплоскостью, так как же SVM классифицирует эти два класса? До сих пор мы рассматривали только линейную гиперплоскость. 
  

  
SVM может решить эту проблему. Без труда! Он решает эту проблему путем введения дополнительных функций. Здесь мы добавим новую функцию z = x^2 + y^2. Теперь давайте нарисуем точки данных на осях x и z: 
  

      
На приведенном выше графике необходимо учитывать следующие моменты: 
  
1. Все значения для z всегда будут положительными, потому что z - это квадрат суммы x и y. 
2. На исходном графике красные круги появляются рядом с началом координат осей x и y, что приводит к снижению значения z, а звезды относительно далеко от начала координат, что повышает значения z. 
  
В SVM легко провести линейную гиперплоскость между этими двумя классами. Но возникает еще один острый вопрос: нужно ли добавлять эту функцию вручную, чтобы получить гиперплоскость? Нет, в SVM есть методика, называемая kernel trick. Это функции, которые берут входное пространство с небольшим количеством размерностей и преобразуют его в пространство с большим количеством размерностей, т. е. они преобразует данные, которые нельзя разделить линейной гиперплоскостью, в данные, которые можно ею разделить, эти функции называются ядрами (kernel). Это в основном полезно в задачах нелинейной классификации. Проще говоря, они выполняют некоторые чрезвычайно сложные преобразования данных, а затем находят процесс их разделения на основе определенных вами меток или выходных данных. 
  
Когда мы смотрим на гиперплоскость в исходном пространстве ввода, она выглядит как круг: 
  

  
Теперь давайте посмотрим на методы применения алгоритма SVM в задачах науки о данных. 
  
Как реализовать SVM в Python и R? 
  
В Python есть scikit-learn - широко используемая библиотека для реализации алгоритмов машинного обучения, SVM имеется в библиотеке scikit-learn и имеет ту же структуру (импорт библиотеки, создание объектов, подгонка модели и прогнозирование). Давайте посмотрим на код ниже: 

#Импорт библиотеки 
from sklearn import svm 
  
#Предположим, у вас есть X (предиктор) и Y (целевая переменная) для обучающего набора #данных и x_test(предиктор) тестового набора данных test_dataset 
  
# Создаем объект классификации SVM 
model = svm.svc(kernel='linear', c=1gamma=1 
  
# с ним связаны различные параметры, такие как изменение значения ядра, гаммы и C. #Подробнее об этом мы поговорим в следующем разделе. Обучите модель с помощью #обучающего набора и проверьте эффективность модели.  
model.fit(X, y) 
model.score(X, y) 
  
#Вывод прогноза 
predicted= model.predict(x_test) 
  
Пакет e1071 в R используется для простого создания машин опорных векторов. Он имеет вспомогательные функции, а также код для наивного байесовского классификатора. Создание машины опорных векторов в R и Python осуществляется аналогично, давайте теперь посмотрим на следующий код: 
  
#Импорт библиотеки 
require(e1071) #Включает SVM  
Train <- read.csv="" span="">file.choose()) 
Test <- read.csv="" span="">file.choose()) 
# Есть различные опции, связанные с обучением SVM; такие как изменение ядра, гаммы и значения C. 
  
# создаем модель 
model <- nbsp="" span="">svm(Target ~ Predictor1 + Predictor2 + Predictor3,data = Train,kernel = 'linear',gamma=0.2,cost=100) 
  
#Вывод прогноза 
preds <- nbsp="" span="">predict(model,Test) 
table(preds) 
  
Как настраивать параметры SVM? 
  
Настройка параметров для алгоритмов машинного обучения может существенно повысить эффективность модели. Давайте посмотрим на список параметров, доступных для SVM. 
  
sklearn.svm.SVC(C=1.0kernel='rbf'degree=3gamma=0.0, coef0=0.0shrinking=Trueprobability=False,tol=0.001cache_size=200class_weight=Noneverbose=Falsemax_iter=-1random_state=None) 

Я собираюсь обсудить некоторые важные параметры, оказывающие большее влияние на производительность модели: «kernel», «gamma» и «C». 
  
kernel: Мы уже обсуждали его. Здесь у нас есть различные опции, доступные для kernel, такие как «linear», «rbf», «poly» и другие (значение по умолчанию «rbf»). «rbf» и «poly» полезны для нелинейной гиперплоскости. Давайте рассмотрим пример, где мы используем линейное ядро на двух признаках набора данных iris для их классификации. 
  
Пример: линейное ядро 
  
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn import svmdatasets 
  
# импортируем данные 
iris = datasets.load_iris() 
= iris.data[:, :2# используем только два первых признака 
= iris.target 
  
# создаем экземпляр SVM и аппроксимируем наши данные. Мы не масштабируем наши данные, так как хотим построить опорные вектора 
= 1.0 # параметр регуляризации SVM 
svc = svm.SVC(kernel='linear', C=1,gamma=0).fit(X, y) 
  
# создаем сетку для графика 
x_minx_max = X[:, 0].min() - 1, X[:, 0].max() + 1 
y_miny_max = X[:, 1].min() - 1, X[:, 1].max() + 1 
= (x_max / x_min)/100 
xxyy = np.meshgrid(np.arange(x_minx_max, h), 
np.arange(y_miny_max, h)) 
  
plt.subplot(111) 
= svc.predict(np.c_[xx.ravel(), yy.ravel()]) 
= Z.reshape(xx.shape) 
plt.contourf(xxyy, Z, cmap=plt.cm.Pairedalpha=0.8) 
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired) 
plt.xlabel('Sepal length') 
plt.ylabel('Sepal width') 
plt.xlim(xx.min(), xx.max()) 
plt.title('SVC with linear kernel') 
plt.show() 
  

  
Пример: ядро rbf 
  
Изменим тип ядра на rbf и посмотрим на результат. 
  
svc = svm.SVC(kernel='rbf', C=1,gamma=0).fit(X, y) 


  
Я бы посоветовал вам перейти на линейное ядро, если у вас большое количество объектов (> 1000), потому что более вероятно, что данные линейно разделимы в многомерном пространстве. Кроме того, вы можете использовать RBF, но не забудьте провести перекрестную проверку для его параметров, чтобы избежать чрезмерной подгонки. 
  
gamma: коэффициент ядра для «rbf», «poly» и «sigmoid». При более высоком значении gamma алгоритм будет пытаться точно соответствовать обучающему набору данных и может вызвать проблему переобучения. 
  
Пример. Давайте посмотрим разницу между разными значениями gamma, такими как 0, 10 или 100. 
  
svc = svm.SVC(kernel='rbf', C=1,gamma=0).fit(X, y) 
  

  
C: параметр штрафа ошибочного члена C. Он также задает компромисс между плавной границей принятия решений и правильной классификацией точек обучения. 
  

Мы всегда должны смотреть на результаты перекрестной проверки, чтобы обеспечить эффективную комбинацию этих параметров и избегать чрезмерной подгонки. 
  
В R SVM может быть настроен таким же образом, как и в Python. Ниже приведены соответствующие параметры для пакета e1071: 
  
     Параметр kernel может быть настроен на «Linear», «Poly», «rbf» и т. д. 
     Значение gamma можно настроить, установив параметр «Gamma». 
     Значение C в Python соответствует параметру «Cost» в R. 
  
Плюсы и минусы, связанные с SVM 
  
     Плюсы: 
он работает очень хорошо при четкой границе разделения классов; 
эффективен на больших размерностях; 
он эффективен в тех случаях, когда количество признаков превышает количество наблюдений; 
использует подмножество обучающих точек в функции принятия решений (так называемые опорные векторы), поэтому он также эффективно использует память. 
     Минусы: 
он не очень хорошо работает с большими наборами данных, так как что время обучения достаточно большое; 
он также не очень хорошо работает с данными, содержащими много шума, то есть когда целевые классы перекрываются; 
SVM напрямую не предоставляет оценки вероятности, они рассчитываются с использованием дорогой пятикратной перекрестной проверки. Это метод SVC библиотеки Python scikit-learn. 

Комментариев нет:

Отправить комментарий