들어가며

지난 시간에는 선형회귀에 이어 다항회귀에 대해서 알아보았습니다. 이번에는 회귀를 통해서 분류(Clustering)을 진행할 수 있는 알고리즘인 Logistic Regression 에 대해서 알아보도록 하겠습니다. 

 

목차

1. Logistic Regression

    1.1 확률추정

    1.2 훈련과 비용함수

    1.3 결정경계

 

1. Logistic Regression

로지스틱 회귀란 기본적으로 회귀 알고리즘을 사용하지만 마지막 결과값에서 로지스틱 함수를 통해서 확률을 계산하고 이를 토대로 분류를 진행하는 알고리즘입니다.

출처 : https://dojinkimm.github.io/ml/2019/11/10/handson-ch4.html

위 수식을 보면 파라미터와 샘플의 곱까지는 기존의 회귀와 동일하지만 이를 감싸는 새로운 함수를 볼 수 있습니다. 이것이 바로 로지스틱 함수입니다.

로지스틱 함수는 변수를 입력할 경우 이를 0~1의 범위로 변환해주는 함수 입니다. 즉 이 함수를 통해서 확률값을 계산하고 마지막으로 분류(어떤 클래스에 대한 확률이 가장 높은지 계산)할 수 있습니다.

위 계산식 처럼 마지막 결과값이 50%이상인경우는 1 50%미만인 경우는 0으로 출력하여 분류를 할 수 있습니다.

1.1 확률추정

확률계산하는 방법을 알았으니 이제 파라미터가 학습을 하기 위해서는 비용함수를 구해야합니다. 

하나의 훈련 샘플에 대한 비용함수는 클래스가 0인 경우 결괏값이 1로 갈 수록 증가해야하며 1인 경우는 결괏값이 0으로 갈수록 증가해야합니다. 따라서 아래의 공식이 적합합니다.

1.2 훈련과 비용함수

하나의 샘플에 대한 비용함수를 알았으니 전체 비용함수는 모든 샘플에 대한 비용함수의 평균을 구하면 됩니다.

Logistic 비용함수(log loss)는 선형 회귀와는 다르게 정규방정식이 존재하지 않습니다. 그러나 log loss는 볼록함수이기 때문에 경사항강법으로 global minimum에 수렴하는 것이 보장됩니다.

 

꽃잎에 대한 데이터가 담긴 Iris데이터를 예로 들어 구현해보겠습니다.

# iris데이터를 불러옵니다.
from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
list(iris.keys())

# 꽃잎의 너비와 샘플의 클래스가 Iris-Vriginica인 경우의 인덱스를 1로 아니면 0으로하는 리스트를 생성
X = iris["data"][:, 3:]  # petal width
y = (iris["target"] == 2).astype(np.int)  # 1 if Iris-Virginica, else 0

# 선형 알고리즘을 사용하기 위해 solver="liblinear" 호출후 데이터를 학습시킵니다.
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression(solver="liblinear", random_state=42)
log_reg.fit(X, y)

# 그래프로 출력해봅니다.
X_new = np.linspace(0, 3, 1000).reshape(-1, 1)
y_proba = log_reg.predict_proba(X_new)

plt.plot(X_new, y_proba[:, 1], "g-", linewidth=2, label="Iris-Virginica")
plt.plot(X_new, y_proba[:, 0], "b--", linewidth=2, label="Not Iris-Virginica")

코드를 통해서 꽃잎의 넓이를 통해서 종류를 예측하는 모델을 생성했습니다.

1.3 결정경계

위 그래프는 이전 그래프에서 내용을 조금 추가한 것입니다. 여기서 중요한 점은 두 곡선이 교차하는 결정경계입니다. 훈련된 모델을 Petal width가 1.6 근처인 지점에서 결과값이 바뀌는 것을 알 수 있습니다.

+ Recent posts