Logistic_Regression
Table of contents
Logistic Regression
로지스틱 회귀란?
- 데이터가 어떤 범주에 속할 확률을 0에서 1 사이의 값으로 예측하고 그 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류해주는 지도 학습 알고리즘
- 설명변수(독립변수, X)와 범주형 목표변수(종속변수, Y) 간의 관계를 모형화하여 목표변수를 분석하거나 분류하는 통계적 방법론
로지스틱 회귀의 장단점
로지스틱 회귀의 장점
- 회귀 계수의 해석이 가능
- 클래스에 속할 확률 추정함
- 확률 자체에 관심이 있는 위험도 분석과 같은 분야에서 용이
- 저차원에서 과적합 가능성이 적음
- 저차원 자료에서 데이터 샘플수가 충분하면 과적합이 덜 일어남
- 분류 문제에서 베이스 모형으로 활용 가능
- 특정 분류 모형의 성능을 비교 평가하고 싶을 때 비교 모형으로 사용 가능
로지스틱 회귀의 단점
- 분류 경계가 선형
- 이상치에 민감
모델 탐색방법
- 시그모이드(Sigmoid) 함수
- 바이너리 로지스틱 회귀에 주로 사용.
- 시그모이드 함수는 결과 값을 0,1로 반환
- ⇒ 두 가지로 분류할 때 유용
- 소프트맥스(Softmax) 함수
- softmax 함수 또한 활성화 함수
- 여러개를 분류하는데 특화
- softmax는 출력값들이 정규화가 되어있기 때문에 결과값들의 합은 1을 나타넴
- ex) A 0.2 / B 0.2 / C 0.6 -> C가 될 확률이 60%
- 최대 우도 추정법
- 시그모이드 함수를 최적화 가능
- 어떤 확률변수에서 표집한 값들을 토대로 그 확률변수의 모수를 구하는 방법
- 어떤 모수가 주어졌을 때, 원하는 값들이 나올 가능도를 최대로 만드는 모수를 선택하는 방법
로지스틱 회귀 주요 용어
- 오즈 (odds) : ‘실패’(0)에 대한 ‘성공’(1)의 비율
- 로짓 (logit) : ±∞의 범위에서 어떤 클래스에 속할 확률을 결정하는 함수
- 로그 오즈 (log odds) : 변환 모델(선형)의 종속 변수, 이 값을 통해 확률을 구함
코드 예제
- 당뇨병 발병 여부 분류
데이터 로드
import pandas as pd
from sklearn.linear_model import LogisticRegression
import numpy as np
train_df = pd.read_excel('https://github.com/cranberryai/todak_todak_python/blob/master/machine_learning/binary_classification/%E1%84%83%E1%85%A1%E1%86%BC%E1%84%82%E1%85%AD_%E1%84%8E%E1%85%AC%E1%84%8C%E1%85%A9%E1%86%BC_jvyrMwR.xlsx?raw=true', sheet_name='train')
test_df = pd.read_excel('https://github.com/cranberryai/todak_todak_python/blob/master/machine_learning/binary_classification/%E1%84%83%E1%85%A1%E1%86%BC%E1%84%82%E1%85%AD_%E1%84%8E%E1%85%AC%E1%84%8C%E1%85%A9%E1%86%BC_jvyrMwR.xlsx?raw=true', sheet_name='test')
labels = ['정상', '당뇨'] #정답 라벨
데이터 전처리
## 학습 데이터와 평가 데이터 나눔 (데이터 / 정답으로도 나눔)
x_train = train_df.drop(['ID', '당뇨여부'], axis=1)
x_test = test_df.drop(['ID', '당뇨여부'], axis=1)
y_train = train_df['당뇨여부']
y_test = test_df['당뇨여부']
#학습 데이터 출력 (잘 적용 됐는지 확인)
print(x_train.head())
'''
임신 글루코스(탄수화물 화합물) 혈압 피부두께 인슐린 BMI 가족력 나이
0 1 85 66 29 0 26.6 0.351 31
1 3 78 50 32 88 31.0 0.248 26
2 1 189 60 23 846 30.1 0.398 59
3 0 118 84 47 230 45.8 0.551 31
4 1 103 30 38 83 43.3 0.183 33
모델 생성
#로지스틱 회귀 모델 생성
model = LogisticRegression()
모델 학습
#x_train과 y_train로 학습
model.fit(x_train, y_train)
모델 검증
#모델에 train 데이터를 넣었을 때 정확도
print(model.score(x_train, y_train)) #0.7579787234042553
#모델에 test 데이터를 넣었을 때 정확도
print(model.score(x_test, y_test)) #0.7577639751552795
모델 예측
#예측할 데이터 입력
x_test = np.array([
[3, 78, 50, 32, 88, 31, 0.2, 26]
])
#입력 데이터에 해당한 예측값
y_predict = model.predict(x_test) #예측된 클래스값 반환
label = labels[y_predict[0]] #정수의 예측값을 해당하는 label로 변환
y_predict = model.predict_proba(x_test) #클래스에 대한 확률값 반환
confidence = y_predict[0][y_predict[0].argmax()] #가장 높은 확률값 저장 (가장 높은 확률값으로 클래스를 유추했을 것이므로)
print(label, confidence) #정답 라벨과 해당 라벨일 확률 출력