Введение

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

Типы SVM

Существует два различных типа SVM:

  • Простой SVM: обычно используется для задач линейной регрессии и классификации.

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

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

Простой классификатор SVM работает, проводя прямую линию между двумя классами. Это означает, что все точки данных на одной стороне (положительной или отрицательной) линии будут представлять категорию, а точки данных на другой стороне линии будут помещены в другую категорию. Это означает, что на выбор может быть бесконечное количество строк. Kernel SVM похож на то, что если у нас есть несколько классификаций в то время, когда мы используем эту SVM, применяя Kernel Tricks.

H1 и H2 — это плоскости:

uH1: w.xi+b = +1

uH2: w.xi+b = –1

Определите гиперплоскости H так, чтобы:

W.xi +b ≥ +1, когда yi =+1

W.xi +b ≤ -1, когда yi = –1

Точки на плоскостях H1 и H2 являются вершинами опорных векторов

Плоскость H0 является медианой между ними, где w.xi+b =0

d+ = кратчайшее расстояние до ближайшей положительной точки

d- = кратчайшее расстояние до ближайшей отрицательной точки

Край (желоб) разделяющей гиперплоскости равен d+ + d–.

Ядра SVM или трюки с ядром

Линейный

Линейное ядро ​​работает очень хорошо, когда есть много признаков, а задачи классификации текста имеют много признаков. Они обычно рекомендуются для классификации текста, поскольку большинство задач классификации этих типов линейно разделимы.f(X) = w^T * X + b.

Полиномиальный

Это более обобщенная форма линейного ядра, различающая искривленное или нелинейное входное пространство. Полиномиальное ядро ​​не очень часто используется на практике, потому что оно не так эффективно с точки зрения вычислений, как другие ядра, и его предсказания не так точны. f(X1, X2) = (a + X1^T * X2) ^ b.

Гауссова радиальная базисная функция (RBF)

Одно из самых мощных и часто используемых ядер в SVM. Обычно выбор для нелинейных данных. f(X1, X2) = exp(-gamma * ||X1 - X2||^2).

Почему предвзятость (b) важна?

Член смещения b действительно является особым параметром в SVM. Без него классификатор всегда будет проходить по происхождению. Таким образом, SVM не дает вам разделяющую гиперплоскость с максимальным запасом, если она не проходит через начало координат, если только у вас нет предвзятого термина.

Выполнение

импорт пакетов

import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

Предварительная обработка

data = pd.read_csv("loan_dataset.csv")
data.isnull().sum()
# Dropping the missing values
data = data.dropna()
data.isnull().sum()
data.head()
# Label Encoding replacing Y/N into numerical values
data.replace({"Loan_Status":{'N':0,'Y':1}},inplace=True)
data = data.replace({"Dependents":{'3+':4}})
data.replace({'Married':{'No':0,'Yes':1},'Gender':{'Male':1,'Female':0},'Self_Employed':{'No':0,'Yes':1},'Property_Area':{'Rural':0,'Semiurban':1,'Urban':2},'Education':{'Graduate':1,'Not Graduate':0}},inplace=True)
data.head()
sns.heatmap(data.corr(),cmap="magma_r",annot=True)
plt.show()

Разделить и обучить модель

X = data.drop(columns=['Loan_ID', 'Loan_Status','Gender'], axis=1)
Y = data['Loan_Status']
# Splitting data into training data and test data
X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size=0.20, random_state=42)
classifier = svm.SVC(kernel='linear')
classifier.fit(X_train, Y_train)
X_train_prediction = classifier.predict(X_train)

Точность обучающих данных

training_data_accuracy = accuracy_score(X_train_prediction, Y_train)
print('Accuracy of training data :', training_data_accuracy)

Точность тестовых данных

X_test_prediction = classifier.predict(X_test)
test_data_accuracy = accuracy_score(X_test_prediction, Y_test)
print('Accuracy of test data :', test_data_accuracy)

Прогноз модели с новыми входными данными

res=classifier.predict([[1,1,1,1,12841,10968,349,360,1,1]])
if res==1:
    print("He can get the loan")
else:
    print("He can't get the loan")

res=classifier.predict([[1,1,1,0,12,10,39,30,0,1]])
if res==1:
    print("He can get the loan")
else:
    print("He can't get the loan")

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

Заключение

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

Проверьте мои другие блоги…











Есть сомнения? Нужна помощь? Свяжитесь со мной!

LinkedIn: https://www.linkedin.com/in/dharmaraj-d-1b707898

Github:https://github.com/DharmarajPi