- 들어가기
- 앞서 선형회귀에서 종속변수가 특정, 두 가지 값만 갖는 경우(범주형인 경우)에 선형회귀분석이 가능할까?
- ex) 대학합격여부, 암 재발여부, 상품구매여부 등
- 종속변수가 0과 1값만 갖는 경우에 선형회귀분석을 적합시키는 경우,
- 독립변수 X : 일일흡연량
- 범주형 종속변수 Y: 폐암 발병 여부 (폐암환자 1, 정상 0)
- 어떠한 문제가 발생?
- 잘 적합하지 않는 선형회귀 추정식
- Y 추정값이 0보다 작거나 1보다 큰 값을 가질 수 있음
- 선형회귀 모델의 보안 -> 로지스틱 회귀
- 로지스틱 회귀 (Logistic Regression)
- 독립 변수 집합을 사용하여 종속 변수가 특정 범주에 속할 확률을 예측하는 모델로 출력이 0과 1사이의 값을 가지도록 하는 모델
- 다시말해, 선형회귀 모형을 S자 모양으로 증가하거나 감소하는 함수로 바꿈.
- 로지스틱 회귀 식:
- X라는 data가 주어졌을 때 Y=1일 확률을 나타낸 식이다. 이 예측된 확률값은 [0, 1] 사이로 값을 가진다.
- 이 값을 threshold 값을 기준으로 삼아서 예측된 확률 값이 threshold 이상인 것과 미안인 것으로 분류한다.
- 식을 자세히 보면 로지스틱 함수는 Linear Regression + Sigmoid Function의 결합이다.
- 로지스틱 회귀 개념
- 오즈 (odds)
- 성공확률 / 실패확률
- 성공(Y-1)확률이 실패(Y=0)확률에 비해 몇배 더 높은가를 나타낸다.
- 로짓변환 (logit)
- 오즈(odds)에 로그를 취한 함수 형태
- 입력값(p)의 범위가 [0, 1]일 때, [-∞, ∞]를 출력함
- 로짓변환 하는 이유 :
- 종속 변수(Y)의 확률을 선형 함수로 변환하여 선형 회귀와 동일한 방법으로 해석할 수 있게 함
- 로짓변환을 적용하면 종속 변수(Y)의 값이 0과 1사이로 제한되어 이진 분류 문제에 적합한 확률 값을 얻을 수 있음
- 로지스틱 회귀 식 정리
\[ \log \left( \frac{p}{1-p} \right) = \beta^T \mathbf{X} = Y \]
\[ \frac{p}{1-p} = e^{\beta^T \mathbf{X}} \]
\[ p = \frac{e^{\beta^T \mathbf{X}}}{1+e^{\beta^T \mathbf{X}}} \]
\[ p = \frac{1}{1+e^{-\beta^T \mathbf{X}}} \]
- 로지스틱 회귀 손실함수 (이진분류)
\[ J(\boldsymbol{\beta}) = \text{Binary Cross-Entropy Loss} = -\frac{1}{N} \sum_{i=1}^{N} \left( y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right) \]
- 로지스틱 회귀 모델의 학습 목표는 손실 함수를 최소화하는 최적의 가중치 벡터 β를 찾는 것이다.
- Binary Cross-Entropy 손실 함수는 모델의 예측과 실제 label 간의 차이를 측정한다.
- 실제 label (y_i)가 1인 경우, 손실은 -log(p_i)이다. 이는 모델이 클래스 1에 속할 확률 p_i가 클수록 손실이 작아지고, p_i가 1에 가까워질수록 손실은 0에 가까워진다.
- 실제 label(y_i)가 0인 경우, 손실은 -log(1-p_i)이다. 이는 모델이 클래스 0에 속할 확률 1-p_i가 클수록 손실이 작아지고, 1-p_i가 1에 가까워질수록 손실은 0에 가까워진다.
- 가중치 벡터 β Update
\[ \beta_i = \beta_i - \alpha \cdot \nabla J(\beta_i) \]
- 코드 예제
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
# Iris 데이터셋 로드
iris = load_iris()
X = iris.data
y = iris.target
# 데이터 전처리: 표준화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 학습 데이터와 테스트 데이터로 분할
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 로지스틱 회귀 모델 학습
log_reg = LogisticRegression(solver='liblinear', penalty = 'l2', C = 1.0, max_iter=100, multi_class='auto')
log_reg.fit(X_train, y_train)
# 테스트 데이터에 대한 예측
y_pred = log_reg.predict(X_test)
# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
# classification_report 출력
print(classification_report(y_test, y_pred, target_names=iris.target_names))
- LogisticRegression 파라미터 분석
- solver: default = 'lbfgs'
- 설명: 최적화 알고리즘을 결정하는 파라미터로 학습이 더 잘되게 해주는 네이게이션 역활
- 'lbfgs' : 대규모 데이터셋에서 효율적
- 'liblinear' : 작은 데이터셋이나 희소행렬에 적합
- penalty : default = 'l2'
- 설명: 사용되는 규제(Regularization)의 종류를 결정하는 파라미터
- 'l1' : L1 정규화(Lasso) , 일부 특성(여기서는 β)을 0을 만들어 모델의 복잡도를 감소시킴
- 'l2' : L2 정규화(Ridge), 모든 특성(여기서는 β)을 유지하며 중요도가 낮은 가중치는 0에 가깝게 만듬
- C : default = 1.0
- 설명: 규제 강도를 제어하는 역수로, 작은 값은 강한 규제를 의미함
- max_iter : default =100
- 설명: 알고리즘의 최대 반복 횟수를 설정하는 파라미터
- multi_calss : default = 'auto'
- 설명: 다중 클래스 분류 설정 방법을 결정하는 파라미터
- 종류: 'auto' , 'ovr', 'multinomial'
- 설명: 다중 클래스 분류 설정 방법을 결정하는 파라미터
- solver: default = 'lbfgs'
'ML' 카테고리의 다른 글
[Boosting] Light GBM (0) | 2024.07.24 |
---|---|
랜덤 포레스트(Random Forest) (0) | 2024.06.18 |
[머신러닝] 앙상블(Ensemble) (1) | 2024.06.01 |
의사 결정 나무 (Decision Tree) (1) | 2024.05.30 |