📌 로지스틱회귀
: 이진 분류 문제에 사용되는 회귀 분석 기법
이름에 회귀(Regression)가 들어가지만, 실제로는 분류(Classification)알고리즘 中 하나
선형회귀와 유사하게 입력 특성과 가중치의 선형 결합을 계산
이때, 로지스틱 회귀는 이 선형 결합을 활성화 함수(시그모이드 함수, 소프트맥스 함수)에 넣어 출력값을 0과 1 사이의 값으로 변환
📌 시그모이드 함수
: 실수 값(z)을 받아 0과 1 사이의 값으로 변환하는 비선형 활성화 함수
→ 이진 분류에 사용
『
z = wx + b로 가정할 때,
w값이 커질수록 명확히 분류할 수 있음
』
분류 성능 강화를 위해 회귀 결과가 아닌, 활성화함수 이후 결과의 성능 판단 척도 필요
➡️ Binary Cross-Entropy Loss Function : 이진 분류 문제에서 사용되는 손실함수
엔트로피의 아래와 같은 성질을 활용하여 손실함수 작성
- 실제 클래스가 1인 경우 (y=1): 손실은 모델이 1을 예측한 확률 (p)의 자연로그로, 모델이 1을 예측할 수록 손실은 0에 수렴
- 실제 클래스가 0인 경우 (y=0): 손실은 모델이 0을 예측한 확률 (1−p)의 자연로그로, 모델이 0을 예측할 수록 손실은 0에 수렴
📌 소프트맥스 함수
: 각 클래스에 속할 확률을 나타내기 위해 사용되는 활성화함수
→ 다중 클래스 분류에 사용
입력값을 0과 1 사이의 확률 값으로 변환하여 각 클래스에 속할 확률을 나타냄
모든 클래스의 출력의 합이 1이 되도록 만들어주어 모델이 너무 확신을 갖거나 확신이 부족한 상태를 방지하고, 모델이 일반적인 특징을 학습하도록 도움
마찬가지로 분류 성능 강화를 위해 회귀 결과가 아닌, 활성화함수 이후 결과의 성능 판단 척도 필요
➡️ Cross-Entropy Loss Function : 분류 문제에서 사용되는 손실함수
(기본 이론은 위와 동일하며, One-Hot Encoding된 특정 라벨에 대한 y에서만 계산)
- 모델의 예측이 실제 클래스에 가까울수록 손실이 작아지고, 잘못된 예측일 경우 손실이 크게 증가
『
“Entropy”
: 무질서도 혹은 불확실성을 나타내는 척도
데이터가 균일하게 분포되어 있을 때, 각 사건이 발생할 확률이 비슷하다면 높은 엔트로피 (가능한 결과들이 고르게 분포되어 있어 예측하기 어려운 상태)
특정 사건이 다른 사건들보다 더 자주 발생하는 경우, 낮은 엔트로피 (데이터가 특정한 결과를 많이 가지고 있어 예측하기 쉬운 상태)
』
📌 로지스틱회귀 실습
“키를 바탕으로 어른, 아이를 분류할 수 있는 시그모이드 함수를 그려보자”
위의 Height, Target 데이터프레임을 바탕으로 로지스틱회귀 실습 진행
x : Height / y : Target
⬇️ 로지스틱회귀 실습 코드
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
w = 0
b = 0
epoch = 4000000
lr = 0.005
m = len(x)
for i in range(1, epoch): # epoch만큼 반복
# w와 b에 따른 손실함수 변화량 업데이트
w_diff = np.dot((sigmoid(np.dot(w, x) + b) - y), x) / m
b_diff = np.sum(sigmoid(np.dot(w, x) + b) - y) / m
# 해당 계산을 바탕으로 w, b값 업데이트
w -= lr * w_diff
b -= lr * b_diff
⬇️ 로지스틱회귀 실습 결과 시각화
# 시그모이드 함수 시각화
plt.scatter(x, y) # 입력 데이터 포인트 시각화
plt.plot(np.linspace(min(x), max(x), 400), sigmoid(w * np.linspace(min(x), max(x), 400) + b), color='red', label='Sigmoid Line') # 시그모이드 함수 시각화
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('Logistic Regression')
plt.show()
print("회귀식: y =", round(w, 2), "x +", round(b, 2))