로지스틱 회귀분석의 필요성과 한계
From the 데이터 사이언스3 curriculum
TL;DR
로지스틱 회귀분석은 선형 회귀가 가진 분류 문제 해결의 한계를 극복하기 위해 등장했으며, 0과 1 사이의 확률을 예측하는 데 효과적이에요. 하지만 비선형 관계를 잘 모델링하지 못하고 이상치에 민감하다는 한계가 있습니다. 이러한 장단점을 이해하면 적절한 상황에 로지스틱 회귀를 활용할 수 있어요.
1. The Mental Model
당신은 어떤 것이 '합격'인지 '불합격'인지, '예'인지 '아니오'인지 예측하고 싶을 때가 있을 거예요. 일반적인 선형 회귀는 숫자를 예측하지만, 로지스틱 회귀는 특정 결과가 발생할 '확률'을 0에서 1 사이로 예측하여 이러한 이진 분류 문제에 답할 수 있도록 도와주는 도구입니다.
2. The Core Material
왜 로지스틱 회귀가 필요할까요?
선형 회귀는 연속적인 값을 예측하는 데 적합해요. 예를 들어 집값이나 키처럼요. 하지만 우리가 '대출 승인(1) 또는 거절(0)', '이메일이 스팸(1) 또는 아님(0)'처럼 두 가지 결과 중 하나를 예측하고 싶을 때는 문제가 생겨요.
선형 회귀를 이런 분류 문제에 그대로 적용하면, 예측값이 0보다 작거나 1보다 커질 수 있어요. 확률은 0에서 1 사이여야 하는데, 선형 회귀는 이런 조건을 만족시키지 못하죠. 또한, 이진 분류 문제에서 데이터의 분포는 일반적으로 S자 형태를 띠는데, 선형 회귀는 직선 형태라 이런 분포를 잘 설명하지 못합니다.
로지스틱 회귀는 이 문제를 해결하기 위해 시그모이드(sigmoid) 함수를 사용해요. 선형 회귀의 결과값을 시그모이드 함수에 통과시켜 0과 1 사이의 값으로 변환함으로써, 특정 사건이 발생할 확률을 예측할 수 있게 됩니다.
로지스틱 회귀의 기본 원리
- 선형 결합: 독립 변수들을 가중치와 곱하고 절편을 더해 선형 모델을 만듭니다. (z = β₀ + β₁x₁ + ... + βₚxₚ)
- 시그모이드 함수 적용: 이 선형 결합의 결과
z를 시그모이드 함수σ(z) = 1 / (1 + e^(-z))에 넣어 0과 1 사이의 확률값p를 얻습니다. - 분류: 이 확률
p가 특정 임계값(예: 0.5)보다 크면 한 클래스로, 작으면 다른 클래스로 분류합니다.
graph TD
A["독립 변수 (x1, x2, ...)"] --> B["선형 결합 (z = β₀ + β₁x₁ + ...)"]
B --> C["시그모이드 함수 (σ(z) = 1 / (1 + e^(-z)))"]
C --> D["확률 (p)"]
D --> E{p > 임계값 (예: 0.5)?}
E -- Yes --> F["클래스 1 (예: 합격)"]
E -- No --> G["클래스 0 (예: 불합격)"]
로지스틱 회귀의 한계점
로지스틱 회귀는 강력한 도구이지만, 몇 가지 한계점도 있어요.
- 선형 결정 경계: 로지스틱 회귀는 기본적으로 데이터 공간을 선형적으로 나누는 결정 경계를 만듭니다. 만약 데이터가 복잡한 비선형 관계를 가지고 있다면, 로지스틱 회귀는 이를 잘 분류하지 못할 수 있어요.
- 이상치(Outlier) 민감성: 선형 회귀와 마찬가지로, 로지스틱 회귀도 이상치에 민감하게 반응할 수 있습니다. 이상치가 있으면 모델의 계수 추정치가 왜곡되어 예측 성능에 영향을 줄 수 있어요.
- 다중 공선성 문제: 독립 변수들 간에 강한 상관관계(다중 공선성)가 있을 경우, 모델의 계수 해석이 어려워지고 불안정해질 수 있습니다.
- 과소적합(Underfitting) 가능성: 변수의 수가 너무 적거나 변수들 간의 상호작용을 고려하지 않으면, 모델이 데이터의 패턴을 충분히 학습하지 못해 과소적합이 발생할 수 있습니다.
3. Worked Example
어떤 학생이 시험에 합격할지 불합격할지 예측하는 시나리오를 생각해봅시다. 학생의 공부 시간(hours_studied)을 독립 변수로 사용하고, 합격 여부(passed, 1은 합격, 0은 불합격)를 종속 변수로 사용합니다.
파이썬 scikit-learn 라이브러리를 사용하여 로지스틱 회귀 모델을 만들어 볼게요.
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 1. 가상의 데이터 생성
data = {
'hours_studied': [0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10],
'passed': [0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
}
df = pd.DataFrame(data)
X = df[['hours_studied']] # 독립 변수
y = df['passed'] # 종속 변수
# 2. 훈련 세트와 테스트 세트 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. 로지스틱 회귀 모델 생성 및 훈련
model = LogisticRegression(solver='liblinear', random_state=42)
model.fit(X_train, y_train)
# 4. 예측
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1] # 합격할 확률
print(f"모델의 계수 (coefficient): {model.coef_[0][0]:.2f}")
print(f"모델의 절편 (intercept): {model.intercept_[0]:.2f}")
print(f"테스트 세트 정확도: {accuracy_score(y_test, y_pred):.2f}")
print("\n테스트 데이터 예측 결과:")
for i in range(len(X_test)):
print(f"공부 시간: {X_test.iloc[i].values[0]:.1f}시간, "
f"예측 합격 확률: {y_pred_proba[i]:.2f}, "
f"예측 결과: {'합격' if y_pred[i] == 1 else '불합격'}, "
f"실제 결과: {'합격' if y_test.iloc[i] == 1 else '불합격'}")
# 예시: 4시간 공부했을 때 합격 확률은?
new_student_hours = np.array([[4]])
predicted_proba = model.predict_proba(new_student_hours)[:, 1]
print(f"\n4시간 공부한 학생의 합격 예측 확률: {predicted_proba[0]:.2f}")
위 코드에서 predict_proba를 통해 특정 공부 시간을 가진 학생이 합격할 확률을 0과 1 사이의 값으로 얻을 수 있습니다. 예를 들어, 4시간 공부한 학생은 0.35 확률로 합격한다고 예측하는 것을 볼 수 있습니다. (이 값은 데이터와 모델에 따라 달라집니다.)
4. Key Takeaways
- 로지스틱 회귀는 이진 분류 문제(예/아니오, 0/1) 해결에 특화된 통계 모델입니다.
- 선형 회귀가 예측값이 0~1 범위를 벗어나는 문제를 시그모이드 함수를 이용해 해결합니다.
- 시그모이드 함수는 선형 모델의 결과를 0과 1 사이의 확률 값으로 변환해줍니다.
- 로지스틱 회귀는 데이터가 선형적으로 분리 가능할 때 가장 잘 작동합니다.
- 복잡한 비선형 관계나 이상치에 대해서는 성능이 떨어질 수 있습니다.
- 다중 공선성 문제는 로지스틱 회귀 모델의 안정성과 해석력을 저해할 수 있습니다.
피해야 할 흔한 실수:
- 로지스틱 회귀를 일반 선형 회귀처럼 연속적인 값 예측에 사용하는 것.
- 로지스틱 회귀가 항상 선형적인 결정 경계를 만든다는 사실을 간과하는 것.
- 모델 훈련 전에 이상치나 다중 공선성 문제를 확인하지 않는 것.
- 무조건 0.5를 분류 임계값으로 사용하여 실제 비즈니스 문제에 적합하지 않은 판단을 내리는 것.
5. Now Try It
주어진 데이터셋(credit_score_data.csv와 같이 신용 점수, 연봉, 대출 연체 여부(0 또는 1)가 포함된 가상의 데이터셋을 가정)에서 연봉을 독립 변수로, 대출 연체 여부를 종속 변수로 하여 로지스틱 회귀 모델을 학습시켜 보세요. 그리고 연봉이 5000만원인 사람의 대출 연체 확률을 예측해보세요. 성공적인 결과는 연봉에 따른 대출 연체 확률을 0과 1 사이의 숫자로 출력하는 것입니다.
Frequently asked about 로지스틱 회귀분석의 필요성과 한계
Study this next
Get the full 데이터 사이언스3 curriculum
Clone the complete plan to your dashboard for unlimited AI-generated notes, practice quizzes, and a personalised revision schedule.
Save this course free