로지스틱 회귀 (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
반응형
'Data Analysis & ML > Machine Learning' 카테고리의 다른 글
[Machine Learning][머신러닝] 대출위험도 예측모델링(데이터전처리) (2) | 2020.09.08 |
---|---|
[Machine Learning][머신러닝] 군집(Clustering) / K-Means Clustering (0) | 2020.09.07 |
[Machine Learning][머신러닝] 회귀모델의 평가지표 (0) | 2020.09.04 |
[Machine Learning][머신러닝][앙상블][부스팅] GradientBoosting (0) | 2020.09.03 |
[Machine Learning][머신러닝] 최적화 / 경사하강법 (0) | 2020.09.03 |