Краткая история

Итак, представьте себе: это 1963 год, пара блестящих русских чуваков, Владимир Н. Вапник и Алексей Я. Червоненкис придумал такую ​​штуку, как машины опорных векторов (SVM). В то время никому не было дела до SVM.

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

Так или иначе, в 1990-х SVM действительно начали набирать обороты. Их использовали для самых разных целей, от распознавания речи до компьютерного зрения. И прежде чем вы это узнали, SVM были крутой новинкой в ​​​​мире машинного обучения. Все говорили о них, как о новом альбоме Тейлор Свифт.

Действительно в теме

Хорошо, ребята, позвольте мне рассказать вам об этих вещах, называемых машинами опорных векторов.

Итак, вы знаете, как иногда в жизни вам нужно принять решение, и вы не совсем уверены, куда идти? Ну, машины опорных векторов вроде того. Это тип алгоритма, который помогает вам принять решение о том, как классифицировать вещи.

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

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

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

Ха-ха, попался! Итак, давайте поговорим о математике, лежащей в основе машин опорных векторов.

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

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

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

И это основная идея! Конечно, это еще не все, но, надеюсь, это даст вам представление о математических расчетах, лежащих в основе машин опорных векторов.

Давайте углубимся в математику, лежащую в основе машин опорных векторов. Но сначала позвольте мне рассказать вам анекдот. Почему статистик отказался лететь на самолете? Потому что вероятность того, что на борту бомба, слишком высока для его комфорта! Хорошо, вернемся к SVM.

В основе SVM лежит идея поиска гиперплоскости, которая разделяет два класса точек данных с максимально возможным запасом. Я немного объяснил, что такое гиперплоскость, но, тем не менее, вы можете подумать: «Что такое гиперплоскость? Это как сверхзвуковой самолет?» Нет, на самом деле это просто причудливое название плоской поверхности, которая может разделить пространство на две половины. В двух измерениях гиперплоскость — это просто линия. В трех измерениях это самолет. А в более высоких измерениях это… ну, скажем так, это не то, о чем вы хотите думать перед сном.

Так как же нам найти этот волшебный гиперплан? Что ж, оказывается, мы можем сделать это, используя так называемые множители Лагранжа. Это включает в себя постановку задачи оптимизации и введение некоторых новых переменных (множителей), которые помогут ее решить. И нет, эти мультипликаторы — это не люди, которые работают на нескольких работах, чтобы свести концы с концами, хотя они служат той же цели.

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

Если вы хотите узнать больше, я рекомендую ознакомиться с книгой «Обучение с помощью ядер» Бернхарда Шёлькопфа и Александра Смола или исследовательской работой «Учебное пособие по методам опорных векторов для распознавания образов» Кристофера Дж. К. Берджеса.

На самом деле делайте с ним что-то!

Хорошо, давайте поговорим о создании SVM на Python с помощью scikit-learn.

Теперь давайте начнем. Во-первых, вам нужно установить scikit-learn. Вы можете сделать это, запустив pip install -U scikit-learn в терминале или в командной строке.

После того, как вы установили scikit-learn, вы можете импортировать его в свой скрипт Python, используя следующий код:

from sklearn import svm

Далее вам нужно загрузить свои данные. Для целей этого примера предположим, что у вас есть файл CSV с двумя столбцами: feature_1 и feature_2, а третий столбец label указывает, к какому классу принадлежит каждая точка данных. Вы можете использовать библиотеку pandas для чтения данных:

import pandas as pd
data = pd.read_csv('path/to/your/csv')
X = data[['feature_1', 'feature_2']]
y = data['label']

Теперь вы готовы создать свою SVM. Для простоты мы будем использовать линейное ядро:

model = svm.SVC(kernel='linear')

Далее вам нужно разделить данные на наборы для обучения и тестирования. Это важно, чтобы вы могли оценить, насколько хорошо ваша SVM работает с новыми данными:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

Теперь вы можете обучить SVM на обучающих данных:

model.fit(X_train, y_train)

И, наконец, вы можете оценить, насколько хорошо ваша SVM работает на тестовых данных:

from sklearn.metrics import accuracy_score
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

И вот он — базовый пример того, как создать SVM на Python с помощью scikit-learn. Конечно, есть много способов настроить и оптимизировать вашу SVM, но это должно стать хорошей отправной точкой.

Если вы хотите узнать больше, я рекомендую ознакомиться с документацией scikit-learn, а также с книгой «Практическое машинное обучение с помощью Scikit-Learn, Keras и TensorFlow» Орельена Жерона. А теперь позвольте мне оставить вас с одной последней шуткой. Почему программисты предпочитают темный режим? Потому что свет привлекает жуков!

ядра

В контексте машин опорных векторов (SVM) ядро ​​похоже на секретный соус, который вы добавляете к своим данным, чтобы сделать их более мощными. Вы знаете, как вы добавляете красный чатни в свои самосы, и вдруг они становятся в тысячу раз лучше? Ядра такие же, но для машинного обучения.

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

И самое интересное, что есть все эти разные типы ядер, которые вы можете использовать, в зависимости от того, какие данные у вас есть и что вы хотите с ними делать. У вас есть ваше линейное ядро, ваше полиномиальное ядро, ваше ядро ​​радиальной базисной функции, ваше сигмовидное ядро… это похоже на целый набор секретных соусов, каждый со своим уникальным вкусом и текстурой.

Так вот в чем суть, мой друг! Ядра похожи на острый соус машинного обучения, и они могут сделать ваши данные более мощными и вкусными.

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

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

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

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

Типы ядер

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

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

Затем у нас есть ядро ​​​​радиальной базисной функции (RBF), которое похоже на гарам масала мира ядра — оно универсальное, ароматное и подходит практически ко всему. Ядро RBF сопоставляет ваши данные с многомерным пространством, используя функции Гаусса, которые могут помочь выявить более тонкие взаимосвязи между вашими функциями.

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

Выбор ядра зависит от сложности ваших данных, поэтому важно поэкспериментировать с разными ядрами, чтобы найти наиболее подходящее для ваших данных. Кроме того, я напишу отдельную статью о «Ядрах», так что следите за обновлениями!

Если вам понравилось мое объяснение, пожалуйста, похлопайте этой статье 👏 и поделитесь ею со своими друзьями и приятелями по учебе 🫂

контакт: https://atharv4git.github.io/webpage/