본문 바로가기
Bigdata

머신러닝 - 로지스틱 회귀 분류 알고리즘 이해, 시그모이드 함수

by 올엠 2024. 12. 28.
반응형

로지스틱 회귀는 단순하면서도 강력한 분류 알고리즘으로, 다양한 분야에서 널리 사용되고 있다.

로지스틱 회귀는 종속 변수가 두 개의 범주(예: 스팸/비스팸, 질병 유무 등)로 나뉘는 이진 분류 문제에 많이 사용된다.

이유는 추후 그래프를 보면 이해하겠지만, 0을 기준으로 양수와  음수로 값을 생성하는 것이 로지스틱 회귀 알고리즘의 기본 이해라고 할 수 있다.

 

여기에서 중요한 함수가 바로 시그모이드 함수 (Sigmoid Function) 이다.

시그모이드 함수(Sigmoid Function)는 로지스틱 회귀에서 사용되는 활성화 함수로, 입력 값을 0과 1 사이의 값으로 변환합니다. 시그모이드 함수의 수식은 다음과 같다

[ \sigma(x) = \frac{1}{1 + e^{-x}} ]

여기서 ( e )는 자연 로그의 밑(약 2.718) 이다.

시그모이드 함수는 기본적인 수식 같은 것으로 딥러닝 등에서도 많이 사용되기 때문에, 알아두면 유용하다.

 

그럼 로지스틱 회귀 알고리즘을 실제 코드로 사용해보도록 하자.

여기에서는 사이킷런에서 기본적으로 제공하는 아이리스 데이터셋을 이용할 것이다. 이는 3개의 클래스(품종)로 나뉘며, 각 클래스는 50개의 샘플을 포함란다. 각 샘플은 4개의 특성(꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비)을 가지고 있다.

가장 먼저 데이터를 로드하도록 하자.

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

from sklearn import datasets

# Iris 데이터셋 로드
iris = datasets.load_iris()
X = iris.data
y = iris.target

 

이후 데이터에서 로지스틱 회귀 에 맞도록 0과 1만 사용하도록 조절한후 테스터셋을 학습한다.

# 이진 분류를 위해 클래스 0과 1만 사용
X = X[y != 2]
y = y[y != 2]

# 데이터셋을 학습용과 테스트용으로 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 로지스틱 회귀 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)

 

학습한 데이터를 기반으로 예측 결과가 맞는지 확인하는 작업도 진행하도록 하자. 1에 가까울 수록 좋은 성능이라고 할 수 있다.

# 테스트 데이터로 예측 수행
y_pred = model.predict(X_test)

# 정확도 계산
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy * 100:.2f}%')

# 예측 확률 출력
y_prob = model.predict_proba(X_test)[:, 1]  # 클래스 1에 대한 확률만 사용
print('Predicted probabilities:\n', y_prob)

 

이를 잘 예측 하였는지 테스트 데이터와 함께 결과를 출력하면 된다.

# 시그모이드 함수 정의
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 예측 그래프 출력
plt.figure(figsize=(12, 6))
plt.plot(y_prob, 'o', markersize=10, label='Predicted Probabilities')
plt.plot(y_test, 'x', markersize=10, label='Actual Values')
plt.xticks(range(len(y_test)), y_test)
plt.title('Predicted Probabilities vs Actual Values')
plt.xlabel('Sample Index')
plt.ylabel('Probability')
plt.legend()
plt.grid()

# 시그모이드 그래프 추가
x = np.linspace(-10, 10, 100)
y_sigmoid = sigmoid(x)
plt.plot(x, y_sigmoid, label='Sigmoid Function', color='red')

plt.legend()
plt.show()

 

아래와 같이 실제 값은 X, 예측 값은 O 를 이용해서 쉽게 예측 결과가 잘 맞는지 확인 할 수 있다.

반응형