ВВЕДЕНИЕ

Бинарная классификация — одна из самых распространенных и фундаментальных задач в машинном обучении. Это процесс классификации данных в один из двух классов. В этой статье мы рассмотрим три мощных алгоритма бинарной классификации: метод опорных векторов (SVM), логистическая регрессия и K-ближайшие соседи (KNN). Я также предоставлю примеры кода и визуализации, чтобы помочь вам лучше понять, как работают эти алгоритмы.

Примечание. Все коды выделены курсивом.

Набор данных, с которым мы будем работать, будет набором данных Churn, доступным в Kaggle.

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

Перейдем к кодированию. :D

Примечание. В этом руководстве мы не будем заниматься разработкой функций.

Начнем с импорта необходимых библиотек.

импортировать pandas как pd
импортировать matplotlib.pyplot как plt
из sklearn.model_selection import train_test_split
из sklearn import svm
из sklearn.neural_network import MLPClassifier
из sklearn.neighbors импортировать KNeighborsClassifier
из sklearn.metrics импортировать точность_оценки, точности_оценки, отзыв_оценки, f1_score
из sklearn.metrics импортировать путаницу_матрицу
импортировать seaborn как sns

Первым шагом будет чтение данных.

data=pd.read_csv(‘/kaggle/input/churn-modelling/Churn_Modelling.csv’)
data.head()

Давайте получим информацию о различных полях. Мы будем использовать только числовые столбцы для создания нашей классификации.

печать(data.info())

Чтобы выбрать только числовые столбцы из DataFrame в Python, мы можем использовать метод select_dtypes и передать параметр include со значением 'number'. При этом будут выбраны только столбцы с числовыми типами данных, такими как int, float, complex и т. д.

# Выберите только числовые столбцы
numeric_df = data.select_dtypes(include=’number’)
numeric_df.head()

Можете ли вы определить проблему? У нас есть номер строки и идентификатор клиента. Нам не нужны эти колонки. Кроме того, теперь нам нужно создать наш набор данных X и Y. X представляет собой независимые переменные, а Y — зависимую переменную.

Чтобы выбрать все столбцы из DataFrame в Python, кроме определенных столбцов, мы можем использовать метод drop и передать параметр columns с именами столбцов, которые мы хотим исключить.

Давайте сделаем это.

X=numeric_df.drop(columns=[‘RowNumber’, ‘Exited’,’CustomerId’])
Y=numeric_df[‘Exited’]

Теперь давайте проведем наш тестовый сплит.

# Разделить данные на наборы для обучения и тестирования
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0,2, random_state=42)

Мы используем 80% данных для обучения и 20% данных для тестирования.

Параметр test_size используется для указания доли данных, которые следует использовать для тестирования (в данном случае 20% данных). Параметр random_state используется для обеспечения воспроизводимости путем установки начального числа для генератора случайных чисел.

Запустим первый алгоритм.

Мы будем использовать алгоритм SVM.

Алгоритм опорных векторов (SVM)

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

clf = svm.SVC(kernel=’sigmoid’)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

Затем мы начинаем создавать метрики точности.

# Вычислить точность
точность = показатель_точности (y_test, y_pred)
# Вычислить точность
точность = точность_оценка (y_тест, y_пред)
# Вычислить отзыв
Recall = Recall_score(y_test, y_pred)
# Вычислить балл F1
f1 = f1_score(y_test, y_pred)
# Распечатать результаты
print("Accuracy: {:.2f}".format(accuracy))
print("Точность: {:.2f}".format(точность))
print("Recall: {:.2f}".format (отзыв))
print("Оценка F1: {:.2f}".format(f1))

# Создать список метрик
metrics = ['Точность', 'Точность', 'Отзыв', 'Оценка F1']
# Создать список значений
values ​​= [точность, точность, полнота, f1]

# Создание гистограммы
plt.bar(metrics, values)
plt.ylim(0, 1)
plt.show()

# Вычислить матрицу путаницы
cm = путаница_матрица(y_test, y_pred)

# Постройте матрицу путаницы
sns.heatmap(cm, annot=True, fmt='d')
plt.xlabel('Predicted')
plt.ylabel ('Истина')
plt.show()

Мы ясно видим проблему. Совсем не удачный набор прогнозов.

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

Модель логистической регрессии

