Data Analysis & ML/Machine Learning

[Machine Learning][머신러닝] 로지스틱 회귀(Logistic Regression)

YSY^ 2020. 9. 7. 18:46

로지스틱 회귀 (LogisticRegression)

  • 선형회귀 알고리즘을 이용한 이진 분류 모델
  • Sample이 특정 클래스에 속할 확률을 추정한다.

확률 추정

  • 선형회귀 처럼 입력 특성(Feature)에 가중치 합을 계산한 값을 로지스틱 함수를 적용해 확률을 계산한다.

import matplotlib.pyplot as plt

xx = np.linspace(-10, 10, 100)
sig = 1 / (1 + np.exp(-xx))

plt.figure(figsize=(15, 5))

plt.plot(xx,xx, color='g', label='linear')
plt.plot(xx, sig, color='b', linewidth=2, label="logistic")

plt.plot([-10, 10], [0, 0], color='k', linestyle='-')
plt.plot([-10, 10], [0.5, 0.5], color='r', linestyle=':', label='y=0.5')

plt.xlabel("x")
plt.legend(bbox_to_anchor=(1,1), fontsize=20)
plt.xlim(-10, 10)
plt.ylim(-0.1, 1.1)
plt.grid(True)
plt.show()

 

손실 함수(Loss Function)

최적화

  • 위 손실을 가장 적게하는 W(가중치)를 찾는다.
  • 로그 손실함수는 최소값을 찾는 정규방적식이 없기 때문에 LogisticRegression은 경사하강법을 이용해 최적화를 진행한다.
  • 로그 손실을 W로 미분하면 다음과 같다.
    • 아래 도함수로 기울기를 구해 기울기가 0이 될 때 까지 W(가중치)들을 update한다.

LogisticRegression 주요 하이퍼파라미터

  • penalty: 과적합을 줄이기 위한 규제방식
    • 'l1', 'l2'(기본값), 'elasticnet', 'none'
  • C: 규제강도(기본값 1) - 작을 수록 규제가 강하다.
  • max_iter(기본값 100) : 경사하강법 반복횟수

위스콘시 데이터 로지스틱 회귀모델링

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
X = cancer.data
y = cancer.target

X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)

# Logistic 회귀 => 스케일링
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 성능 지표 확인 함수
from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score
def print_metrics(y, pred_y, title=None):
    acc = accuracy_score(y, pred_y)
    f1 = f1_score(y, pred_y)
    recall = recall_score(y, pred_y)
    precision = precision_score(y, pred_y)
    print(title)
    print(f'정확도:{acc}, 재현율:{recall}, 정밀도:{precision}, f1:{f1}')
from sklearn.linear_model import LogisticRegression
# lr = LogisticRegression()
lr = LogisticRegression(C=0.1, max_iter=100) # 1->0.1 => 복잡한 모델
lr.fit(X_train_scaled, y_train)
#==> LogisticRegression(C=0.1, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)

pred_train = lr.predict(X_train_scaled)
pred_test = lr.predict(X_test_scaled)

print_metrics(y_train, pred_train)
# 정확도:0.9859154929577465, 재현율:0.9962546816479401, 정밀도:0.981549815498155, f1:0.9888475836431226

print_metrics(y_test, pred_test)
# 정확도:0.965034965034965, 재현율:1.0, 정밀도:0.9473684210526315, f1:0.972972972972973

 

728x90
반응형