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

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

😎Как насчет счета?

Есть и дополнительный подход — вероятность может быть сопоставлена ​​с каким-либо рейтингом или показателем качества (кредитный рейтинг, кредитный рейтинг банков и компаний, например, Standard&Poor’s и т. д.). Эта оценка позволяет группировать клиентов, продукты, облигации или компании в оценочные группы, оценивать корзины на основе некоторого смоделированного прогноза.

Может быть много причин, по которым оценки предпочтительнее чистой вероятности (просто упомянем несколько):

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

Ну и что, что вместо вероятности нужно какое-то ранжирование с каким-то диапазоном баллов. То, что должно быть сделано? Давайте углубимся.

Но чтобы двигаться дальше, мы должны быть уверены, что с шансами все ясно.

🤑Каковы мои шансы?

Коэффициенты считаются шансом на победу и определяются как вероятность «события» (p), деленная на вероятность «не события» (1 -p), поэтому коэффициенты=p/(1-p)ивероятность равны p=шансы/(1+шансы)

Допустим, у нас есть вероятность события (или, упрощенно говоря, частота события) 15 из 100, тогда вероятность p=15/100=0,15 и шансы шансы = (15/100)/((100–15)/100) = 15/85 = 0,176, поэтому большая вероятность означает лучшие шансы, и наоборот.

Что такое линейная регрессия? Это просто сумма переменных (x) с коэффициентами (или весами) и результирующим «y» (например, y=b+ax).

В случае бинарной классификации у вас есть 2 класса 0 и 1, что означает, что «y» может быть 0 или 1. Если применить линейную регрессию для прогнозирования классов, то полученный «y» должен быть преобразован в диапазон от 0 до 1. Для этого применяется так называемая «сигмоидальная функция», которая приводит к простому уравнению y=LN(odds)или Sum(Bi*Xi) =LN(шансы) (LN-натуральный логарифм)и, зная шансы, мы можем легко (применив экспоненциальную функцию) получить вероятность: шансы=EXP(y) и p=EXP(y)/(1+EXP(y))

✍Учиться на примере

Давайте создадим очень простую модель классификации на основе двух переменных: Возраст(в годах) и Статус работы (yes=1 , no=0) и целевая переменная хорошо (yes=1, no=0).

import pandas as pd
import numpy as np
df=pd.DataFrame()
df[‘age’]= [26, 25, 20, 22, 27, 30, 36, 40,50]
df[‘isEmployed’]=[0, 1, 0, 0, 0, 1, 1, 1, 0]
df[‘good’]= [0, 1, 0, 0, 1, 0, 1, 1, 1]
#features
train=df[[‘age’,’isEmployed’]]
#target
y=df[‘good’]
from sklearn.linear_model import LogisticRegression
clf=LogisticRegression(fit_intercept=True, solver=’lbfgs’)
clf=clf.fit(train, y)
coefficients = np.append (clf.intercept_, clf.coef_)
print(‘Coefficients’, coefficients)

В результате обучения определяются коэффициенты (веса) модели

Coefficients:
 B0 (intercept)-7.183
 B1 (Age) 0.258
 B2 (isEmployed) 0.122

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

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

case_one=[20,0]
#Option 1: Predict proba
test=pd.DataFrame (np.array(case_one).reshape(1,2)) 
y_pred=clf.predict_proba(test)[:,1]
print(‘Predict probability of being good (proba): ‘ ,y_pred)
#Option 2: Calculate Probability from coefficients
#ln(odds)=sum(coefficients*values)
ln_odds=sum(np.multiply(coefficients,np.array([1]+case_one))) 
odds=np.exp(ln_odds)
prob_good=odds/(1+odds)
print(‘Resulting probablity of being good (sum): ‘, prob_good)

🤞Что может пойти не так?

Поскольку не существует «идеального» инструмента прогнозирования, должны быть приняты во внимание некоторые виды ошибок и предполагаемая цена этих ошибок.

В бинарной классификации есть 2 типа ошибок:

  • Модель предсказывает, что человек совершит действие в будущем, но не будет. Это называется «Ложное срабатывание», «Ложно верно» или «Ошибка первого типа».
  • Модель предсказывает, что человек не будет совершать действие, поскольку на самом деле он его совершает. Это называется «Ложноотрицательный», «Ложно-ложный» или «Ошибка второго типа».

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

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

🤪Слишком много путаницы

Чтобы понять, насколько хороша модель, данные следует разделить на 2 подмножества — обучающее и тестовое (или проверочное). Это может быть какой-то случайный промах 70/30 или 80/20. Затем модель обучается на обучающем наборе, а затем, применяя модель к тестовому набору, можно оценить качество прогноза. Существует ряд таких показателей качества, но для краткости давайте посмотрим на матрицу путаницы и показатель ROC AUC.

