본문으로 바로가기

Logistic regression

category AI/Machine Learning 2021. 3. 2. 11:29

Logistic regression

1) 개요

    - 새로운 관측치를 기존 범주 중 하나로 예측 (범주예측, 분류)

 

2) 이론 배경

    - X값이 주어졌을 때 출력변수 Y가 1의 값을 가질 확률

$$Y_{i} = \beta_{0} + \beta_{1}X_{i} + \varepsilon_{i}\;\; Y_{i} = 0\:or\:1$$

$$Assume\: E(\varepsilon_{i}) = 0,\;\;\; E(Y_{i}) = \beta_{0} + \beta_{1}X_{i}$$

$$P(Y_{i} = 1) = \pi_{i}\;,\;\;P(Y_{i} = 0) = 1- \pi_{i}$$

$$E(Y_{i}) = 1\cdot \pi_{i} + 0\cdot (1- \pi_{i})=\pi_{i} $$

$$E(Y_{i}) = \beta_{0} + \beta_{1}X_{i}=\pi_{i}$$

 

3) Logistic function (sigmoid function)

    - Output range : 0 ~ 1 (pdf 요건을 충족)

    - 인풋값에 대해 단조증가(단조감소)함수

    - 미분결과를 아웃풋의 함수로 표현 가능 (경사하강법에 매우 유용)

$$\frac{d\phi(z)}{dz} = \frac{1}{1+e^{-z}}(1-\frac{1}{1+e^{-z}}) = \phi(z)(1-\phi(z))$$

    ex) input X가 1개인 로지스틱 모델 예 (관측치 x가 범주 1에 속할 확률)

$$E(y) = \pi(X=x)=\frac{1}{1+e^{-(\beta_{0}+\beta_{1}x)}}$$

 

Odds (승산)

1) 개요

    - 성공 확률을 p로 정의할 때, 실패(범주 0에 속할 확률) 대비 성공(범주 1에 속할 확률) 비율

$$Odd = \frac{p}{1-p}$$

$$p=1 \;\Rightarrow \; odd=\infty$$

$$p=0 \;\Rightarrow \; odd=0$$

 

2) Logit Transform

    - Odd에 log를 취하면 선형식이 나와서 직관적 해석이 가능

$$\pi(X=x)=\frac{1}{1+e^{-(\beta_{0} + \beta_{1}x)}}$$

$$Odds=\frac{\pi(X=x)}{1-\pi(X=x)}$$

$$log(Odds)=log(\frac{\pi(X=x)}{1-\pi(X=x)})=\beta_{0}+\beta_{1}x$$

 

Logistic regression의 parameter 추정

1) Maximum likelihood estimation (최대 우도 추정법)

$$lnL=\sum_{i}y_{i}(\beta_{0} + \beta_{1}X_{1}+\cdots+\beta_{p}X_{p})+\sum_{i}ln(1+e^{\beta_{0} + \beta_{1}X_{1}+\cdots+\beta_{p}X_{p}})$$

    - 위의 log likelihood function이 최대가 되는 파라미터 beta 결정

    - log likelihood function은 파라미터 beta에 대해 비선형이므로 선형회귀 모델과 같이 명시적인 해가 없음

    - 수치 최적화 알고리즘을 이용하여 해를 구함

 

코드 예시

class LogisticRegressionGD(object):
    '''
    w_ : 1d-array, 학습된 가중치
    cost_ : 에포크마다 누적된 비용 함수 값
    '''
    def __init__(self, eta = 0.05, n_iter = 100, random_state = 1):
        self.eta = eta
        self.n_iter = n_iter
        self.random_state = random_state
        
    def fit(self, X, y):
        rgen = np.random.RandomState(self.random_state)
        self.w_ = rgen.normal(loc = 0.0, scale = 0.01,
                              size = 1 + X.shape[1])

        self.cost_ = []
        
        for i in range(self.n_iter):
            net_input = self.net_input(X)
            output = self.activation(net_input)
            errors = y - output
            self.w_[1:] += self.eta * X.T.dot(errors)
            self.w_[0] += self.eta * errors.sum()
    
            
            cost = (-y.dot(np.log(output)) -
                   ((1 - y).dot(np.log(1 - output))))
            self.cost_.append(cost)
        return self
    
    def net_input(self, X):
        return np.dot(X, self.w_[1:]) + self.w_[0]
    
    def activation(self, z):
        return 1. / (1. + np.exp(-np.clip(z, -250, 250)))
    
    def predict(self, X):
        return np.where(self.net_input(X) >= 0.0, 1, 0)
        
# --------------------------------------------------
from sklearn.linear_model import LogisticRegression

lr = LogisticRegression(solver = 'liblinear', multi_class = 'auto',
                        C = 100.0, random_state = 1)

lr.fit(X_train_std, y_train)

참고

머신러닝 교과서 (길벗)

고려대 김성범 교수님 유튜브 www.youtube.com/channel/UCueLU1pCvFlM8Y8sth7a6RQ/videos

'AI > Machine Learning' 카테고리의 다른 글

Clustering Analysis  (0) 2021.02.28
Linear regression  (0) 2021.02.26
Ensemble (Voting, Bagging, Boosting)  (0) 2021.02.24
Model evaluation metrics  (0) 2021.02.23
Validation (Cross-val, learning-curve, GridSearch)  (0) 2021.02.23