КРИВАЯ ROC AUC

Зачем нам нужна ROC-КРИВАЯ?

«ВЫБОР ПОРОГА» — это основная причина, по которой нам нужно использовать ROC CURVE.

Это во многом связано с «классификационным термином», и мы можем сказать, что это «БИНАРНАЯ КЛАССИФИКАЦИЯ».

Выбор порога:

  • Пример. Мы предполагаем, что данные о колледже содержат функции «IQ», «CGPA» и «Размещение», поэтому учащиеся получают место или не имеют результата в двоичном формате «ДА» или «НЕТ».
  • Теперь разделим данные на две части: «Обучающий набор» и «Тестовый набор». Обучите модель на обучающих данных и протестируйте модель на тестовых данных.
  • Таким образом, при тестировании данных, когда мы получаем результат от модели, она напрямую не дает результатов в «0» и «1». Модель дает результаты в “Probability”, предоставляя любое «число», которое покажет, студент будет зачислен или нет.
  • Прогноз результата одного студента составляет — 0,45 или 45%, и таким образом для всех студентов мы получим результаты, основанные на вероятности.
  • Теперь нам нужно преобразовать этот «Probability result”» в уровни класса “0” и “1” , приняв решение “THRESHOLD”
  • Нам нужно выбрать пороговое значение, чтобы мы могли разделить результат на оба уровня классов, и когда мы интуитивно определяем порог вручную, он может быть правильным или неправильным, когда мы сравниваем результат с фактическим.
  • Пример: мы решаем, что пороговое значение = 0,5, и на основе этого мы решаем, что вероятность того, что студент будет больше, чем порог, будет размещен, и ниже порога, который студент не будет размещен.

НО ВСЕГДА ПОРОГ «0,5» НЕ РАБОТАЛ бы.

  • EX — КЛАССИФИКАЦИЯ ЭЛЕКТРОННОЙ ПОЧТЫ (Обученная модель с большим количеством электронных писем для прогнозирования идентификации почты «спам», а не «спам»).

Модель может допустить две ошибки:

EMAIL NOT SPAM — PREDICT SPAM

EMAIL SPAM — PREDICT NOT SPAM

«Иногда обе ошибки не имеют одинакового значения, это варьируется от случая к случаю.

  • Предположим, я получил письмо для собеседования, и моя модель поместила это письмо в спам, который на самом деле не является спамом, поэтому моя модель допустила за меня ошибку. Я буду полагаться на модель и обновлю значение порога до «0,75» и обучу модель, и это поможет уменьшить эту ошибку.
  • Это мощность «порога», поэтому в зависимости от производительности модели мы можем увеличивать или уменьшать пороговое значение.

Какое значение следует выбрать в «пороге», мы можем определить с помощью «КРИВОЙ ROC»

МАТРИЦА путаницы –

Это похоже на “Report Card” для «Binary Classification”».

С одного взгляда мы можем понять, как работает наша модель.

True Positive (TP): Правильное предсказание метки (мы предсказали «да», и это «да»),

True Negative (TN): Правильное предсказание другой метки (мы предсказали «нет», и это «нет»),

False Positive (FP): Ошибочное предсказание ярлыка (мы предсказали «да», но оказалось «нет»),

False Negative (FN): Отсутствует и входящая метка (мы прогнозировали «нет», но оказалось «да»).

Истинно положительный рейтинг-

TPR = TP / (TP + FN)

Это даст интуицию выгоды. Сколько пользы можно получить от системы.

  • Бывшее создание модели прогнозирования оттока клиентов Netflix для выявления шаблонов пользователей.

- “1” — Покиньте платформу, “0”- не покинет платформу.

  • Предположим, у нас есть 100 клиентов, которые хотят покинуть Netflix, а моя модель обнаруживает только 80, поэтому мой TPR составит 80%. Мы всегда хотим максимизировать TPR, поскольку это может лучше решить проблему. Когда «ЛОЖНО-ОТРИЦАТЕЛЬНЫЙ» БУДЕТ НУЛЕМ, ТОГДА ИСТИННО-ПОЛОЖИТЕЛЬНЫЙ БУДЕТ 100 %.

Ложноположительный показатель-

FPR = FP / (FP + TN)

