Алгоритм классификации машинного обучения
Введение
Машина опорных векторов (SVM) – это популярный алгоритм машинного обучения, который используется для классификации и регрессионного анализа. Это контролируемый алгоритм обучения, который использует концепцию граничных линий или гиперплоскостей или максимального запаса, который представляет собой максимально возможное расстояние между граничной линией и ближайшими точками данных для классификации точек данных по различным категориям.
Ближайшие точки данных к граничной линии называются опорными векторами, и эти опорные векторы определяют граничную линию. SVM может обрабатывать нелинейные граничные линии, преобразовывая данные в многомерное пространство и находя граничную линию в этом пространстве.
Реализовать машину опорных векторов в Python
В этом примере мы будем использовать данные рекламы в социальных сетях, касающиеся пола, возраста и предполагаемой зарплаты нескольких пользователей, и на основе этих данных мы будем классифицировать каждого пользователя, купят ли они страховку или нет.
Шаг 1. Импортируйте библиотеки
Нам нужны Pandas для обработки данных, NumPy для математических расчетов, MatplotLib и Seaborn для визуализации. Библиотеки Sklearn используются для операций машинного обучения.
# Import libraries import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap import seaborn as sns from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn import metrics from sklearn.metrics import accuracy_score from sklearn.metrics import classification_report from sklearn.metrics import precision_recall_curve from sklearn.metrics import confusion_matrix from sklearn.metrics import f1_score
Шаг 2. Импорт данных
Загрузите набор данных здесь, загрузите его в свой блокнот и прочитайте в кадре данных pandas.
# Read dataset df_net = pd.read_csv('/content/Social_Network_Ads.csv') df_net.head()
Шаг 3: Анализ данных/предварительная обработка
Исследовательский анализ данных (EDA) – это процесс анализа и обобщения основных характеристик набора данных с целью получения представления о базовой структуре, взаимосвязях и шаблонах данных. EDA помогает выявлять важные особенности, аномалии и тенденции в данных, которые могут использоваться для дальнейшего анализа и моделирования.
EDA обычно включает несколько ключевых шагов, в том числе:
- Очистка и подготовка данных включают удаление отсутствующих или неверных значений, преобразование переменных и обработку выбросов.
- Визуализация данных – это процесс создания графиков, диаграмм и других визуальных представлений данных, помогающих выявить закономерности, взаимосвязи и аномалии.
- Статистический анализ включает в себя применение математических и статистических методов к данным для выявления важных характеристик и взаимосвязей.
Предварительная обработка направлена на подготовку данных таким образом, чтобы обеспечить эффективный анализ и моделирование, а также устранить любые смещения или ошибки, которые могут повлиять на результаты.
Получить необходимые данные
Нам не нужен столбец Идентификатор пользователя, поэтому мы можем его удалить.
# Get required data df_net.drop(columns = ['User ID'], inplace=True) df_net.head()
Описать данные
Получите статистическое описание данных с помощью функции Pandas describe(). Он показывает нам количество, среднее значение, стандартное отклонение и диапазон данных.
# Describe data df_net.describe()
Распространение данных
Проверьте распределение данных.
# Salary distribution sns.distplot(df_net['EstimatedSalary'])
Кодировка этикетки
Кодирование меток – это метод предварительной обработки в машинном обучении и анализе данных, при котором категориальные данные преобразуются в числовые значения, чтобы сделать их совместимыми с математическими операциями и моделями.
Категориальным данным присваивается целочисленное значение, обычно начиная с 0, и каждой уникальной категории в данных присваивается уникальное целочисленное значение, чтобы категориальные данные можно было рассматривать как числовые данные.
# Label encoding le = LabelEncoder() df_net['Gender']= le.fit_transform(df_net['Gender'])
Корреляционная матрица
Корреляционная матрица – это таблица, в которой обобщаются взаимосвязи между несколькими переменными в наборе данных. Он показывает коэффициенты корреляции между каждой парой переменных, которые указывают на силу и направление связи между переменными. Это полезно для выявления сильно коррелированных переменных и выбора подмножества переменных для дальнейшего анализа.
Коэффициент корреляции может принимать значения от -1 до 1, где:
- Коэффициент корреляции -1 указывает на сильную отрицательную связь между двумя переменными.
- коэффициент корреляции, равный 0, указывает на отсутствие связи между двумя переменными.
- коэффициент корреляции, равный 1, указывает на сильную положительную связь между двумя переменными.
# Correlation matrix df_net.corr() sns.heatmap(df_net.corr())
Отбрасывать несущественные данные
Из матрицы корреляции мы видим, что Пол не коррелирует с другими атрибутами, поэтому мы можем отбросить и это.
# Drop Gender column df_net.drop(columns=['Gender'], inplace=True)
Шаг 4: Разделите данные
Разделение данных на независимые и зависимые переменные включает отделение входных объектов (независимые переменные) от целевой переменной (зависимая переменная). Независимые переменные используются для прогнозирования значения зависимой переменной.
Затем данные разделяются на обучающий набори тестовый набор, где обучающий набор используется для подгонки модели, а тестовый набор используется для оценки ее производительности.
Независимые/зависимые переменные
В наших данных Возраст, Оценочная зарплата – это независимая переменная, которой присвоено значение X, а Куплено – зависимая переменная г.
# Split data into dependent/independent variables X = df_net.iloc[:, :-1].values y = df_net.iloc[:, -1].values
Поезд / тестовый сплит
Данные обычно делятся на две части: большая часть данных используется для обучения модели, а меньшая часть используется для тестирования.
Обучающая выборка используется для обучения модели и поиска оптимальных параметров. Затем модель тестируется на тестовом наборе, чтобы оценить ее производительность и определить ее точность. Это важно, потому что, если модель обучена и протестирована на одних и тех же данных, она может переоценить данные и плохо работать с новыми, невидимыми данными.
Мы разделили данные на 75% для обучения и 25% для тестирования.
# Split data into test/train set X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = True)
Шаг 5: Масштабирование функций
Масштабирование признаков — это метод преобразования значений числовых переменных таким образом, чтобы они имели общий масштаб, поскольку алгоритмы машинного обучения чувствительны к масштабу входных признаков.
Существует два распространенных метода масштабирования объектов: нормализация и стандартизация.
- Нормализация масштабирует значения переменных так, чтобы они находились в диапазоне от 0 до 1. Это делается путем вычитания минимального значения признака и деления его на диапазон (максимум-минимум).
- Стандартизация преобразует значения переменных таким образом, чтобы их среднее значение равнялось 0, а стандартное отклонение равнялось 1. Это делается путем вычитания среднего значения и деления его на стандартное отклонение.
Масштабирование функций обычно выполняется перед обучением модели, так как оно может повысить производительность модели и сократить время, необходимое для ее обучения, а также помогает гарантировать, что алгоритм не будет смещен в сторону переменных с большими значениями.
# Scale dataset sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)
Шаг 6: Модель поезда
Обучение модели машинного обучения включает использование обучающего набора данных для оценки параметров модели. В процессе обучения используется алгоритм обучения, который итеративно обновляет параметры модели, минимизирует функцию потерь, которая измеряет разницу между прогнозируемыми значениями и фактическими значениями в обучающих данных и обновляет параметры модели для повышения точности модели.
Важно отметить, что алгоритм SVM требует масштабирования функций и правильного выбора функций ядра и параметров регуляризации для получения точных прогнозов.
Передайте данные X_train и y_train в модель классификатора Support Vector Machine с помощью classifier.fit для обучения модели с нашими обучающими данными.
# Classifier classifier = SVC(kernel = 'linear', random_state = 0) classifier.fit(X_train, y_train)
Шаг 7: Предсказать результат / Оценить модель
После того, как модель обучена, ее можно использовать для прогнозирования новых данных. Чтобы делать прогнозы с использованием модели SVM, вы обычно передаете новую точку данных в модель и используете гиперплоскость, определенную опорными векторами, чтобы определить ее класс или предсказать ее непрерывный вывод. Прогноз основан на том, на какую сторону гиперплоскости приходится новая точка данных.
В задаче классификации SVM предсказывает категориальную метку для заданных входных данных, а в задаче регрессии цель состоит в том, чтобы предсказать непрерывный вывод для заданных входных данных.
Точность модели можно оценить на тестовом наборе, который предварительно был проведен в процессе обучения.
# Prediction y_pred = classifier.predict(X_test) print(np.concatenate((y_pred.reshape(len(y_pred), 1), y_test.reshape(len(y_test), 1)), 1))
Шаг 8: Оцените модель
Точность — полезная метрика для оценки производительности модели, но в некоторых случаях она может вводить в заблуждение. Например, в сильно несбалансированном наборе данных модель, которая всегда предсказывает класс большинства, будет иметь высокую точность, даже если она может работать не очень хорошо. Поэтому важно учитывать другие показатели, такие как матрица путаницы, точность, полнота, оценка F1 и ROC-AUC, а также точность, чтобы получить более полное представление о производительности модели.
Точность
Точность — это широко используемый показатель для оценки производительности модели машинного обучения. Он измеряет долю правильных прогнозов, сделанных моделью в заданном наборе данных.
В задаче бинарной классификации точность определяется как количество правильных прогнозов, деленное на общее количество прогнозов. В задаче классификации с несколькими классами точность представляет собой среднее значение показателей точности отдельных классов.
# Accuracy accuracy_score(y_test, y_pred)
Отчет о классификации
Отчет о классификации представляет собой сводную информацию о производительности модели классификации. Он предоставляет несколько показателей для оценки производительности модели в задаче классификации, включая точность, полноту, оценку f1 и поддержку.
Отчет о классификации также предоставляет средневзвешенное значение баллов отдельных классов, которое учитывает дисбаланс в распределении классов в наборе данных.
# Classification report print(f'Classification Report: \n{classification_report(y_test, y_pred)}')
Оценка F1
Оценка F1 представляет собой гармоническое среднее точности и полноты. Он обеспечивает единую оценку, которая уравновешивает точность и полноту. Поддержка — это количество экземпляров каждого класса в наборе данных для оценки.
# F1 score print(f"F1 Score : {f1_score(y_test, y_pred)}")
Матрица путаницы
Матрица путаницы используется для оценки эффективности модели классификации. Он обобщает производительность модели, сравнивая фактические метки классов данных с прогнозируемыми метками классов, сгенерированными моделью.
Истинные срабатывания (TP): Правильно предсказанные положительные случаи.
Ложные срабатывания (FP): Неправильно спрогнозированные положительные случаи.
Истинно отрицательные результаты (TN): Правильно спрогнозированные отрицательные случаи.
Ложно отрицательные результаты (FN): Неверно предсказанные отрицательные экземпляры.
Он дает четкое и подробное представление о том, насколько хорошо работает модель, и помогает определить области для улучшения.
# Confusion matrix cf_matrix = confusion_matrix(y_test, y_pred) sns.heatmap(cf_matrix, annot=True, fmt='d', cmap='Blues', cbar=False)
Кривая точности-отзыва
Кривая «точность-полнота» — это график, который обобщает производительность модели бинарной классификации как компромисс между точностью и полнотой и полезен для оценки способности модели делать точные положительные прогнозы при обнаружении как можно большего числа положительных случаев. Точность и Полнота – это две распространенные метрики для оценки эффективности модели классификации.
Точность – это количество истинно положительных прогнозов, деленное на сумму истинно положительных и ложноположительных прогнозов. Он измеряет точность положительных прогнозов, сделанных моделью.
Отзыв — это количество истинно положительных прогнозов, деленное на сумму истинно положительных и ложноотрицательных прогнозов. Он измеряет способность модели находить все положительные экземпляры.
# Plot Precision-Recall Curve y_pred_proba = classifier.predict_proba(X_test)[:,1] precision, recall, thresholds = precision_recall_curve(y_test, y_pred_proba) fig, ax = plt.subplots(figsize=(6,6)) ax.plot(recall, precision, label='Logistic Regression') ax.set_xlabel('Recall') ax.set_ylabel('Precision') ax.set_title('Precision-Recall Curve') ax.legend();
Кривая AUC/ROC
Кривая Рабочая характеристика приемника (ROC) и Площадь под кривой (AUC) часто используются для оценки производительности модели бинарной классификации.
Кривая ROC отображает соотношение истинных положительных результатов (TPR) и ложных положительных результатов (FPR) для различных пороговых значений вероятностей предсказания модели. TPR — это количество истинно положительных прогнозов, деленное на количество фактически положительных случаев, а FPR количество ложноположительных прогнозов, деленное на количество действительно отрицательных экземпляров.
AUC – это площадь под кривой ROC, представляющая собой однозначный показатель, который обобщает производительность модели по всему диапазону возможных пороговых значений.
Высокий AUC указывает на то, что модель способна хорошо отличать положительные экземпляры от отрицательных.
# Plot AUC/ROC curve y_pred_proba = classifier.predict_proba(X_test)[:,1] fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred_proba) fig, ax = plt.subplots(figsize=(6,6)) ax.plot(fpr, tpr, label='Support Vector Machine', color = 'firebrick') ax.set_title('ROC Curve') ax.set_xlabel('False Positive Rate') ax.set_ylabel('True Positive Rate') plt.box(False) ax.legend();
Прогнозы визуализации
Результаты прогнозирования на тренировочном наборе
Результаты прогнозирования на тестовом наборе
Пример
Давайте посмотрим на примере Возраст 45 и Зарплата 97000 и проверим, может ли пользователь приобрести страховку или нет.
# Predict purchase with Age(45) and Salary(97000) print(classifier.predict(sc.transform([[45, 97000]])))
Прогнозируемое значение [1] означает, что пользователь собирается приобрести страховку.
Полный код на GitHub
Вы можете получить полный код в моем репозитории на GitHub.
Заключение
SVM можно использовать как для бинарной классификации, когда точки данных классифицируются по двум категориям, так и для мультиклассовой классификации, когда точки данных классифицируются по нескольким категориям. SVM также можно использовать для регрессионного анализа, прогнозируя непрерывное выходное значение на основе входных данных.
В заключение, машина опорных векторов — это универсальный алгоритм машинного обучения, который используется как для классификации, так и для регрессионного анализа. Он использует концепцию максимального запаса и опорных векторов для разделения точек данных на разные категории или прогнозирования непрерывных выходных значений.