👩‍💻LEARN : ML&Data/Lecture

[Supervised Machine Learning: Regression and Classification] #6. Classification with logistic regression & #7. Cost function for logistic regression

쟈니유 2023. 3. 26. 15:05
728x90

드디어 마지막 3주차..!


#6. Classification with logistic regression 

 

Logistic regression 

Binary classification : 2개의 class(0,1)만 output으로 나오는 것 

 

- 기존 선형회귀로는 binary classification을 수행하기 어려움 

- 이에 sigmoid(Logistic) 함수를 활용하여 1과 0 을 구분(threshold = .5 기준)

 

Logistic regression

- z = w*x + b 라고 가정

- z를 시그모이드 함수의 변수로 설정 

- 해석 : 시그모이드 함수의 값이 0.7일 경우 → 1일 확률이 70%이다 

- 표기법 (베이지안 언제 공부하지..)

 

Decision boundary 

: 결과값을 0으로 판단할 지 1로 판단할 지 나누는 기준선 (z=0이 되는 경우의 선) 

 

#7. Cost function for logistic regression

 

Cost function for logistic regression 

이러한 예시 아래에서 어떻게 cost를 최소화하는 파라미터들을 찾을 수 있을까

- 선형회귀에서는 Squared error cost를 사용했음. 하지만 로지스틱 회귀에선 이를 동일하게 사용했다간 경사하강법 수행 시 너무 많은 global minima들을 만나서 성능이 나오지 않을 수 있음 → 로지스틱 회귀에서 Cost를 convex(포물선)형태로 만들어주는 다른 수식을 취해야 함 

 

 

- 여기서 Cost function은 오차들의 평균이었는데, 우선 이 오차 함수(Loss)에 보다 집중해서 살펴보면, 

실제값 y가 1일때의 오차는 -log(f(x)) 

  • 예측값 f(x)가 1에 가까울수록 오차가 0에 가까워지고 예측값이 0에 가까워질수록 오차가 무한대에 가까워지는 것을 확인 

(x axis : f(x), y axis : loss) 

 

 

 

 

실제값 y가 0일때의 오차는 -log(1-f(x)) 

  • 예측값이 0에 가까워질수록 오차 또한 0에 수렴하며 1에 가까워질수록 무한대로 발산함 

 

 

 

 

그러므로 로지스틱 회귀에서는 Sqaured error function이 아니라 loss의 평균을 cost function으로 가져야 함 

 

 

Simplified Cost Function for Logistic Regression 

위의 내용을 반영한 loss 함수는 이와 같다

- y가 1일때 y가 0 일때의 수식을 없애고 y가 0일때 y가 1일때의 수식을 없게 해줌. 심지어 이거 그래프로 하면 convex됨. 왜그런지는...통계학적인 웅앵 이니까 여기선 일단 넘아가도 됨다! 

 

- 이러한 loss의 평균이 cost function이므로 이를 평균취해주면 아래와 같음 

티스토리 수식 제발 편하게 쓰게 해주세요...ㅠㅠ...latex 지원 해주세요...

#로지스틱회귀에서 Cost 계산하긔 

def compute_cost_logistic(X, y, w, b):
    """
    Computes cost

    Args:
      X (ndarray (m,n)): Data, m examples with n features
      y (ndarray (m,)) : target values
      w (ndarray (n,)) : model parameters  
      b (scalar)       : model parameter
      
    Returns:
      cost (scalar): cost
    """

    m = X.shape[0]
    cost = 0.0
    for i in range(m):
        z_i = np.dot(X[i],w) + b
        f_wb_i = sigmoid(z_i)
        cost +=  -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i)
             
    cost = cost / m
    return cost