ADP/실기
로지스틱 회귀분석
hyerimir
2024. 1. 27. 15:43
# 종속변수가 범주형 데이터인 것을 대상, 분류기법
# 일반적으로 종속변수가 이산형변수일 때, 종속변수의 level이 2개 이상일 때는 다항 로지스틱 회귀
import pandas as pd
import numpy as np
df_t = pd.read_csv('../data/titanic.csv')
df_t.head()
# 로지스틱 회귀분석 진행할 때, 결측치 있으면 안됨
# 전처리
df_t['age'] = df_t['age'].fillna(df_t['age'].median())
df_t['embark_town'].value_counts().index[0]
df_t['embark_town'] = df_t['embark_town'].fillna(df_t['embark_town'].value_counts().index[0])
# 더미변수화
df_t = pd.get_dummies(df_t, columns = ['sex', 'class', 'embark_town'])
# 전체 데이터 형식 float으로 변환
df_t = df_t.astype(float)
X = df_t.drop(['survived'], axis = 1)
y = df_t['survived']
y.value_counts()
# 홀드아웃 기법
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify = y, test_size = 0.2, random_state = 42)
# 로지스틱 회귀 모델링
import statsmodels.api as sm
model = sm.Logit(y_train, X_train)
result = model.fit()
print(result.summary())
# 성능척도
print(result.aic)
# 적합한 회귀계수 해석할 때, 오즈비로 확인
np.exp(result.params)
# 다항 로지스틱 회귀모형
import pandas as pd
iris = pd.read_csv('../data/iris.csv')
X = iris.drop(['target'], axis = 1) # 데이터프레임 형태
y = iris.target # 시리즈 형태
y.value_counts()
from sklearn.model_selction import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify = y, test_size = 0.3, random_state = 48)
y_test.value_counts()
# sklearn 모델은 l2 패널티를 이용하여 전통적 통계모델에서 다중공선성의 문제를 내부적으로 해결해줌
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
print(model)
# 모델 평가
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score, roc_auc_score
# sklearn에서는 확률값이 아니라 바로 범주형 형태로 결과값이 나옴
predicted = model.predict(X_test)
cm = confusion_matrix(y_test, predicted)
cmtb = pd.DataFrame(cm, columns = ['predicted_setosa', 'predicted_versicolor', 'predicted_virginica'],
index = ['setosa', 'versicolor', 'virginica'])
# 정확도
accuracy_score(y_test, predicted)
# 분류 리포트 생성
class_report = classification_report(y_test, predicted)
# roc_auc_score
# 여기서는 예측값이 확률값 형태로 들어감
roc_auc_score(y_test, model.predict_proba(X_test), multi_class = 'ovr')
# 로지스틱 회귀계수 해석
model.intercept_
model.coef_
# 오즈비 계산하기
import numpy as np
np.exp(model.coef_)
# 다른 변수가 일정할 때, sepal width가 1단위 증가하면, iris-setosa로 분류될 확률이 2.393189배 증가한다