준비하는 대학생

[기계학습] 로지스틱 회귀 (Logistic Regression) 본문

Programming/Machine learning

[기계학습] 로지스틱 회귀 (Logistic Regression)

Bangii 2023. 6. 9. 10:09

로지스틱 회귀란

일반적인 선형 회귀는 연속적인 값을 예측하는 데 사용되지만, 로지스틱 회귀는 이진 분류 문제(binary classification)를 해결하는 데 적합합니다. 예를 들어, 이메일이 스팸인지 아닌지, 환자가 특정 질병을 가지고 있는지 여부 등을 판별할 수 있습니다.

동작 원리

  1. 선형 결합: 우선, 입력 특성들과 각 특성에 대응하는 가중치들을 곱한 값을 모두 합하여 선형 결합(Linear Combination)을 구합니다.
    $$ z = b+x_1w_1+x_2w_2+...+x_nw_n $$
    여기서 w는 기울기, 는 특성 값입니다. b 는 절편(편향,bias)입니다.
  2. Logit을 확률로 변환: 이 선형 결합 값을 Logit 함수의 역함수인 Sigmoid 함수에 통과시켜서, 0과 1 사이의 확률값을 얻습니다.여기서  p는 양성 클래스(1)로 분류할 확률입니다.
  3. $$ p= \frac{1}{1+e^{-z}} $$
  4. 분류 결정: 마지막으로, 얻어진 확률값 를 기준으로 분류 결정을 합니다. 일반적으로, 가 0.5 이상이면 양성 클래스(1)로, 그렇지 않으면 음성 클래스(0)로 분류합니다.

모델 학습

로지스틱 회귀 모델을 학습시키는 과정은 가중치를 조정하여 실제 값과 예측 값 사이의 차이를 최소화하는 것으로 구성됩니다. 이를 위해 로그 손실(log loss) 같은 손실 함수를 사용합니다.

$$ L(Y,p) = -Ylog(p)-(1-Y)log(1-p) $$

손실 함수를 최소화하는 기울기를 찾기 위해, 경사 하강법(gradient descent) 같은 최적화 알고리즘을 사용하여 반복적으로 가중치를 업데이트합니다.

로지스틱 회귀에서 경사하강법

손실 함수 L에 대해, 각 기울기 w에 대한 편미분을 구하고, 이를 사용하여 가중치를 업데이트합니다.

$$ w = w - \alpha \frac{\partial L}{\partial w_i} $$

$$ \frac{\partial L}{\partial a} = -Y\frac{1}{a}-(1-Y)\frac{1}{1-a}(-1) = -\frac{Y}{a}+\frac{1-Y}{1-a} $$ $$ \frac{\partial a}{\partial z} = -(1+e^{-z})^{-2}(-e^{-z})= \frac{e^{-z}}{(1+e^{-z})^2}= \frac{1}{(1+e^{-z})} \frac{1+e^{-z}-1}{(1+e^{-z})}= \frac{1}{(1+e^{-z})} (\frac{-1}{(1+e^{-z})} +1) = a(1-a) $$ $$ \frac{\partial z}{\partial w_i} = x_i $$ $$ \frac{\partial L}{\partial w_i} = \frac{\partial L}{\partial a}\frac{\partial a}{\partial z}\frac{\partial z}{\partial w_i} =(-\frac{Y}{a}+\frac{1-Y}{1-a})(a(1-a))x_i $$ $$ =(-Y(1-a)+a(1-Y))x_i=-Yx_i +aYx_i+ax_i-aYx_i = ax_i-Yx_i=(a-Y)x_i $$ $$ w_i = w_i -(-(Y-a)x_i) * \alpha(leaning\ rate)) $$

위 식 대로 파라미터를 업데이트해 손실함수를 최소화하는 파라미터를 찾아 선형 결합을 통해 입력 특성과 기울기를 결합하고, Sigmoid 함수를 통해 확률을 얻은 다음, 그 확률을 기반으로 분류 결정을 내리는 방식으로 동작합니다. 이 과정을 통해 새로운 데이터에 대한 분류 문제를 해결할 수 있습니다.

실습 예제

Python을 사용하여 간단한 로지스틱 회귀 모델을 학습시켜 봅시다. scikit-learn 라이브러리를 사용하겠습니다.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import datasets

# 데이터셋 로드 (붓꽃 데이터셋)
iris = datasets.load_iris()
X = iris.data
y = (iris.target == 2).astype(int)  # Virginica 종만 Positive로 설정

# 데이터를 훈련 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 로지스틱 회귀 모델 생성
model = LogisticRegression()

# 모델 학습
model.fit(X_train, y_train)

# 테스트 세트에 대한 정확도
accuracy = model.score(X_test, y_test)
print(f'Accuracy: {accuracy}')
Accuracy: 1.0

결론

로지스틱 회귀는 기계 학습에서 매우 기본적이면서도 효과적인 분류 알고리즘입니다. 이진 분류 문제를 해결하는 데 유용하며, Sigmoid 함수를 기반으로 확률을 모델링합니다.

Comments