티스토리 뷰

반응형

로지스틱 회귀에 대한 개념코드, 발생하는 오류까지 전부를 정리하겠다.

 

 

 

기초 개념

로지스틱 회귀(Logistic Regression)는 회귀를 사용하여 데이터가 어떤 범주에 속할 확률을 0에서 1 사이의 값으로 예측하고 그 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류해주는 지도 학습 알고리즘이다. 주의해야할 점은 로지스틱 회귀에 회귀가 들어간다고 회귀문제가 아니다. 단지 회귀(Regression)원리를 사용하여 분류(classification)을 하기 때문에 이름에 회귀가 포함된 것이다. 즉, 로지스틱 회귀는 분류라고 할 수 있다.

 

 

 

먼저 로지스틱 회귀와 선형회귀는 다르다. 선형회귀는 공부시간과 성적의 관계를 직선으로 나타내서 예측하는 것이다. 로지스틱 회귀는 데이터가 어떤 범주에 속할 확률을 0과 1사이의 값으로 예측하는 이진분류가 기본이고, OvR과 같은 방식을 사용하면 멀티 클래스 분류도 가능하다.

 

 

로지스틱 회귀에서는 확률을 0에서 1사이로 커브 모양으로 만들어 주는 것이 바로 Sigmoid 함수다. 시그모이 함수의 값은 0~1사이의 값이므로, 확률로 예측이 된다. 그리고 임계값을 적용하여, 중간 값인 0.5를 기준으로 0.5를 넘으면, 1이 되고, 넘지 못하면 0이 되는 식으로 이진분류로도 자주 활용된다. 사용 사례로는, 기온, 기압 정보를 활용하여 비의 유무예측, 병원에서는 증상들을 토대로 어떤 질병인지를 예측가능하다. 시그모이드 함수를 구현해 보면 아래와 같다.

 

import numpy as np
def sigmoid(x):
    return 1 / (1+np.exp(-x))

 

 

 

 

사이킷런 구현

>  간단하게 손글씨 데이터를 사이킷런을 활용하여 로지스틱 회귀를 구현해 보겠다. 아래와 같이 간단하게 구현가능하다.

 

from sklearn.datasets import load_digits, load_wine, load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# 데이터 불러오기
digits = load_digits()    # 손글씨 이미지 데이터

digits_data = digits.data
print(digits_data.shape) # (1797, 64)
print(len(digits_data[0])) # 8*8

digits_label = digits.target
print(len(digits_label)) # 1797

digits_name = digits.target_names
print(digits_name) # [0 1 2 3 4 5 6 7 8 9]


# 판다스 활용
import pandas as pd
digits_df = pd.DataFrame(data=digits_data, columns=digits.feature_names)
digits_df.head()
digits_df["label"] = digits.target

# 훈련 set은 20%
from sklearn.model_selection import train_test_split
x_train, x_text, y_train, y_test= train_test_split(digits_data, digits_label, test_size=0.2, random_state=3)

'''
로지스틱 회귀(Logistic Regression)
Logistic Regression은 회귀를 사용하여 데이터가 어떠한 범주에 속할 확률을 0에서 1 사이의 값으로 예측하고 그 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류해주는 지도학습 알고리즘
'''
from sklearn.linear_model import LogisticRegression
logistic_model = LogisticRegression(max_iter=3000)
# print(logistic_model._estimator_type) # classifier
logistic_model.fit(x_train, y_train) 
y_pred = logistic_model.predict(x_text)
print(classification_report(y_test, y_pred))
'''
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        47
           1       0.88      1.00      0.93        35
           2       0.97      1.00      0.98        31
           3       1.00      0.97      0.99        40
           4       0.97      0.89      0.93        44
           5       0.94      0.84      0.89        38
           6       1.00      0.92      0.96        25
           7       0.93      1.00      0.97        42
           8       0.87      0.93      0.90        29
           9       0.86      0.86      0.86        29

    accuracy                           0.94       360
   macro avg       0.94      0.94      0.94       360
weighted avg       0.95      0.94      0.94       360
'''

 

위의 내용을 보면 손글씨가 0에서 9까지의 각각의 정확도를 확인 할 수 있다. 만약 아래와 같이 Error가 발생할 수도 있다.

 

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(

 

위의 문제는 max_iter값을 고쳐주면된다. max_iter은 해를 찾아가는데 반복횟수를 제한하는 것이다. 무한루프를 방지하는 느낌이라고 생각하면된다. 위의 에러가 뜬다면, max_iteration을 500 => 1000 => 이런식으로 올려주면 해결 가능하다. 물론 값을 올릴수록 훈련시간이 길어진다. 따라서 실제 프로젝트 시에 위의 오류가 발생한다면, 데이터 정규화(전처리)가 잘 되지 않았을 가능성이 크기 때문에 전처리를 다시하자.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함