본문 바로가기
Tech

Ch8 로지스틱 회귀

by keneth 2024. 6. 27.
반응형

1) 로지스틱 회귀 이해하기

로지스틱 회귀는 시그모이드(Sigmoid) 함수를 사용하여 데이터를 설명하는 최적의 선으로 답을 찾는 알고리즘

이름은 회귀지만, 분류에 사용

 

S(x) = 1/(1+e^-x) = e^x / (e^x + 1)

 

(1) 시그모이드 함수 만들기

# 넘파이, 그래프 라이브러리
import numpy as np
import matplotlib.pyplot as plt

# 시그모이드 함수 작성
def sigmoid(x):
    
    # numpy.exp() 함수는 밑이 자연상수 e인 지수함수(e^x)로 변환
    return 1/(1+np.exp(-x))

# 함수 테스트용 데이터 생성하기
test=np.array([-1, 0, 1])

# 작성된 함수 확인하기
print(sigmoid(test))
[0.26894142 0.5        0.73105858]

 

(2) 시그모이드 함수 그래프 그리기

# 그래프 적용을 위한 데이터 만들기
sigmoid_x = range(-6, 7)
sigmoid_y = sigmoid(np.array(sigmoid_x))

# 선그래프
plt.plot(sigmoid_x, sigmoid_y, color = 'blue', linewidth = .5)

# 백그라운드 모눈종이
plt.rcParams['axes.grid'] = True
# 선굵기
plt.axvline(x=0, color='black',linewidth=3)

#y축 범위
plt.yticks([0, .5, 1])

plt.show()
 

-6 ~ 6 사이의 값을 0~1 사이의 값으로 변환해주는 로지스틱 함수가 잘 구현되었음

 

 

시그모이드 함수(로지스틱 함수)에 대한 이해하기 좋은 글

시그모이드 함수(sigmoid function) 알아보기 + 미분 : 네이버 블로그 (naver.com)

 

시그모이드 함수(sigmoid function) 알아보기 + 미분

(갑자기 시그모이드 함수를 알아보는 시간!) 이렇게 S자로 처음에는 잠잠하다가 중간에 갑작스럽게 크게 ...

blog.naver.com

 

2) 로지스틱 회귀 실습하기

로지스틱회귀 알고리즘은 sklearn의 linear_model 서브패키지에서 제공하는 LogisticRegression 클래스로 활용 가능함

 

# 데이터 구성하기
# 학습데이터 생성
x_train = [3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
y_train = [0,0,0,0,0,0,0,1,1,1,1,1,1,1]

# 추론을 위한 데이터 생성
x_test = [0,1,2,18,19]
y_test = [0,0,0,1,1]

# 학습데이터 numpy로 변경, 행을 열로 변경
x_train = np.array(x_train).reshape(-1,1)
y_train = np.array(y_train)

print(x_train)
print(y_train)
[[ 3]
 [ 4]
 [ 5]
 [ 6]
 [ 7]
 [ 8]
 [ 9]
 [10]
 [11]
 [12]
 [13]
 [14]
 [15]
 [16]
 [17]]
[0 0 0 0 0 0 0 1 1 1 1 1 1 1]

 

 

(2) 로지스틱 회귀 학습하기

# 로지스틱회귀 라이브러리
from sklearn.linear_model import LogisticRegression

# 로지스틱회귀 생성하기
logi_reg = LogisticRegression()

# 학습하기
logi_reg.fit(x_train, y_train)

#역산을 위한 기울기와 y절편이 있는지 확인하기
print('intercept: ', logi_reg.intercept_)
print('coef: ', logi_reg.coef_)
intercept:  [-11.34126808]
coef:  [[1.19383367]]

학습을 마친 모델에서 선형회귀와 같이 coef와 intercept를 확인할 수 있음

이를 이용해 sigmoid 그래프 그리고, 데이터와 비교해보자

 

(3) 로지스틱회귀 그래프 만들기

# 기울기, 절편을 수동으로 결과 만들기
odd = []
for i in x_train: 
    odd.append((logi_reg.coef_*i)+logi_reg.intercept_)


sigmoid_y = sigmoid(np.array(odd))
sigmoid_y = sigmoid_y.reshape(-1,1)

#역산된 그래프 표시하기
plt.scatter(x_train, y_train, color = 'red')
plt.plot(np.array(x_train), sigmoid_y, color='blue')
plt.rcParams['axes.grid']=True
plt.ylim([-0.1, 1.1])
plt.show()

 

3) 로지스틱 회귀와 선형 회귀 비교

(1) 선형회귀 모델링

# 선형회귀 함수 불러오기
from sklearn.linear_model import LinearRegression

# 선형회귀 생성하기
lr = LinearRegression()

# 학습하기
lr.fit(x_train, y_train)

# coef와 intercept 확인하기
print('coef: ', lr.coef_)
print('intercept: ', lr.intercept_)
coef:  [0.1]
intercept:  -0.4666666666666667
(2) 로지스틱/선형 회귀 비교하기
coef_intercept = x_train * lr.coef_ + lr.intercept_

plt.scatter(x_train, y_train, color = 'red')
plt.plot(np.array(x_train), coef_intercept, color='green')
plt.plot(np.array(x_train), sigmoid_y, color='blue')
plt.show()

x_test = np.array(x_test).reshape(-1,1)

print(logi_reg.score(x_test, y_test))
print(lr.score(x_test, y_test))
 
1.0
0.3981481481481479

 

로지스틱회귀는 y축의 0.5를 기준으로 Yes 또는 No를 구분하여 이진/다중 분류에 강한 모델을 만듦

위 학습모델을 기반으로 x=9.5인 경우 로지스틱/선형 회귀에서 각각 어떤 결과를 도출하는지....

 

반응형

'Tech' 카테고리의 다른 글

통계학 정리 2  (2) 2024.08.30
통계학 정리  (2) 2024.08.28
ch8. 사례기반 '''선형회귀모델'''  (0) 2024.06.26
ch8. 지도학습 AI 모델링  (2) 2024.06.25
Ch7. AI 모델링  (2) 2024.06.24