СЧИТАЙТЕ ЭТО КАК СТОИМОСТЬЮНасколько дорогая будет модель? Мы создаем любую модель для получения решения, и если модель не обеспечивает 100 показателей по точности, то это означает, что придется пострадать от таких затрат. Если клиент покидает платформу из-за неправильного прогноза, это приведет к увеличению затрат, потому что в коэффициенте оттока предположим, что модель говорит, что эти люди покидают платформу, и мы даем некоторые преимущества, чтобы удержать этих клиентов, и на самом деле они никогда не покинут платформу. поэтому мы добавляем затраты на их удержание, в которых даже не было необходимости.

  • Бывший спам в электронной почте. Сколько писем из тех, которые не являются спамом, согласно нашей модели, являются спамом?
  • Ex-Netflix Churn — Из всех тех людей, которые не живут по модели платформы, по словам, они покинут платформу.

ROC-КРИВАЯ -

(RECEIVER OPERATOR CHARACTERISTIC)

  • (МОДЕЛЬ ВЫГОДА И СТОИМОСТИ)На «FPR оси» и на «TPR оси». Внутри всех строк с именем “ROC CURVE”
  • «График всегда находится между 0 и 1, поскольку значения TPR и FPR могут находиться только в диапазоне от 0 до 1.

ОБЪЯСНЕНИЕ:-

  • Предположим, у нас есть данные об учащихся с небольшим количеством меток, и нам нужно найти прогнозируемое место учащегося.
  • Поэтому мы решили использовать модель «Логистической регрессии», поскольку нам нужен прогноз в двоичном формате. Затем разделите данные на «обучающий» и «тестовый набор», обучите модель на обучающем наборе и проверьте результат на тестовых данных, чтобы проверить точность модели, опробовав разные пороговые значения (0.3,0.5, 0.6,0.8), так что для каждого порога значение, мы получаем «confusion matrix”, и для каждой матрицы путаницы мы можем вычислить “TPR & FPR”. Таким образом, мы получим значения “TPR, FPR” для всех пороговых значений, которые мы поместим на график, и это создаст “CURVE” который называется “ROC CURVE” aи, наблюдая за кривой ROC, мы можем решить, какой порог лучше всего использовать. И рядом с “1” какая бы пороговая точка ни возникла, она будет выбрана как лучшее пороговое значение.

КОГДА У НАС DECREASE THE THRESHOLD ОЧЕНЬ НИЗКО (0.1 CLOSE TO 0) FPR И TPR БУДЕТ INCREASE И MODEL PERFORMANCE БУДЕТ ОЧЕНЬ ПЛОХО,

ТЕПЕРЬ, ЕСЛИ МЫ INCREASE THE THRESHOLD ВОКРУГ(0.99 CLOSE TO 1) TPR и FPR будут DECREASE или могут сказать, что точка приблизится к 0 на графике. ЭТО ОЗНАЧАЕТ, МЫ ПРАВИЛЬНЫМ СПОСОБОМ ОБНАРУЖИВАЕМ ОЧЕНЬ НИЗКИЙ ПРОГНОЗ.

  • Например, в случае спама в электронной почте мы прогнозируем, что очень небольшое количество писем будет спамом, если мы возьмем порог в 99 процентов, поэтому, если какое-либо значение вероятности превысит этот показатель, это будет считаться спамом.
  • В этом случае TP уменьшится, поскольку мы не прогнозировали спам в реальных письмах.
  • И FN будет увеличиваться, поскольку мы не называли настоящий спам спамом. Таким образом, в конечном итоге TPR УВЕЛИЧИТСЯ.

Теперь, если я уменьшу порог с 0.99 to 0.85, это означает, что модель будет прогнозировать немного больше спама. Тогда True Positive (TP) увеличится, а False Positive (FP) уменьшится. Таким образом, TPR увеличится.

Но при этом пороге FPR не будет увеличиваться, с какой скоростью увеличивается TPR или, можно сказать, FP (ложное срабатывание) не будет увеличиваться, FP означает почту, которая «НЕ СПАМ», а модель прогнозирует «СПАМ». Таким образом, график будет больше увеличиваться в «направлении Y» по сравнению с «направлением X», поэтому он начнет занимать “CURVY SHAPE”.

import pandas as pd

data = pd.read_csv('https://raw.githubusercontent.com/npradaschnor/Pima-Indians-Diabetes-Dataset/master/diabetes.csv')

data.head()
X = data.drop('Outcome', axis=1)
y = data['Outcome']


from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2)
from sklearn.linear_model import LogisticRegression

model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
y_scores = model.predict_proba(X_test)[:,1]

y_scores
# For all test data, we created probabilities to check patient diabetes
# As can see, first patient probability of being diabetes is 0.44 and so on.
from sklearn.metrics import roc_curve

fpr, tpr, thresholds = roc_curve(y_test, y_scores)

# generated thresholds and fpr, tpr value.
thresholds

# get threshold value between 0 and 1.
import plotly.graph_objects as go
import numpy as np


