AI

[Machine Learning] 로지스틱 회귀(Logistic Regression)

hilily 2022. 3. 19. 01:34
반응형

로지스틱 회귀(Logistic Regression)

💡 회귀를 사용하여 데이터가 어떤 범주에 속할 확률을 0에서 1 사이의 값으로 예측하고 그 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류해주는 지도 학습 알고리즘이다.

예)
시험에 합격한 경우불합격한 경우
병에 걸린 경우걸리지 않은 경우
⇒ 두개의 선택지 중에서만 선택할 수 있다.


확률이 음과 양의 방향으로 무한대까지 뻗어 가는 선형회귀의 문제점을 해결한다.

장점

  • 계산 비용이 적고, 구현하기 쉬우며 결과 해석을 위한 지식 표현이 쉽다.

단점

  • Underfitting(언더피팅) 경향이 있어 정확도가 낮게 나올 수도 있다.

 

시그모이드 함수(Sigmoid Function)

💡 확률을 0에서 1사이로 커브 모양으로 나타낼 수 있게 해주는 함수이다.

시그모이드 함수 장단점

장점

  • 출력 값의 범위가 0 ~ 1 사이이며, 매우 매끄러운 곡선을 가지므로 후술 할 경사하강법을 시행할 때, 기울기가 급격하게 변해서 발산하는 기울기 폭주가 발생하지 않는다.
  • 분류는 0과 1로 나뉘며 출력 값이 어느 값에 가까운지를 통해 어느 분류에 속하는지 쉽게 알 수 있다.

단점

  • 입력값이 아무리 크더라도 출력되는 값의 범위가 매우 좁기 때문에 경사하강법 수행 시에 범위가 너무 좁아 0에 수렴하는 기울기 소실(Gradient Vanishing) 이 발생할 수 있다.

⇒ 출력값이 너무 작아 기울기가 급격하게 변하지 않으나 학습이 제대로 되지 않고, 시간도 오래 걸린다.

예제

import pandas as pd
import numpy as np

#사이킷런의 로지스틱 회귀 라이브러리
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

#타이타닉 데이터 불러오기
data = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')

print(data.shape)
#맨 앞의 데이터 10개 출력
data.head(10)

#데이터에 null이 포함되어 있는지 확인
data.isna().sum()

# target 데이터 따로 저장
target = data['Survived']

data.drop(labels=['Name', 'Survived'], axis = 1, inplace = True)

print(target.shape)
# 성별 데이터를 숫자로 변환|
data['Sex'] = data['Sex'].map({'male': 0, 'female': 1})

data

# 훈련 데이터와 테스트 데이터 분리
train_input, test_input, train_target, test_target = train_test_split(data, target, random_state = 42)
print(train_input)
print(train_target)

# 로지스틱 회귀 인스턴스 생성
lr = LogisticRegression()
# 훈련 데이터로 모델 훈련
lr.fit(train_input, train_target)

# 예측 결과 출력
print(lr.predict(test_input))


#변수 종류 출력
print(data.head(0))
#각 특징(변수, feature)들의 가중치
print(lr.coef_)

#내가 탔을 때를 가정한 조건
pred = lr.predict([[1, 0, 26.0, 0, 0, 30.5789]])

if(pred[0] == 0):
    print('사망하실 것으로 예측됩니다.\n')
else:
    print('생존하실 것으로 예측됩니다.\n')

#음성 클래스 / 양성 클래스의 확률
print('양성 클래스 / 음성 클래스 : {}'.format(lr.predict_proba([[2, 0, 23.0, 1, 0, 30.5789]])))

반응형