ㅅㅇ
머신러닝 _ 15_로지스틱 회귀 본문
머신러닝 _ 15_로지스틱 회귀
1. 로지스틱 회귀 (LogisticRegression)
- ''' Sample이 특정 클래스에 속할 확률을 추정 ''' 하는 모델이다.
- 여기서 설명하는 모델은 이항 로지스틱회귀로
선형회귀 알고리즘을 이용한 이진 분류 모델이다. ( ** 다항 로지스틱 회귀, 순서형 로지스틱 회귀)
= > 데이터가 어떤 범주에 속할 확률을 0 에서 1 사이의 값으로 예측하고
그 확률에 따라
가능성이 더 높은 범주 ( 사건이 일어나는지 (1) , 일어나지 않는지 (0) ) 에 속하는 것으로
분류 해주는 지도 학습 알고리즘 이다.
- 로지스틱 회귀는 선형회귀 기반의 알고리즘임으로
모델링을 위해 데이터 셋들을 선형 회귀 와 같이 전처리 해주어야 한다.
- 로지스틱 회귀는 회귀문제로만 쓰이는 선형 회귀와 달리,
입력에 따라 해당 데이터의 결과가 특정 범주형 데이터로 나뉘는 모델 이기 때문에 분류 문제에서 사용 가능하다.
2. 로지스틱에서의 함수 ( 시그모이드 함수 )
- 로지스틱 회귀 모델에서는 확률을 0 에서 1 사이로 S 자 커브 모양이어야 하는데,
이를 가능하게 해주는 것이 시그모이드 함수 이다.
- S 자 형태의 결과를 내는 시그모이드 함수(sigmoid function)
그래프를 보면,
1) 시그모이드 함수의 그래프는 S 자 모양이 그려지며, 확률로서 0과 1사이의 실수를 반환 할 수 있다.
2) x 에 0 을 대입하면 정확히 0.5 라는 결과가 계산 된다.
3) 0.5로 나눠 이진 분류 함수로 나타내면, 샘플 x가 양성에 속할 확률 을 나타낼 수 있기에 로지스틱 회귀에서 쓰인다.
- x > 0 이면 y 는 0.5 를 기준으로 사건이 발생하는 1을 뜻하고,
- x < 0 이면 y 는 0.5 를 기준으로 사건이 발생하지 않는 0 을 뜻한다.
- 그래프를 직선으로 표현하는 것 대신, 완만한 S자형 곡선으로 나타낼 수 있다면 위와 같은 상황을 방지할 수 있기 때문이
기존의 선형회귀가 아닌 분류 문제에서 보다 유용하게 사용할 수 있도록 로지스틱 회귀모델에 시그모이드 함수를 적용하게 된 것이다.
3. 확률 추정
- 선형회귀 처럼 입력 특성(Feature)에 가중치 합을 계산한 값을
로지스틱 함수에 대입하여 확률을 계산한다.
4. LogisticRegression의 손실 함수(Loss Function)
1) Loss Function
- 모델이 예측한 값과 정답간의 차이(오차, loss)를 구하는 함수.
- 모델의 파라미터를 최적화할 때 loss를 최소화하는 것을 목적으로 구하는 함수.
로지스틱 회귀에서의 데이터의 결과는 0 또는 1로, 연속 값을 가지는 선형회귀 와는 다른 손실함수이다.
= > 얼마만큼의 오차로 맞췄는지 확률적은 오차를 계산해주는 함수.
= > 시그모이드 함수에 선형 회귀 함수 Wx + b 를 대입한다.
- 로지스틱 회귀의 최적화 문제에서도
오차를 최소화하는 w, b 를 찾는데, 이때 경사하강법을 쓴다.
- 이때, 확률의 값은 0 과 1 사이의 값으로 경사하강법을 쓰기에는 너무 작은 수 단위 이다.
이를 위해 아래의 두가지 방법으로 새로운 손실 함수를 만들어 준다.
2) Cross Entropy(로그손실-log loss)
- 모델이 예측한 정답의 확률(0 ~ 1)에 대해 log를 취해 손실 값을 구한다.
- 확률이 틀리면 틀릴 수록 손실값을 크게 만들기 위해서 log를 취한다.
- 예측 값이 여러개의 항목으로 이뤄져 있는 다중 분류 일 때 사용
3) Binary Cross Entropy
- Logistic 함수를 이용한 추론 결과에 대한 cross entropy 계산
== > '이 손실 함수에서 경사하강법을 이용해 최소값을 갖는 w와 b 를 찾는 것이 로지스틱 회귀의 최적화' 이다.
- Logistic함수은 positive(1)의 확률만 추출하므로 정답이 0일때, 1일때 계산하는 것이 다르다.
그것을 하나의 공식으로 정의한 것이 binary cross entropy이다.
- 이진분류에서 사용 (멀티 이진 분류도 가능)
# 참고. 함수 y = - np.log(X)
5. 로지스틱 회귀의 최적화
- 손실을 가장 적게하는 W(가중치)를 찾는 것
- 로그 손실함수는 loss의 최소값으로 하는 parameter 찾는 정규방적식이 없기 때문에
LogisticRegression은 경사하강법을 이용해 최적화를 진행한다.
- Binary Cross Entropy 그 손실을 W 로 미분하면 다음과 같다.
- 아래 도함수로 기울기 gradient를 구해 기울기가 0이 될 때 까지 W(가중치)들을 update한다.
6. LogisticRegression 주요 하이퍼파라미터
1) penalty: 과적합을 줄이기 위한 규제방식. 모델의 복잡성.
- l1 : lasso
- l2 : ridge (기본값)
- elasticnet
- none 규제 안 함
2) C: 규제강도 (기본값 1)
- 작을 수록 규제가 강하다. cf) 리쏘릿지랑 반대. 주의.
3) max_iter : 경사하강법 반복횟수 (기본값 100)
4) 로지스틱회귀에선 학습률은 고정. 우리가 조정할 수 없다.
7. 로지스틱 회귀 기본 예제
# from sklearn.datasets import load_breast_cancer 예제 이용
1) 데이터 로드, 전처리
- 데이터 전처리 : LogisticRegression은 선형회귀 기반의 알고리즘이므로
연속형 Feature는 Feature scaling, 범주형 Feature는 One hot encoding 처리를 한다.
- 현 데이터는 모두 연속형 데이터 이므로 Feature sacling - standardscaling 을 해준다.
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler # LogistricRegression : 선형회귀기반 = > Feature scaling 필요
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score
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, random_state=1)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
2) 분류 문제 평가 함수 - 정확도, recall, precision, f1
def print_metrics(y, y_pred, title=None):
if title:
print(title)
print(f'정확도: {accuracy_score(y, y_pred)}, \
재현율(recall): {recall_score(y, y_pred)}, \
정밀도(precision): {precision_score(y, y_pred)}, \
F1점수: {f1_score(y, y_pred)}')
3) 모델 생성, 학습, 추론, 평가
lr = LogisticRegression(random_state=0)
lr.fit(X_train_scaled, y_train)
pred_train = lr.predict(X_train_scaled)
pred_test = lr.predict(X_test_scaled)
print_metrics(y_train, pred_train)
print_metrics(y_test, pred_test)
-train 셋 평가
정확도: 0.9906103286384976, 재현율(recall): 0.9962546816479401, 정밀도(precision): 0.9888475836431226, F1점수: 0.9925373134328358
- test 셋 평가
정확도: 0.965034965034965, 재현율(recall): 0.9777777777777777, 정밀도(precision): 0.967032967032967, F1점수: 0.9723756906077348
7. 로지스틱 회귀 예제 - GridSearchCV를 이용해 하이퍼파라미터 C 탐색
from sklearn.model_selection import GridSearchCV
# GridSearchCV
param = {
'C':[0.001, 0.01, 0.1, 1, 10 , 100]
}
gs = GridSearchCV(LogisticRegression(random_state=0),
param,
cv=5,
scoring='accuracy',
n_jobs=-1)
gs.fit(X_train_scaled, y_train)
- 최적의 하이퍼 파라미터 C 값
gs.best_params_
{'C': 1}
- 최적의 하이퍼 파라미터를 적용한 모델에서의 test 셋 예측 정확도 (최고 성능)
best_model = gs.best_estimator_
pred_test = best_model.predict(X_test_scaled)
accuracy_score(y_test, pred_test)
0.965034965034965
- gs. cv_results - 데이터 프레임으로 확인
import pandas as pd
pd.DataFrame(gs.cv_results_).sort_values('rank_test_score').head()
'AI_STUDY > 머신러닝' 카테고리의 다른 글
머신러닝 _ 14_최적화 _ 경사하강법 (0) | 2022.07.14 |
---|---|
머신러닝 _ 13_02 선형회귀 _ 다항회귀 (0) | 2022.07.14 |
머신러닝 _ 13_01 선형회귀 모델 개요 (0) | 2022.07.14 |
머신러닝 _ 12_회귀모델개요_평가지표 (0) | 2022.07.14 |
머신러닝 _ 08_지도학습_SVM (0) | 2022.07.14 |