이 포스팅에서는 Logistic Regression 모델의 개념, 어떻게 예측을 수행하는지, Logistic Function(Sigmoid Function)이란 무엇인지, 이 모델의 Cost Function은 무엇인지, ROC Curve란 무엇인지, 코드 예시와 함께 ROC 커브로 Threshold 찾는 방법에 대해 알아보겠습니다.
Logistic Regression이란?
Logistic Regression은 binary classification에 쓰이는 머신러닝 모델입니다. binary classification이란 타겟값이 0또는 1로 이루어진 것을 말합니다. 예를들면, 스팸메일이 맞다/ 스팸메일이 아니다 와 같은 구분을 들 수 있습니다. 정확히 말하면 모델은 타겟 값이 1일 확률을 계산합니다. 특별히 threshold를 정해주지 않으면 0.5보다 크면 1, 작으면 0으로 구분을 하기도 하지만 ROC커브를 그려보고 적절한 threshold를 정하는 것도 Logistic Regression 모델을 사용할 때 신경써야하는 키포인트입니다.
Logistic Regression모델이 예측하는 방법?
Logistic Regression 모델은 independent variable 들과 dependent variable(target)과의 관계를 가장 잘 나타내는 각 coefficient를 구하고, coefficient가 적용된 식을 logistic function에 통과시킴으로써 최종 0과 1 사이의 값을 도출하도록 구성되어있습니다.
Logistic Function
Logistic Function은 Simoid Function이라고도 불리는데, 모든 값을 0과 1사이의 값으로 도출하는 함수입니다. 식은 다음과 같고, 이 함수를 통해 Logistic Regression모델은 0과 1 사이의 probability를 결과 값으로 계산해냅니다.
cost function
Logsitc Regression 모델의 Cost Function은 다음과 같습니다. Cost를 최소화하는 방법으로는 Linear Regression과 마찬가지로 Gradient Descent 알고리즘을 사용합니다.
ROC 커브란?
ROC커브는 각 threshold 값에 따라 X축에는 False Positive Rate, Y축에는 True Positive Rate을 그린 그래프입니다. 주로 여러 모델을 한번에 비교할 때 사용합니다. Logistic Regression에서 단순 0.5가아닌 모델 퍼포먼스를 높이는 threshold를 정하기 위해 ROC커브를 그려 False Positive Rate을 낮추면서 True Positive Rate을 높이는 threshold 지점이 어딘지 볼 수 있습니다. 그래프에서 Y축 위쪽으로 가장 가까운 지점이 가장 적절한 threshold값입니다. 이를 확인해보기위해서는 다음과 같은 코드를 이용하면 됩니다.
ROC커브 visualization
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc
# Generate synthetic data
X, y = make_classification(n_samples=10000, n_features=20, n_informative=5,
n_classes=2, n_clusters_per_class=2,
class_sep=0.5, random_state=0)
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
# Train logistic regression model on the training data
clf = LogisticRegression(random_state=0).fit(X_train, y_train)
# Calculate the predicted probability of positive class for test data
probs = clf.predict_proba(X_test)[:,1]
# Calculate false positive rate, true positive rate and thresholds
fpr, tpr, thresholds = roc_curve(y_test, probs)
# Calculate AUC (Area under the ROC curve)
roc_auc = auc(fpr, tpr)
# Plot the ROC curve
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
# Find the best threshold
best_threshold = thresholds[np.argmax(tpr - fpr)]
print("Best threshold: ", best_threshold)
# Mark the best threshold on the ROC plot
plt.scatter(fpr[np.argmax(tpr - fpr)], tpr[np.argmax(tpr - fpr)], color='black', marker='o')
plt.annotate(f"Threshold: {best_threshold:.2f}", (fpr[np.argmax(tpr - fpr)], tpr[np.argmax(tpr - fpr)]), textcoords="offset points", xytext=(-15,-10), ha='center', fontsize=8, color='gray')
plt.show()
이 코드를 실행시키면 아래와 같은 ROC 커브와 Best Threshold를 확인할 수 있습니다.
Logistic Regression은 Supervised Machine Learning 에서 Linear Regression 과 함께 가장 기본적인 모델중 하나입니다. 통계적인 방법에 기초하기 때문에 원리를 이해하기 쉽다는 장점이 있습니다. 0과 1 사이의 값으로 리턴하는 Logistic Function (Sigmoid 함수)을 이용하기 때문에 Bianary Classification에 사용됩니다. 이 포스팅을 통해 기본 개념과 Cost Function, Threshold를 ROC커브를 이용하여 찾는 방법에 대해 알아보았습니다. ROC 커브와 관련된 Precision, Recall, True Positive Rate, False Positive Rate에 대한 상세 내용이 궁금하시다면 아래 포스팅을 참고하세요.
'머신러닝' 카테고리의 다른 글
[파이썬 머신러닝] 사이킷런(Scikit-learn) 소개 (0) | 2023.02.18 |
---|---|
노코드 머신러닝 툴 WEKA 사용방법(코딩 없이 Machine Learning하기) (0) | 2023.02.15 |
머신러닝 Accuracy, Precision, Recall, F1-Score, Confusion Matrix 이해하기 (0) | 2023.02.13 |
머신러닝 Linear Regression 과 Gradient Descent 알고리즘 이해하기 (0) | 2023.02.12 |
챗 GPT로 머신러닝 코딩 하기(파이썬) (0) | 2023.02.12 |
댓글