# Generate a trace for ROC curve
trace0 = go.Scatter(
    x=fpr,
    y=tpr,
    mode='lines',
    name='ROC curve'
)

# Only label every nth point to avoid cluttering
n = 10  
indices = np.arange(len(thresholds)) % n == 0  # Choose indices where index mod n is 0

trace1 = go.Scatter(
    x=fpr[indices], 
    y=tpr[indices], 
    mode='markers+text', 
    name='Threshold points', 
    text=[f"Thr={thr:.2f}" for thr in thresholds[indices]], 
    textposition='top center'
)


# Diagonal line
trace2 = go.Scatter(
    x=[0, 1], 
    y=[0, 1], 
    mode='lines', 
    name='Random (Area = 0.5)', 
    line=dict(dash='dash')
)

data = [trace0, trace1, trace2]

# Define layout with square aspect ratio
layout = go.Layout(
    title='Receiver Operating Characteristic',
    xaxis=dict(title='False Positive Rate'),
    yaxis=dict(title='True Positive Rate'),
    autosize=False,
    width=800,
    height=800,
    showlegend=False
)

# Define figure and add data
fig = go.Figure(data=data, layout=layout)

# Show figure
fig.show()

# Assume that fpr, tpr, thresholds have already been calculated
optimal_idx = np.argmax(tpr - fpr)
optimal_threshold = thresholds[optimal_idx]
print("Optimal threshold is:", optimal_threshold)

# calculating best threshold which is nearest to "1"

- Optimal threshold is: 0.5503810234218872

АУК- РПЦ

(AREA UNDER THE CURVE)

«Используя AUC-ROC, мы можем сравнить две модели, чтобы определить, какая из них является лучшим классификатором».

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

  • Значение AUC of 1 указывает на то, что модель обладает идеальной дискриминацией: она правильно классифицирует все положительные и отрицательные случаи.
  • AUC of 0.5 предполагает, что модель не обладает способностью к различению: это хорошо, как случайное угадывание.
  • AUC of 0 указывает на то, что модель совершенно неверна: она классифицирует все положительные примеры как отрицательные, а все отрицательные примеры - как положительные.

На практике AUC values обычно находится между 0.5 (random) and 1(perfect),, причем более высокие значения указывают на лучшую эффективность классификации.

import numpy as np
import plotly.graph_objects as go
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import roc_curve, roc_auc_score
from sklearn.preprocessing import StandardScaler

# Assuming that X_train, X_test, y_train, y_test are already defined

# SVM requires feature scaling for better performance
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# Logistic Regression model
lr_model = LogisticRegression(max_iter=1000)
lr_model.fit(X_train, y_train)
lr_scores = lr_model.predict_proba(X_test)[:,1]

# SVM model
svm_model = SVC(probability=True)
svm_model.fit(X_train_scaled, y_train)
svm_scores = svm_model.predict_proba(X_test_scaled)[:,1]

# Generate ROC curve data for logistic regression model
lr_fpr, lr_tpr, lr_thresholds = roc_curve(y_test, lr_scores)
lr_auc = roc_auc_score(y_test, lr_scores)

# Generate ROC curve data for SVM model
svm_fpr, svm_tpr, svm_thresholds = roc_curve(y_test, svm_scores)
svm_auc = roc_auc_score(y_test, svm_scores)

# Generate a trace for the Logistic Regression ROC curve
trace0 = go.Scatter(
    x=lr_fpr,
    y=lr_tpr,
    mode='lines',
    name=f'Logistic Regression (Area = {lr_auc:.2f})'
)

# Generate a trace for the SVM ROC curve
trace1 = go.Scatter(
    x=svm_fpr,
    y=svm_tpr,
    mode='lines',
    name=f'SVM (Area = {svm_auc:.2f})'
)

# Diagonal line
trace2 = go.Scatter(
    x=[0, 1], 
    y=[0, 1], 
    mode='lines', 
    name='Random (Area = 0.5)', 
    line=dict(dash='dash')
)

data = [trace0, trace1, trace2]

# Define layout with square aspect ratio
layout = go.Layout(
    title='Receiver Operating Characteristic',
    xaxis=dict(title='False Positive Rate'),
    yaxis=dict(title='True Positive Rate'),
    autosize=False,
    width=800,
    height=800,
    showlegend=True
)

# Define figure and add data
fig = go.Figure(data=data, layout=layout)

# Show figure
fig.show()

Найди меня здесь:

Github: https://github.com/21Nimisha

Linkedin: https://www.linkedin.com/in/nimisha-singh-b6183419/

Сообщение от AI Mind

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь: