КРИВАЯ 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
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Аплодируйте истории и подписывайтесь на автора 👉
- 📰 Больше контента смотрите в AI Mind Publication
- 🧠 Улучшайте свои подсказки AI легко и БЕСПЛАТНО
- 🧰 Откройте для себя Интуитивные инструменты искусственного интеллекта