ㅅㅇ

머신러닝 _ 15_로지스틱 회귀 본문

AI_STUDY/머신러닝

머신러닝 _ 15_로지스틱 회귀

SO__OS 2022. 7. 14. 19:15
플레이데이터 빅데이터캠프 공부 내용 _ 7/8

머신러닝 _ 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()