[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/Data & AI

[scikit-learn 라이브러리] LogisticRegression (로지스틱 회귀)

inu 2020. 7. 29. 22:12
반응형

기본 이론

  • 간단하면서도 파라미터의 수가 적어서 빠른 예측이 가능하다. 따라서 다른 알고리즘과의 비교 기준점으로 사용되기도 한다.
  • 주로 $p = {1 \over 1+e^{−z}}$ 형태의 시그모이드 함수를 사용한다.
  • z는 가중치 계산(선형)의 결과이다.
  • 시그모이드 함수는 0~1까지의 결과만을 가지기 때문에 임의의 수에 대한 확률값을 도출해내기 적당하다.
  • 아웃풋을 확률값으로 만들어서 이를 기반으로 데이터를 그룹으로 나눌 수 있다.

시그모이드 함수

# 가중치 이동
# W(a)값이 작을때 -> 클 때
def logreg(z):
    return 1 / (1 + np.exp(-z))

W_list = [0.3, 0.5, 1]
b_list = [0]
xx = np.linspace(-10, 10, 100)
for W in W_list:
    for b in b_list:
        yy = logreg( W * xx + b )
        plt.plot(xx, yy, label = W)
plt.legend()

  • 아웃풋의 가중치가 커질 수록 시그모이드 함수는 급격해진다.
# 절편이동
# b값이 작을때 -> 클 때
def logreg(z):
    return 1 / (1 + np.exp(-z))

W_list = [0.8]
b_list = [-2, 0, 2]
xx = np.linspace(-10, 10, 100)
for W in W_list:
    for b in b_list:
        yy = logreg( W * xx + b )
        plt.plot(xx, yy)

  • 편향을 시그모이드 함수를 평행이동 시켜준다.
  • 이렇듯 가중치와 편향을 조절하면 시그모이드 함수의 결과도 달라진다.
  • 가중치와 편향을 학습시키면 시그모이드 함수 결과도 적절하도록 조절할 수 있다.

로지스틱 회귀 모델 생성 함수

LogisticRegression(penalty, dual, tol, C, fit_intercept, intercept_scaling, class_weight, random_state, 
solver, max_iter, multi_class, verbose, warm_start, n_jobs, l1_ratio)
  • penalty : 규제에 사용 된 기준을 지정 (l1, l2, elasticnet, none) – default : l2
  • dual : 이중 또는 초기 공식
  • tol : 정밀도
  • C : 규제 강도
  • fit_intercept : 모형에 상수항 (절편)이 있는가 없는가를 결정하는 인수 (default : True)
  • intercept_scaling : 정규화 효과 정도
  • class_weight : 클래스의 가중치
  • random_state : 난수 seed 설정
  • solver : 최적화 문제에 사용하는 알고리즘
  • max_iter : 계산에 사용할 작업 수
  • multi_class : 다중 분류 시에 (ovr, multinomial, auto)로 설정
  • verbose : 동작 과정에 대한 출력 메시지
  • warm_start : 이전 모델을 초기화로 적합하게 사용할 것인지 여부
  • n_jobs : 병렬 처리 할 때 사용되는 CPU 코어 수
  • l1_ratio : L1 규제의 비율(Elastic-Net 믹싱 파라미터 경우에만 사용)

사용 예제 (by 유방암 데이터)

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=66)
  • 데이터를 불러오고 학습 데이터와 테스트 데이터로 분류한다.
from sklearn.linear_model import LogisticRegression

model = LogisticRegression(C=1, max_iter=10000)
model.fit(X_train, y_train)

model.score(X_train, y_train), model.score(X_test, y_test)
==결과==
(0.9577464788732394, 0.965034965034965)
  • 모델을 생성한다. 규제정도가 되는 C값은 1로 사용하고 규제방법은 default인 l2를 사용한다.
  • max_iter는 계산에 사용할 작업 수인데, 오류가 날 경우 작성해준다.
  • 학습 데이터와 테스트 데이터에 대해 각각 score를 체크한 결과 테스트 데이터에 대한 정확도가 학습 데이터에 대한 정확도가 높다. 이럴 땐 모델제작이 잘못되지 않았나 의심해보아야한다. C값을 조절하여 모델을 재생성한다.
from sklearn.linear_model import LogisticRegression

model = LogisticRegression(C=10, max_iter=10000)
model.fit(X_train, y_train)

model.score(X_train, y_train), model.score(X_test, y_test)
==결과==
(0.9671361502347418, 0.958041958041958)
  • 학습 데이터에 대한 정확도는 올라가고, 테스트 데이터에 대한 정확도는 떨어졌다.
  • 방금 전 모델보단 유효한 결과가 나올 것이다.
import matplotlib.pyplot as plt

plt.plot(model.coef_.T, 'o')
plt.xticks(range(cancer.data.shape[1]), cancer.feature_names, rotation=90)
xlim = plt.xlim()
plt.hlines(0, xlim[0], xlim[1])
plt.ylim(-5,5)

  • 모델의 각 특성치에 대한 가중치를 그래프로 표현해보았다.
  • 규제를 10로 두었기 때문에 전반적으로 조금만 가중치가 규제되었음을 알 수 있다.
  • 기존의 선형회귀 모델에서 적용했던 것과는 반대로 (alpha값과는 반대로) C값은 커질 수록 그 규제 정도가 약해진다.
  • xsticks메소드는 각 데이터의 x에 이름을 붙여준다. rotation으로 출력각도를 조절한다.
  • hlines메소드는 주어진 범위내에 직선을 그어준다.
반응형