Логистическая регрессия — это статистический метод анализа набора данных, в котором есть одна или несколько независимых переменных, определяющих результат. Результат измеряется дихотомической переменной (в которой есть только два возможных результата). Он используется для прогнозирования бинарного результата (1/0, Да/Нет, Истина/Ложь) с учетом набора независимых переменных. Это тип обобщенной линейной модели (GLM), в которой используется логистическая функция для моделирования бинарной зависимой переменной. Логистическую регрессию можно использовать для оценки вероятности существования определенного класса или события, например вероятности победы определенного политического кандидата на выборах. Его также можно использовать для прогнозирования риска возникновения определенного события, например риска развития определенного заболевания.

Наша задача теперь проста, выполнить и построить модель.

clf = LogisticRegression()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

# Вычислить точность
точность = показатель_точности (y_test, y_pred)
# Вычислить точность
точность = точность_оценка (y_тест, y_пред)
# Вычислить отзыв
Recall = Recall_score(y_test, y_pred)
# Вычислить балл F1
f1 = f1_score(y_test, y_pred)
# Распечатать результаты
print("Accuracy: {:.2f}".format(accuracy))
print("Точность: {:.2f}".format(точность))
print("Recall: {:.2f}".format (отзыв))
print("Оценка F1: {:.2f}".format(f1))

# Создать список метрик
metrics = ['Точность', 'Точность', 'Отзыв', 'Оценка F1']
# Создать список значений
values ​​= [точность, точность, полнота, f1]

# Создание гистограммы
plt.bar(metrics, values)
plt.ylim(0, 1)
plt.show()

# Вычислить матрицу путаницы
cm = путаница_матрица(y_test, y_pred)

# Постройте матрицу путаницы
sns.heatmap(cm, annot=True, fmt='d')
plt.xlabel('Predicted')
plt.ylabel ('Истина')
plt.show()

Мы видим, что точность и точность улучшились по сравнению с моделью SVM, но отзыв и оценка F1 снизились. Давайте перейдем к следующему.

K-ближайшие соседи

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

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

Примечание. Это не лучший метод. Оптимальным способом является использование перекрестной проверки и метода Elbow Curve. Мы используем его здесь для простоты.

# Определение списка k значений для проверки
k_list = range(1,21)

# Инициализировать список для хранения оценок точности
precision_scores = []
precision_scores = []
Recall_scores = []
f1_scores= []

# Цикл по k значениям
для k в k_list:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
точность = показатель_точности (тест_у, y_пред)
показатель_точности.добавление (точность)
точность = показатель_точности (тест_у, показатель_у)
точность_оценка.добавление (точность)
отзыв = отзыв_оценка(y_тест, y_пред)
отзыв_оценки.append(отзыв)
f1 = f1_score(y_тест, y_пред)
f1_scores.append(f1)

# Нанесите результаты на график
plt.plot(k_list, precision_scores,label='Accuracy')
plt.plot(k_list, precision_scores,label='Precision')
plt.plot(k_list,recall_scores,label='Recall')
plt.plot(k_list, f1_scores,label='F1 Score')
plt.xlabel("Количество соседей (k)")
plt.ylabel("Оценка")
plt.legend(loc='верхний левый')
plt.show()

Мы можем выбрать количество соседей на основе любой из метрик. Для простоты остановимся на точности. Значение наилучшего числа соседей составляет n=20.(k)

knn = KNeighborsClassifier(n_neighbors=20)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
# Расчет точности
Точность = Точность_оценка(y_test, y_pred)
# Вычислить точность
точность = точность_оценка(y_test, y_pred)
# Вычислить отзыв
Recall = Recall_score(y_test, y_pred)
# Рассчитать балл F1
f1 = f1_score(y_test, y_pred)
# Распечатать результаты
print("Accuracy: {:.2f}".format(accuracy))
print("Точность: {:.2f}".format(точность))
print("Отзыв: {:.2f}".format(отзыв))
print("Оценка F1: {:.2f}".format(f1))

# Создать список метрик
metrics = ['Точность', 'Точность', 'Отзыв', 'Оценка F1']
# Создать список значений
values ​​= [точность, точность, полнота, f1]

# Создание гистограммы
plt.bar(metrics, values)
plt.ylim(0, 1)
plt.show()

# Вычислить матрицу путаницы
cm = путаница_матрица(y_test, y_pred)
# Построить матрицу путаницы
sns.heatmap(cm, annot=True, fmt='d ')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()

Мы видим, что результат не лучше, чем у модели логистической регрессии.

ЗАКЛЮЧЕНИЕ

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

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

Надеюсь, вам понравилось читать эту статью. Набор данных можно увидеть в следующем месте:



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