[머신러닝] 로지스틱 회귀
로지스틱 회귀 소개
로지스틱 회귀(Logistic Regression)는 이름에서 알 수 있듯이 회귀 분석의 한 유형이지만, 실제로는 분류 문제를 해결하기 위해 널리 사용됩니다. 특히 이진 분류(Binary Classification) 문제에 적합한 기법으로, 예를 들어 이메일이 스팸인지 아닌지, 어떤 특정 질병이 있는지 없는지 등의 이분법적인 결정 문제에 활용됩니다.
로지스틱 회귀와 선형 회귀의 차이
로지스틱 회귀는 선형 회귀(Linear Regression)와 기본 아이디어는 유사하되, 핵심적인 차이점이 있습니다. 선형 회귀는 독립 변수(X)의 선형 조합을 통해 종속 변수(Y)의 값을 예측하려고 합니다. 이 때, Y는 연속된 값으로 나타나며, 예측 결과가 직선 혹은 평면(변수의 수에 따라 다름)으로 표현됩니다.
반면, 로지스틱 회귀는 종속 변수(Y)가 범주형 데이터일 때 사용됩니다. 주로 0과 1의 값을 가지는 이진 분류에 사용되며, 로지스틱 함수(또는 시그모이드 함수)를 사용하여 출력값을 0과 1 사이의 확률로 나타냅니다. 즉, 로지스틱 회귀는 선형 회귀의 출력 값을 입력으로 하여 시그모이드 함수를 통과시켜, 결과값을 확률로 변환합니다.
로지스틱 회귀의 주요 사용 분야 및 사례
로지스틱 회귀는 의료, 금융, 마케팅, 소셜 미디어 분석 등 다양한 분야에서 분류 문제를 해결하기 위해 사용됩니다. 주요 사례로는 다음과 같습니다:
-
의료 분야: 환자의 임상 데이터를 바탕으로 특정 질병의 유무를 예측합니다. 예를 들어, 환자의 연령, 체중, 혈압 등 다양한 임상 지표를 기반으로 당뇨병 또는 심장 질환의 위험도를 분류할 수 있습니다.
-
금융 분야: 고객의 신용 이력, 소득, 고용 상태 등을 바탕으로 신용 등급을 분류하거나 대출 승인 여부를 결정합니다.
-
마케팅 분야: 고객의 구매 이력, 웹사이트 방문 패턴, 소셜 미디어 활동 등의 데이터를 분석하여 특정 제품이나 서비스에 대한 고객의 구매 의사를 예측합니다.
이처럼 로지스틱 회귀는 이진 분류가 필요한 다양한 분야에서 유용하게 사용되며, 실제로 간단하면서도 효과적인 기법 중 하나로 꼽힙니다. 특히 문제의 본질을 확률적으로 접근하며, 결과를 해석하기도 비교적 용이하다는 장점이 있습니다.
로지스틱 회귀의 수학적 배경
로지스틱 회귀(Logistic Regression)는 분류 문제, 특히 이진 분류 문제에 자주 사용되는 통계적 모델링 기법입니다. 이 모델이 선형 회귀(Linear Regression) 모델과 구분되는 핵심적인 요소 중 하나는 종속 변수가 이진(binary)이라는 점입니다. 이 절에서는 로지스틱 회귀의 수학적 배경을 이해하는 데 필요한 주요 개념들을 살펴보겠습니다.
로지스틱 함수(Logistic function) 또는 시그모이드 함수(Sigmoid function)의 정의 및 특징
시그모이드 함수(또는 로지스틱 함수)는 S자 형태의 곡선을 가지며, 실수 입력값을 0과 1사이의 값으로 변환합니다. 이 함수는 다음과 같이 정의됩니다.
여기서 는 자연 로그의 밑이며, 는 입력 변수의 선형 조합입니다. 시그모이드 함수의 출력값은 확률을 나타내기에 적합하기 때문에, 로지스틱 회귀에서 널리 사용됩니다. 특히, 함수의 출력값은 항상 0과 1 사이에 있으며, 가 매우 크거나 작을 때 함수의 출력이 각각 1 또는 0에 점점 가까워지는 성질을 가집니다.
로지스틱 회귀 모델의 가설(hypothesis) 함수
로지스틱 회귀에서의 가설 함수는 다음과 같이 정의됩니다.
여기서 는 입력 특성 벡터, 는 모델 파라미터 벡터, 는 파라미터와 입력 특성의 선형 조합을 의미합니다. 가설 함수는 입력 데이터에 대한 예측된 클래스의 확률을 출력합니다.
로그 오즈(Log-Odds)와 그것이 로지스틱 회귀와 어떻게 연결되는지
로지스틱 회귀에서는 확률을 직접 다루기보다는 로그 오즈를 사용하는 것이 일반적입니다. 로그 오즈는 어떤 사건의 확률과 그 사건이 일어나지 않을 확률의 비율의 로그(logarithm)입니다. 수학적으로 다음과 같이 표현됩니다.
여기서 는 사건이 발생할 확률입니다. 로지스틱 회귀에서는 이 로그 오즈가 입력 특성의 선형 조합과 동일하다고 가정합니다.
이 식을 에 대해 재배열하면, 다음과 같이 가설 함수를 얻을 수 있습니다.
즉, 로지스틱 회귀 모델은 입력 특성의 선형 조합을 로그 오즈로 변환하고, 이를 확률로 재변환하여 예측을 수행하게 됩니다.
Python 예제
로지스틱 함수를 Python으로 간단하게 구현해 보겠습니다.
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(z):
return 1 / (1 + np.exp(-z))
z = np.linspace(-10, 10, 100)
y = sigmoid(z)
plt.plot(z, y)
plt.xlabel('z')
plt.ylabel('sigmoid(z)')
plt.title('Sigmoid Function')
plt.show()
이 스크립트는 시그모이드 함수의 대표적인 S자 형태의 곡선을 그려줍니다. 여기서 가 변함에 따라 의 값이 0에서 1로 부드럽게 변화하는 것을 볼 수 있습니다.
로지스틱 회귀 모델 학습
로지스틱 회귀는 분류 문제를 해결하기 위해 사용되는 통계적 기법입니다. 특히 이진 분류를 위해 주로 사용되지만, 멀티 클래스 분류 문제에도 적용될 수 있습니다. 로지스틱 회귀 모델을 학습시키는 과정은 주로 비용 함수를 최소화하는 파라미터를 찾는 것에 집중됩니다. 이 섹션에서는 로지스틱 회귀 학습의 핵심 구성요소들을 알아봅니다.
비용 함수(Cost Function)의 정의와 목적
로지스틱 회귀에서 사용되는 비용 함수는 로그 손실 함수(Log Loss Function) 또는 이진 교차 엔트로피(Binary Cross-Entropy)라고도 합니다. 모델의 예측값과 실제값 사이의 차이를 측정함으로써, 모델의 성능을 평가할 수 있습니다. 비용 함수는 다음과 같이 정의됩니다.
여기서 은 훈련 데이터의 개수, 는 번째 훈련 데이터의 실제 레이블, 는 예측된 확률입니다. 이 비용 함수는 모델의 예측이 실제 레이블과 얼마나 잘 일치하는지를 측정하며, 모델 학습의 목적은 이 비용 함수의 값을 최소화하는 파라미터 를 찾는 것입니다.
최적화 알고리즘(Gradient Descent 등)에 대한 개요
최적화 알고리즘은 비용 함수의 값을 최소화하는 파라미터를 찾기 위해 사용됩니다. 로지스틱 회귀에서 널리 사용되는 방법은 경사 하강법(Gradient Descent)입니다. 경사 하강법은 비용 함수의 기울기(Gradient)를 계산하고, 이를 사용하여 한 단계씩 최적의 파라미터로 움직입니다.
경사 하강법의 업데이트 규칙은 다음과 같습니다.
여기서 는 학습률(Learning Rate)이며, 파라미터 업데이트 속도를 결정합니다. 기울기의 방향으로 파라미터를 업데이트함으로써, 비용 함수의 최솟값을 찾아갑니다.
다중 클래스 분류를 위한 확장: 일대다(OvR)와 일대일(OvO) 전략
로지스틱 회귀는 원래 이진 분류를 위해 설계되었지만, 멀티 클래스 분류 문제에도 적용할 수 있습니다. 이를 위한 두 가지 전략은 일대다(OvR, One-vs-Rest)와 일대일(OvO, One-vs-One)입니다.
-
일대다(OvR): 이 전략에서는 각 클래스를 해당 클래스와 그 외의 모든 클래스로 이진 분류 문제로 변환하여, 모델을 학습시킵니다. 결과적으로 클래스의 수만큼 이진 분류 모델이 만들어집니다.
-
일대일(OvO): 이 방법에서는 모든 클래스 쌍에 대해 이진 분류 모델을 학습시킵니다. 따라서 클래스가 개 있을 경우, 개의 모델을 만들게 됩니다. 분류 시, 가장 많이 양성으로 분류된 클래스를 최종 예측값으로 선택합니다.
멀티 클래스 분류에서는 일반적으로 OvR이 더 자주 사용됩니다. OvO의 경우 모델의 수가 기하급수적으로 늘어나기 때문에, 클래스가 많은 경우 비효율적일 수 있습니다.
로지스틱 회귀의 구현
로지스틱 회귀(Logistic Regression)는 이진 분류(binary classification) 문제에 널리 사용되는 통계적 모델링 기법입니다. 다음으로는 Python을 사용하여 로지스틱 회귀 모델을 구현하는 방법에 대해 설명합니다.
로지스틱 회귀 모델을 파이썬(Python)으로 구현하는 기본적인 방법
로지스틱 회귀 모델을 직접 구현하기 위해서는 시그모이드 함수(sigmoid function)를 이해해야 합니다. 이 함수는 예측값을 0과 1 사이의 확률로 변환해주며, 이는 특정 데이터 포인트가 어떤 클래스에 속할 확률을 의미합니다.
시그모이드 함수
시그모이드 함수는 다음과 같은 식으로 표현됩니다:
이 함수를 Python으로 구현하면 아래와 같습니다:
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
로지스틱 회귀 모델 학습
로지스틱 회귀에서의 학습 과정은 가중치(weights)와 편향(bias)을 조정하며, 실제 레이블과 예측 레이블 간의 차이(오차)를 최소화하는 과정입니다. 이를 위해 로스 함수(loss function)로 대표적으로 로그 손실(log loss)을 사용합니다.
피처 스케일링(Feature Scaling)의 중요성과 방법
로지스틱 회귀를 포함한 많은 머신러닝 알고리즘에서는 피처 스케일링이 중요합니다. 피처의 값 범위가 서로 다르면 학습 과정에서 가중치의 업데이트가 불균형하게 이루어질 수 있습니다. 이를 방지하기 위해 StandardScaler나 MinMaxScaler와 같은 방법을 사용할 수 있습니다.
피처 스케일링 예시
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)
Scikit-learn과 같은 라이브러리를 사용한 로지스틱 회귀 모델의 구현 및 적용
Scikit-learn 라이브러리는 로지스틱 회귀 모델을 간편하게 구현할 수 있는 다양한 도구를 제공합니다. Scikit-learn의 LogisticRegression
클래스를 사용해 로지스틱 회귀 모델을 손쉽게 훈련시키고 예측을 수행할 수 있습니다.
Scikit-learn을 사용한 로지스틱 회귀 구현 예시
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
# 데이터와 레이블 준비
X, y = 데이터, 레이블
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)
# 예측 및 성능 평가
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
위 코드는 로지스틱 회귀 모델을 훈련시키고 테스트 데이터에 대한 예측을 수행하는 간단한 예시입니다. train_test_split
함수를 사용해 데이터를 훈련 세트와 테스트 세트로 나누고, LogisticRegression
모델을 사용해 학습 후, classification_report
함수로 모델의 성능을 평가합니다.
로지스틱 회귀의 구현에서 가장 중요한 것은 데이터의 성질을 잘 이해하고, 적절한 전처리 및 피처 스케일링을 통해 모델의 성능을 최대화하는 것입니다. Scikit-learn과 같은 라이브러리는 이 과정을 대폭 단순화시켜주지만, 기본적인 수학적 이해는 모델의 작동 방식과 성능을 최적화하는 데 필수적입니다.
모델 평가
로지스틱 회귀 모델의 성능 평가는 이진 분류(Binary Classification) 문제에서 매우 중요합니다. 성능을 평가하는 주요 방법으로는 혼동 행렬(Confusion Matrix), 정확도(Accuracy), 정밀도(Precision), 재현율(Recall), F1 점수(F1 Score), 그리고 ROC 곡선과 AUC 분석이 있습니다. 이러한 평가 지표들은 모델의 다양한 측면을 이해하고, 비즈니스 요구사항에 맞추어 최적의 모델을 선택하는데 도움을 줍니다.
혼동 행렬(Confusion Matrix)을 통한 모델 성능 평가
혼동 행렬은 모델이 분류 작업에서 실제 클래스와 예측 클래스를 어떻게 분류했는지를 보여주는 표입니다. 이는 True Positive (TP), False Positive (FP), True Negative (TN), 그리고 False Negative (FN)의 네 가지 요소로 구성됩니다.
- True Positive (TP): 모델이 양성으로 예측하고, 실제로 양성인 경우
- False Positive (FP): 모델이 양성으로 예측했지만 실제로는 음성인 경우
- True Negative (TN): 모델이 음성으로 예측하고, 실제로 음성인 경우
- False Negative (FN): 모델이 음성으로 예측했지만 실제로는 양성인 경우
혼동 행렬의 각 요소는 모델의 민감도와 특이도를 평가하는 데 사용됩니다.
정확도, 정밀도, 재현율, F1 점수 등의 평가 지표 이해
이러한 요소들을 기반으로 다음과 같은 주요 모델 평가 지표를 계산할 수 있습니다.
- 정확도 (Accuracy): 모델이 올바르게 예측한 사례의 비율입니다.
(TP + TN) / (TP + TN + FP + FN)
- 정밀도 (Precision): 모델이 양성으로 예측한 사례 중 실제 양성인 사례의 비율입니다.
TP / (TP + FP)
- 재현율 (Recall): 실제 양성 사례 중 모델이 올바르게 양성으로 예측한 비율입니다.
TP / (TP + FN)
- F1 점수 (F1 Score): 정밀도와 재현율의 조화 평균입니다.
2 * (precision * recall) / (precision + recall)
ROC 곡선과 AUC(Area Under Curve)에 대한 소개 및 분석
ROC 곡선(Receiver Operating Characteristic curve)은 모델의 성능을 평가하는 데 사용되는 그래프로, 재현율과 1-특이도의 관계를 나타냅니다. ROC 곡선 아래의 면적을 AUC(Area Under Curve)라고 하며, 이는 모델이 양성 클래스를 음성 클래스로부터 얼마나 잘 구분하는지를 나타내는 척도입니다. AUC 값이 1에 가까울수록 모델의 성능이 더 좋다고 할 수 있습니다.
from sklearn.metrics import roc_curve, auc, roc_auc_score
import matplotlib.pyplot as plt
# 예: 로지스틱 회귀 모델의 예측 확률을 얻습니다.
# y_proba = model.predict_proba(X_test)[:, 1]
fpr, tpr, threshold = roc_curve(y_test, y_proba)
roc_auc = auc(fpr, tpr)
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()
이 코드는 ROC 곡선을 그리고, AUC를 계산해 그 결과를 시각화하는 예시입니다. 로지스틱 회귀 모델이 분류 작업에 얼마나 잘 수행되는지를 평가하는데 유용한 도구입니다.
성능 평가 지표를 통해 모델의 강점과 약점을 파악할 수 있으며, 이를 통해 모델을 개선하거나 특정 문제에 적합한 모델을 선택할 수 있습니다.
로지스틱 회귀의 고급 주제
로지스틱 회귀는 분류 문제에서 널리 사용되는 강력한 통계 방법입니다. 기본 개념과 용어를 넘어서, 로지스틱 회귀의 성능을 향상시키기 위한 몇 가지 고급 주제를 살펴보겠습니다.
정규화(Regularization) 방법
로지스틱 회귀 모델이 데이터에 과적합되는 것을 방지하기 위해, 정규화 기법이 자주 사용됩니다. 과적합은 모델이 훈련 데이터에 지나치게 최적화되어 새로운 데이터에서는 성능이 떨어지는 현상을 말합니다.
-
L1 정규화 (Lasso regularization): 이 기법은 모델의 일부 가중치를 0으로 만들어 특성 선택의 효과를 낼 수 있습니다. 이는 불필요한 특성이 모델에 미치는 영향을 줄여줍니다.
-
L2 정규화 (Ridge regularization): L2 정규화는 가중치의 제곱 값을 최소화하여 모든 가중치를 작게 만들려는 경향이 있습니다. 이는 가중치 값이 급격히 증가하는 것을 방지해줍니다.
다항 로지스틱 회귀(Polynomial Logistic Regression)
로지스틱 회귀는 기본적으로 선형 모델입니다. 하지만 실제 세계의 데이터는 종종 비선형 패턴을 보이기 때문에, 모델의 유연성을 높이기 위해 다항 특성을 도입할 수 있습니다. 이러한 접근 방식을 다항 로지스틱 회귀라고 합니다.
Python 예시:
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
import numpy as np
# 가상의 데이터 생성
X = np.random.rand(100, 1)
y = (3*X.squeeze()**2 + 2*X.squeeze() + 1 > 2.5).astype(np.int)
# 다항 특성과 로지스틱 회귀를 결합한 파이프라인 생성
polynomial_logistic_model = Pipeline([
("poly_features", PolynomialFeatures(degree=2, include_bias=False)),
("log_reg", LogisticRegression(penalty='l2')) # L2 정규화 적용
])
# 모델 학습
polynomial_logistic_model.fit(X, y)
# 새로운 데이터에서 예측
new_X = np.array([[0.1], [0.4]])
predictions = polynomial_logistic_model.predict(new_X)
print(predictions)
이 예시는 단순화된 형태이며, 실제 데이터에서는 PolynomialFeatures
의 degree
매개변수를 조정하여 모델의 복잡도를 관리해야 합니다.
정리하자면, 로지스틱 회귀를 사용할 때 과적합 방지를 위해 정규화 기법을 적용하는 것이 중요하며, 비선형 패턴을 캡처하기 위해 다항 특성을 추가할 수 있습니다. 이러한 고급 기술을 적절히 활용하면, 더 강력하고 일반화된 모델을 만들 수 있습니다.