도찐개찐

[머신러닝] 08. 로지스틱 회귀 본문

PYTHON/데이터분석

[머신러닝] 08. 로지스틱 회귀

도개진 2023. 1. 3. 09:47
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score

로지스틱 회귀

  • 주로 분류를 하기 위한 알고리즘
  • 예0/아니오1 등의 이진분류에 많이 사용
  • 의료,통신,데이터마이닝 분야의 회귀/분류를 위한 예측모델로 활용
### 선형회귀의 함정
# 특정 곤충질량에 따라 암수구분하는 모델 생성
X = np.array([1.94,1.67,0.92,1.11,1.41,1.65,2.28,0.47,1.07,2.19,2.08,1.02,0.91,1.16,1.46,1.02,0.85,0.89,1.79,1.89,0.75,0.9,1.87,0.5,0.69,1.5,0.96,0.53,1.21,0.6])
y = np.array([1,1,0,0,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0,1,1,0,1,0])

데이터 시각화

plt.scatter(X, y)
plt.grid()
plt.show()

 

선형 회귀 분석 실시

from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression
lr = LinearRegression()
lr.fit(X.reshape(-1, 1), y.reshape(-1, 1))
print(lr.coef_, lr.intercept_) # 기울기, 절편 출력
[[0.74825276]] [-0.43007818]

선형 회귀 분석 시각화

# 회귀 방정식 : y = ax + b
x = np.linspace(0.5, 2.25, 50) # 0.5~2.25 사이 간격을 50 등분 함
yy = (lr.coef_ * x) + lr.intercept_
plt.scatter(X, y, color='red')
plt.plot(x.reshape(-1,1), yy.reshape(-1,1), 'b-')
plt.grid()
plt.show()

  • 위 그래프에서 보듯 선형방정식은 이항분포를 따르는
    데이터에 적용하기에 다소 무리가 있음
    • $y = ax + b$
  • 즉, 우변값의 범위는 '-무한대 ~ +무한대'이지만
    좌변값의 범위는 '0 ~ 1'임
  • 따라서, 좌변값의 범위를 우변과 동일하게 하려면
    적절한 변환함수가 필요 = > logit함수를 이용

logit함수 정의

def logistic(x, a, b):
    yy = 1 / (1 + np.exp(-(a * x + b)))
    return yy

logit 함수 변환 후 시각 화

x = np.linspace(0.5, 2.25, 50) # 0.5~2.25 사이 간격을 50 등분 함
# yy = logistic(x, lr.coef_, lr.intercept_) # 앞에서 구한 기울기와 절편은 맞지 않음
yy = logistic(x, 8, -10) # 예제에 맞는 기울기와 절편을 설정 함
plt.scatter(X, y, c=y)
plt.plot(x.reshape(-1,1), yy.reshape(-1,1), 'b-')
plt.grid()
plt.show()

결정 경계시각화

x = np.linspace(0.5, 2.25, 50)
yy = logistic(x, 8, -10)

# yy 값이 0.5에 가장 근접한 x값을 찾음
idx = np.min(np.where(yy >= 0.5))
xp = x[idx]

plt.scatter(X, y, c=y)
plt.plot(x.reshape(-1,1), yy.reshape(-1,1), 'b-')
plt.plot([xp, xp], [-0.25, 1.25], 'r--') # 결정 경계 시각화
plt.grid()
plt.show()

# 결정계수 값
xp

 

1.25

로지스틱 회귀로 곤충 암수 구분

pd.Series(y).value_counts()
1    15
0    15
dtype: int64
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.7,
                stratify=y, random_state=2211171625)

lrclf = LogisticRegression()
lrclf.fit(X_train, y_train)
pred = lrclf.predict(X_test)

accuracy_score(y_test, pred)
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

Cell In [1], line 2
      1 from sklearn.model_selection import train_test_split
----> 2 X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.7,
      3                 stratify=y, random_state=2211171625)
      5 lrclf = LogisticRegression()
      6 lrclf.fit(X_train, y_train)


NameError: name 'X' is not defined
precision_score(y_text, pred)
recall_score(y_test, pred)

결정경계 시각화

#!pip install mlxtend
from sklearn.datasets import make_blobs

X, y = make_blobs(n_samples=100, centers=2, cluster_std=1.0, random_state=2211171645)

# make_blobs를 이용해서 정규분포를 따르는 가상데이터 생성
# n_samples : 표본수
# centers : 군집수
# cluster_std : 군집의 표준편차 (흩어짐 정도)

plt.scatter(X[:, 0], X[:, 1], c=y, s=10)
plt.show()

lrclf = LogisticRegression()
lrclf.fit(X, y)
lrclf.score(X, y) # 학습시 정확도 
# accuracy_score(y_test, pred)
1.0
from mlxtend.plotting import plot_decision_regions

plot_decision_regions(X, y, clf=lrclf) # X는 2차원이어야 함
plt.show()

728x90

'PYTHON > 데이터분석' 카테고리의 다른 글

[머신러닝] 10. 엔트로피  (1) 2023.01.03
[머신러닝] 09. 의사결정 나무  (0) 2023.01.03
[머신러닝] 07. ROC 그래프  (0) 2023.01.03
[머신러닝] 06. 오차행렬  (0) 2023.01.03
[머신러닝] 05. 데이터 전처리  (0) 2023.01.03
Comments