머신러닝/지도 학습

3. Logistic Regression

지연v'_'v 2023. 9. 4. 14:19
  • 선형회귀 방식을 분류에 적용한 알고리즘 → 분류에 사용됨

<아래는 chat gpt 선생이 알려준 LR>

  • Logistic Regression은 선형 회귀와 유사한데, 출력값이 0과 1 사이의 값으로 제한되도록 변형된 모델입니다. 이를 위해 입력 데이터의 **가중합(가중치와 특성값의 곱의 합)**을 시그모이드 함수(sigmoid function)에 적용합니다. 시그모이드 함수는 S자 형태의 곡선으로, 입력값이 큰 음수일 때 0에 가까운 값, 입력값이 큰 양수일 때 1에 가까운 값, 입력값이 0일 때 0.5의 값을 출력합니다.
  • 이렇게 입력 데이터의 가중합을 시그모이드 함수에 적용하면, 모델의 출력값은 0과 1 사이의 값으로 제한됩니다. 이 값은 해당 샘플이 양성 클래스에 속할 확률로 해석할 수 있습니다. 예를 들어, 출력값이 0.7일 경우 해당 샘플이 양성 클래스에 속할 확률이 70%라는 것을 의미합니다. 이렇게 변환된 출력값을 사용해 분류를 수행합니다. 일반적으로 0.5를 기준으로 출력값이 0.5 이상인 경우 양성 클래스에 속한다고 판단하고, 이하인 경우 음성 클래스에 속한다고 판단합니다.
  • 이때 가중치는 주어진 데이터를 가장 잘 설명하는 최적의 값으로 학습됩니다. 이 과정에서 로지스틱 회귀는 **비용 함수(cost function)**를 사용하여 예측값과 실제값 사이의 차이를 최소화하도록 가중치를 조정합니다. 보통 로지스틱 회귀에서는 최적화 알고리즘인 경사 하강법(gradient descent)을 사용하여 비용 함수를 최소화합니다.
  • 비용함수와 경사하강법은 주로 분류 문제에서 사용되는 알고리즘인 로지스틱 회귀에서 사용됩니다. 하지만 선형 회귀에서도 비용함수와 경사하강법을 사용할 수 있습니다. 선형 회귀에서는 보통 평균제곱오차(Mean Squared Error, MSE)를 비용함수로 사용하고, 이를 최소화하는 방향으로 경사하강법을 적용합니다. 따라서 비용함수와 경사하강법은 회귀 문제에서도 중요한 개념입니다.

시그모이드 함수 참고 사이트 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=handuelly&logNo=221824080339 

 

딥러닝 - 활성화 함수(Activation) 종류 및 비교

# 활성화 함수 딥러닝 네트워크에서 노드에 입력된 값들을 비선형 함수에 통과시킨 후 다음 레이어로 전달...

blog.naver.com

 


파라미터

  • penalty: 규제(regularization) 유형을 결정.
    • L1(lasso): 변수 선택. 불필요한 특성 제거.
    • L2(ridge):  중요치 않은 변수들의 가중치 작아지도록.
    • ElasticNet
  • C: 규제 강도를 결정하는 하이퍼파라미터입니다. C 값이 작을수록 규제가 강해지며, C 값이 클수록 규제가 약해집니다. (1/alpha)
  • solver: 최적화 알고리즘을 지정하는 하이퍼파라미터입니다.
    • L1, L2 모두 가능 
      • liblinear : 국소 최적화 이슈, 병렬 최적화 X → L1, L2 모두 가능
      • saga: sag와 유사, L1정규화 가능케 함 → L1, L2 모두 가능
    • L2 만 가능
      • newton-cg: 종 더 정교한 최적화, 대용량의 데이터에선 속도가 많이 느려짐 → L2 만 가능
      • lbfgs: sovler의 기본설정 값, 메모리공간 절약, CPU 코어 수가 많다면 최적화 병렬 수행 → L2 만 가능
      • sag: 경사하강법 기반의 최적화 → L2 만 가능

 

데이터 불러오기

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.datasets import load_breast_cancer

cancer = laod_breast_cancer()

 

데이터 전처리

선형모델을 사용할 때는 표준화(standard scaler)를 진행하는 것이 좋다.

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

scaler = StandardScaler()
data_scaled = scaler.fit_transform(cancer.data) # 전처리

X_train, X_test, y_train, y_test = train_test_split(
					data_scaled, cancer.target, test_size=0.3, random_state=0)
from sklearn.linear_model import LogisticRegression

lr_clf = LogisticRegression() # solver= lbfgs(기본값)
lr_clf.fit(X_train, y_train)
lr_pred = lr_clf.predict(X_test)

 

평가

from sklearn.metrics import accuracy_score, roc_auc_score

print('Accuracy: {:.3f}, ROC_AUC: {:.3f}'.format(accuracy_score(lr_pred,y_test),roc_auc_score(lr_pred, y_test)))


>>>Accuracy: 0.977, ROC_AUC: 0.978

 

 

solver 파라미터의 변화에 따른 성능 측정

solvers = ['lbfgs','liblinear','newton-cg','sag','saga']

for solver in solvers:
		lr_clf = LogisticRegression(solver=solver, max_iter=600)
		lr_clf.fit(X_train, y_train)

		lr_pred = lr_clf.predict(X_test)

		print(solver)
       	 	print('Accuracy: {:.3f}, ROC_AUC: {:.3f}'.format(accuracy_score(lr_pred,y_test),
            						roc_auc_score(lr_pred, y_test)))
         	 print()

>>>>>
lbfgs
Accuracy: 0.977, ROC_AUC: 0.978

liblinear
Accuracy: 0.982, ROC_AUC: 0.983

newton-cg
Accuracy: 0.977, ROC_AUC: 0.978

sag
Accuracy: 0.982, ROC_AUC: 0.983

saga
Accuracy: 0.982, ROC_AUC: 0.983

liblinear, sag, saga 가 좋네.

 

GridSearchCV 로 최적화

from sklearn.model_selection import GridSearchCV

params={'solver':['liblinear', 'lbfgs'],
        'penalty':['l2', 'l1'],
        'C':[0.01, 0.1, 1, 1, 5, 10]}

lr_clf = LogisticRegression()
grid_clf = GridSearchCV(lr_clf, param_grid = params, scoring='accuray',cv=3)

grid_clf.fit(data_scaled, cancer.target)

 

print('''최적 하이퍼 파라미터:{}, 최적 평균 정확도:{:.3f}'''.format(grid_clf.best_params_, 
                                                  grid_clf.best_score_))


>>> 
최적 하이퍼 파라미터:{'C': 0.1, 'penalty': 'l2', 'solver': 'liblinear'}, 
최적 평균 정확도:0.979