본문 바로가기

ML,DL

[ML] 로지스틱 회귀 Logistic Regression

로지스틱 회귀는 이름은 회귀이지만 분류 모델이다. 이 알고리즘은 선형 회귀와 동일하게 선형 방정식을 학습한다.

선형 방정식의 결과가 0 ~ 1 사이의 확률이 되어야 하므로 시그모이드 함수를 사용한다.

시그모이드 함수 sigmoid function

선형 방정식의 출력 z의 음수를 사용해 자연 상수 e를 거듭제곱하고 1을 더한 값의 역수를 취한다.

z가 무한하게 큰 음수일 때 -> 0에 가까워지고, z가 무한하게 큰 양수가 될 때 -> 1에 가까워짐

import numpy as np
import matplotlib.pyplot as plt
# 로지스틱함수(시그모이드 함수)
def sigmoid(z):
  return 1 / (1 + np.exp(-z))
z = np.arange(-5,5,0.1)
sigmoid_value = sigmoid(z)
plt.plot(z,sigmoid_value)
plt.xlabel('z')
plt.ylabel('phi')
plt.show()

이진 분류

이진 분류일 경우 시그모이드 함수의 출력이 0.5보다 크면 양성 클래스, 0.5보다 작으면 음성 클래스로 판단

훈련 세트에서 'Perch'와 'Bream'의 행만 골라내어 이진 분류를 수행해보자.

new_fish = fish[(fish['Species'] == 'Perch') | (fish['Species'] == 'Bream')]
new_fish.describe(include='object')

X = new_fish.iloc[:,1:]
y = new_fish.iloc[:,0] # target
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
# 학습
lr.fit(X,y)
# 평가
print(lr.score(X,y))
# 예측
print(lr.predict(X[:5]))
print(lr.predict_proba(X[:5]))
# 정답
print(y[:5])

predict_proba : 예측 확률을 나타냄

5개의 데이터에 대해 예측을 수행해 본 결과, 모두 예측에 성공했다.

# 0, 1 중에 1이 될 확률
lr.decision_function(X[:5])

다중 분류

LogisticRegression 클래스를 사용해 7개의 생선 분류하기

다중 분류에서는 소프트맥스 함수를 사용하여 7개의 z값을 확률로 변환한다.

소프트맥스 함수

import numpy as np
import matplotlib.pyplot as plt
# 소프트맥스 함수
def softmax(z):
  exp_z = np.exp(z)
  return exp_z / np.sum(exp_z)

z = np.linspace(-5,5,100)
softmax_value = softmax(z)

plt.plot(z,softmax_value)
plt.show()

fish_input_ss = StandardScaler().fit_transform(fish_input)
X_train,X_test,y_train,y_test = train_test_split(fish_input_ss, fish_target, random_state=25)

lr = LogisticRegression(penalty = 'l2',C=20, max_iter=1000)
lr.fit(X_train, y_train)
print(lr.score(X_train, y_train), lr.score(X_test, y_test))

LogisticRegression에서 규제를 제어하는 매개변수 : C

C는 alpha와 반대로 작을수록 규제가 커짐, C의 기본값은 1

적절한 규제 강도 찾기

C_list = list(range(1,31))
train_score_list, test_score_list = [],[]
best_model = None; diff_score = None
for c in C_list:
  lr = LogisticRegression(penalty = 'l2',C=c, max_iter=1000)
  lr.fit(X_train, y_train)
  train_score_list.append(lr.score(X_train, y_train))
  test_score_list.append(lr.score(X_test, y_test))
  best_model = lr
  gap = lr.score(X_train, y_train) - lr.score(X_test, y_test)
plt.plot(C_list, train_score_list, label='train')
plt.plot(C_list, test_score_list, label='test')
plt.legend()
plt.show()

gap이 가장 작은 것이 적절한 규제 강도이다.

'ML,DL' 카테고리의 다른 글

[ML] 트리의 앙상블  (1) 2024.04.12
[ML] 확률적 경사 하강법  (0) 2024.04.08
[ML] Ridge, Lasso Regression  (0) 2024.04.08
[ML] 다중 회귀 multiple regression  (0) 2024.04.05
[ML] 선형 회귀 Linear Regression  (0) 2024.04.05