Матрица путаницы. Если результатом модели является фактический класс (хороший или плохой), то можно рассчитать 4 значения, которые будут описывать производительность модели:

  • Истинно положительный (TP) и истинно отрицательный (TN). Количество случаев, когда фактический класс — «А», а прогнозируемый класс — тоже «А».
  • И два типа ошибок False Positive (FP) и False Negative (FN).

Из этих 4 значений (матрицы путаницы) вычисляется ряд показателей качества, но я приведу только 3 из них:

  • Точность=True/(True+False)=(TP+TN)/(TP+TN+FP+FN). Показывает, когда классификатор правильно определил класс.
  • TPR (истинно положительный показатель) /отзыв/чувствительность = TP/(TP+FN). Определяет, сколько из всех положительных событий были правильно идентифицированы.
  • FPR (коэффициент ложных срабатываний)=FP/(TN+FP). Определяет, сколько из всех негативных событий были ошибочно классифицированы как позитивные.
from sklearn.metrics import confusion_matrix
#y_true and y_predicted is a class 0 or 1
confusion_matrix(y_true, y_predicted)

РПЦ АУК. Если результатом модели является вероятность события, то применяется метрика ROC AUC. Чтобы определить класс по вероятности, необходимо определить некоторый порог (если p > 0,2, то класс 1 и 0 в противном случае и т. д.).

Таким образом, если мы возьмем два показателя качества — TPR (истинно положительный показатель) и FPR (ложноположительный показатель) в виде двух осей и нанесем эти показатели для всех пороговых значений от 0 до 1. появится кривая. Площадь под этой кривой представляет собой значение показателя ROC AUC.

from sklearn.metrics import roc_auc_score
#y_true is a class 0 or 1 and y_predicted is probability
roc_auc_score(y_true, y_predicted)

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

😤 Шансы, вероятность, регрессия... Скажи мне счет!

Чтобы получить более подробную информацию, обратитесь к «Окончательному выпуску оценочной карты» из «Системы оценки кредитного риска: разработка и внедрение интеллектуального кредитного скоринга» Наима Сиддики.

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

В целом взаимосвязь между шансами и очками можно представить в виде линейного преобразования:
Оценка = Смещение + Фактор*LN(шансы)

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

В этой формуле коэффициенты представлены следующим образом: количество Хорошо:Плохо . Так, например, с некоторой оценкой Z есть 100 хороших и 1 плохая (100: 1), а для (Z + pdo) есть 200 хороших и 1 по умолчанию (шансы = 200: 1).

Это важно — из предыдущего пункта мы понимаем, что для «хороших» клиентов ставится метка 1 или Положительное событие для данных, а для «плохих» — 0. Почему это важно? Потому что эта «метка» является целевой переменной при создании модели, и эта модель в результате должна обеспечивать «вероятность того, что клиент будет хорошим» (что равно 1-вероятность_по_умолчанию).

Масштабирование Factor=pdo/LN(2) вычисляется как результат решения системы уравнений:

Score+pdo = Offset + Factor*LN(2*odds)
Score = Offset + Factor*LN(odds)

Смещение равно значению, которое будет установлено в случае вероятности=0,5 или коэффициента=1 (LN( шансы)=0)

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

  1. Отметьте хороших клиентов как 1, плохих как 0
  2. Выберите функции
  3. Обучите модель логарифмической регрессии и получите коэффициенты (Bi)
  4. Подставить вместо LN(шансы) в формулу Сумма(Bi*Xi)

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

pdo=20
offset=200
factor=pdo/np.log(2)
# check double odds effect
score1=offset+factor*np.log(1) #p_bad=0.5, bad=good > odds=1
score2=offset+factor*np.log(2) #p_bad=0,3(3) good=2 bad=1 
score3=offset+factor*np.log(4) #p_bad=0,2 good=4 bad=1 
print(f’Difference 2 and 1: {score2-score1} \nDifference 3 and 2: {score3-score2}’ )

Наконец, со всем набором очков можно рассчитать:

''' Score from logregression '''
score=offset+factor*sum(np.multiply(coefficients,np.array([1]+case_one)))
print(f'Score from regression:  {round(score,0)}')
#score from probability
score=offset+factor*np.log(prob_good/(1-prob_good))
print(f'Score from probability:  {round(score,0)}')

Лучший (более высокий) балл означает более высокую вероятность быть хорошим. Сделанный!

👍Все в одном

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

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

P.S. Особая благодарность Николасу Фошеро за график Python Gauge matplotlib, который вы можете найти по ссылке, который помог мне создать изображение.

#python #оценка #logreg #auc