Алгоритм классификации машинного обучения

Введение

Наивный байесовский алгоритм – это алгоритм классификации, основанный на теореме Байеса. Теорема Байеса утверждает, что вероятность события равна априорной вероятности события, умноженной на вероятность события при наличии некоторых доказательств. В контексте классификации это означает, что мы пытаемся найти класс, который, скорее всего, имеет набор функций или атрибутов.

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

Реализуйте наивную байесовскую классификацию в 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.naive_bayes import GaussianNB
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 в наивную байесовскую модель классификатора с помощью classifier.fitдля обучения модели с нашими обучающими данными.

# Classifier
classifier = GaussianNB()
classifier.fit(X_train, y_train)

Шаг 7: Предсказать результат / Оценить модель

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

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

# 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='Naive Bayes Classification', color = 'firebrick')
ax.set_title('Precision-Recall Curve')
ax.set_xlabel('Recall')
ax.set_ylabel('Precision')
plt.box(False)
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='Naive Bayes Classification', 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.



Заключение

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

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