Библиотека Python для визуализации машинного обучения

Yellowbrick - библиотека визуализации машинного обучения Python. По сути, он построен на Scikit-learn и Matplotlib. Yellowbrick предоставляет информативные визуализации для лучшей оценки моделей машинного обучения. Это также помогает в процессе выбора модели.

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

  1. Создание модели машинного обучения
  2. Время желтого кирпича!

Создание модели машинного обучения

Задача - прогнозировать отток клиентов банка. Прогнозирование оттока - распространенный вариант использования в области машинного обучения. Если вы не знакомы с этим термином, отток означает «уход из компании». Для бизнеса очень важно иметь представление о том, почему и когда клиенты могут уйти.

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

Начнем с импорта зависимостей.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import yellowbrick

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

df_churn = pd.read_csv("/content/Churn_Modelling.csv")
df_churn.drop(['RowNumber', 'CustomerId', 'Surname'], axis=1, inplace=True)
df_churn.head()

Столбец «Завершено» указывает на отток клиентов.

Наборы данных об оттоке обычно несбалансированы. Количество класса 0 (не отток) значительно превышает количество класса 1 (отток). Дисбаланс может отрицательно повлиять на производительность модели. Таким образом, этот дисбаланс лучше устранить.

Есть разные способы использовать это как решение. Мы можем сделать передискретизацию (увеличить количество наблюдений в классе меньшинства) или недостаточную выборку (уменьшить количество наблюдений в классе большинства).

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

Перед использованием алгоритма SMOTE нам необходимо преобразовать категории в числовые значения.

gender = {'Female':0, 'Male':1}
country = {'France':0, 'Germany':1, 'Spain':2}
df_churn['Gender'].replace(gender, inplace=True)
df_churn['Geography'].replace(country, inplace=True)

Подтвердим классовый дисбаланс:

df_churn['Exited'].value_counts()
0    7963 
1    2037 
Name: Exited, dtype: int64

Количество положительного класса (оттока) примерно в 4 раза больше, чем количество отрицательного класса (не оттока).

X = df_churn.drop('Exited', axis=1)
y = df_churn['Exited']
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=42)
X_resampled, y_resampled = sm.fit_resample(X, y)
print(pd.Series(y_resampled).value_counts())
1    7963 
0    7963 
dtype: int64

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

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

Пришло время создать модель и обучить ее. Я буду использовать алгоритм случайного леса.

from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(max_depth=11, n_estimators=260)
rf.fit(X_train, y_train)
from sklearn.metrics import accuracy_score
y_pred = rf.predict(X_train)
y_test_pred = rf.predict(X_test)
train_acc = accuracy_score(y_pred, y_train)
test_acc = accuracy_score(y_test_pred, y_test)
print(f'Train accuracy is {train_acc}. Test accuracy is {test_acc}')

Время желтых кирпичей!

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

Один из способов проверить прогнозы по положительному и отрицательному классам по отдельности - это матрица путаницы.

from yellowbrick.classifier import ConfusionMatrix
plt.figure()
plt.title("Confusion Matrix", fontsize=18)
plt.xlabel("Predicted Class", fontsize=16)
plt.ylabel("True Class", fontsize=15)
cm = ConfusionMatrix(rf, classes=[0,1], size=(400,400),
fontsize=15, cmap='GnBu')
cm.fit(X_train, y_train)
cm.score(X_test, y_test)

В положительном классе у нас есть 1419 правильных прогнозов и 213 неправильных прогнозов. Мы также можем отображать проценты вместо чисел, установив для параметра процент значение Истина.

Модель лучше работает с отрицательным классом, чего мы не хотим. Один из способов добиться этого - сказать модели, что «положительный класс (1) более важен, чем отрицательный класс (0)». С нашим классификатором случайного леса этого можно добиться с помощью параметра class_weight.

Еще одним инструментом для оценки эффективности модели классификации является кривая ROC (рабочие характеристики приемника) и AOC (площадь под кривой).

Кривая ROC суммирует производительность путем объединения матриц неточности для всех пороговых значений. AUC превращает кривую ROC в числовое представление производительности двоичного классификатора. AUC - это площадь под кривой ROC, принимающая значение от 0 до 1. AUC показывает, насколько успешна модель в разделении положительных и отрицательных классов.

from yellowbrick.classifier import ROCAUC
plt.figure(figsize=(10,6))
plt.title("ROC Curve and AUC", fontsize=18)
plt.xlabel("False Positive Rate", fontsize=16)
plt.ylabel("True Positive Rate", fontsize=16)
visualizer = ROCAUC(rf, classes=["Not-churned", "Churned"])
visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
plt.legend()

Кривая ROC дает обзор производительности модели при различных пороговых значениях. AUC - это площадь под кривой ROC между (0,0) и (1,1), которую можно рассчитать с помощью интегрального исчисления. AUC в основном объединяет производительность модели при всех пороговых значениях. Наилучшее возможное значение AUC - 1, что указывает на идеальный классификатор. AUC равна нулю, если все прогнозы неверны.

Когда дело доходит до несбалансированных наборов данных, обычно выбирают метрику оценки точность или отзыв.

В центре внимания точности - положительные прогнозы. Он показывает, сколько положительных прогнозов верны.

В центре внимания вспоминаются актуальные положительные классы. Он показывает, сколько положительных классов модель способна правильно предсказать.

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

Yellowbrick также предлагает кривую Precision-Recall, которая показывает компромисс между точностью и отзывом.

from yellowbrick.classifier import PrecisionRecallCurve
plt.figure(figsize=(10,6))
plt.title("Precision-Recall Curve", fontsize=18)
plt.xlabel("Recall", fontsize=16)
plt.ylabel("Precision", fontsize=16)
viz = PrecisionRecallCurve(rf)
viz.fit(X_train, y_train)
viz.score(X_test, y_test)
plt.legend(loc='lower right', fontsize=12)

Спустя какое-то время увеличение отзыва приводит к значительному падению точности.

Yellowbrick также предоставляет следующие визуализации, которые полезны при оценке моделей классификации:

  • Отчет о классификации
  • Ошибка предсказания класса
  • Порог дискриминации (только для двоичной классификации)

Использование информативной визуализации в процессе оценки вашей модели предоставит вам множество идей. Это приведет вас к эффективному улучшению вашей модели.

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

Спасибо за чтение. Пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы.