๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์์ธกํด์ผ ํ๋ ๊ฒ์ด ์ซ์๊ฐ ์๋๋ผ "ํฉ๊ฒฉ/๋ถํฉ๊ฒฉ" ๊ฐ์ ๋ฒ์ฃผ์ผ ๋๋ ์ ํ ํ๊ท๋ฅผ ์ธ ์ ์์๊น? ๋๋ต์ No ๊ทธ๋ผ ์ด๋ป๊ฒ ํด์ผํ ๊น?
๊ณต๋ถ ์๊ฐ()์ ๋ฐ๋ฅธ ํฉ๊ฒฉ ์ฌ๋ถ()๋ฅผ ์์ธกํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
- ํฉ๊ฒฉ = 1
- ๋ถํฉ๊ฒฉ = 0
์ ํ ํ๊ท(Linear Regression)๋ก ์ง์ ์ ๊ทธ์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ ํ ํ๊ท์ ์์ธก๊ฐ()์ 0๊ณผ 1 ์ฌ์ด์ ํ๋ฅ ๊ฐ์ผ๋ก ๋ณํํด์ฃผ๋ ํจ์
(์ ํํ๊ท ๊ฐ)๊ฐ ์๋ฌด๋ฆฌ ์ปค์ ธ๋ 1์ ์๋ ด.
๊ฐ ์๋ฌด๋ฆฌ ์์์ ธ๋ 0์ ์๋ ด.
์ผ ๋ ์ ํํ 0.5
import numpy as np
import math
import matplotlib.pyplot as plt
# ์๊ทธ๋ชจ์ด๋ ํจ์ ์ ์
def sigmoid(z):
return 1 / (1 + math.e ** -z)
# z๊ฐ ์ค๋น (-10 ~ 10 ์ฌ์ด)
z = np.linspace(-10, 10, 50)
s = sigmoid(z)
# ์๊ฐํ
plt.plot(z, s, 'r-')
plt.axvline(0, color='k', linestyle=':') # x=0 ๊ธฐ์ค์
plt.grid(True)
plt.title("Sigmoid Function")
plt.xlabel("z (wx + b)")
plt.ylabel("Probability")
plt.show()
# ์ฃผ์ ๊ฐ ํ์ธ
print(f"z=-10 : {sigmoid(-10)}") # 0์ ๊ทผ์
print(f"z= 0 : {sigmoid(0)}") # 0.5
print(f"z= 10 : {sigmoid(10)}") # 1์ ๊ทผ์

์ฑ๊ณต ํ๋ฅ ()์ด ์คํจ ํ๋ฅ ()๋ณด๋ค ๋ช ๋ฐฐ ๋ ๋์๊ฐ?
Odds์ ์์ฐ๋ก๊ทธ()๋ฅผ ์ทจํ ๊ฐ์ ๋๋ค.
Logit ์์ ๋ค์ ์ ๋ํด ์ ๋ฆฌํ๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ณธ ์๊ทธ๋ชจ์ด๋ ํจ์๊ฐ ๋์จ๋ค.
๊ฒฐ๊ตญ ๋ก์ง์คํฑ ํ๊ท๋ "์ ํ ํ๊ท ๊ฐ์ ์๊ทธ๋ชจ์ด๋์ ๋ฃ์ด ํ๋ฅ ์ ๊ตฌํ๋ ๊ฒ"
Scikit-learn์์๋
LogisticRegressionํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ฆ์ 'Regression(ํ๊ท)'์ด์ง๋ง ์ค์ ๋ก๋ 'Classification(๋ถ๋ฅ)' ๋ชจ๋ธ
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
# ๋ฐ์ดํฐ ๋ก๋
df = pd.read_csv('data/pima-indians-diabetes.data.csv')
# ๋
๋ฆฝ๋ณ์(X)์ ์ข
์๋ณ์(y) ๋ถ๋ฆฌ
# ๋ง์ง๋ง ์ด์ด ๋น๋จ๋ณ ๋ฐ๋ณ ์ฌ๋ถ(0 ๋๋ 1)
x_data = df.iloc[:, :-1]
y_data = df.iloc[:, -1]
# ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
# max_iter: ๊ณ์ฐ ๋ฐ๋ณต ํ์ (์๋ ดํ์ง ์์ผ๋ฉด ๋๋ ค์ค์ผ ํจ)
model = LogisticRegression(max_iter=500, verbose=True)
model.fit(x_data, y_data)
print("๊ฐ์ค์น(w):", model.coef_)
# ํน์ฑ์ด 8๊ฐ์ด๋ฏ๋ก w๋ 8๊ฐ๊ฐ ๋์ด (8x1 ํ๋ ฌ)
print("์ ํธ(b):", model.intercept_)
# ํธํฅ๊ฐ (1๊ฐ)
predict vs predict_proba๋ถ๋ฅ ๋ชจ๋ธ์ ๋ ๊ฐ์ง ์์ธก ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค
predict(X): 0 ๋๋ 1 (์ต์ข ํด๋์ค) ์์ธก
predict_proba(X):[0์ผ ํ๋ฅ , 1์ผ ํ๋ฅ ]์์ธก
# ์์ ๋ฐ์ดํฐ 2๊ฑด
# (์์ ํ์, ํฌ๋๋น, ํ์, ํผ๋ถ๋๊ป, ์ธ์๋ฆฐ, BMI, ๋น๋จ๋ด๋ ฅ, ๋์ด)
sample_data = [
[6, 148, 72, 35, 0, 33.6, 0.627, 50],
[1, 93, 70, 31, 0, 30.4, 0.315, 23]
]
# 1. ์ต์ข
๊ฒฐ๊ณผ ์์ธก (0 or 1)
print(model.predict(sample_data))
# ๊ฒฐ๊ณผ: array([1, 0]) -> ์ฒซ ๋ฒ์งธ๋ ๋น๋จ(1), ๋ ๋ฒ์งธ๋ ์ ์(0)
# 2. ํ๋ฅ ์์ธก
print(model.predict_proba(sample_data))
# ๊ฒฐ๊ณผ ์์:
# [[0.28, 0.72], -> 1์ผ ํ๋ฅ ์ด 0.72๋ผ 1๋ก ์์ธก
# [0.85, 0.15]] -> 0์ผ ํ๋ฅ ์ด 0.85๋ผ 0์ผ๋ก ์์ธก
predict_proba๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง, ์์ ๋ฐฐ์ด ์์( ํ ์๊ทธ๋ชจ์ด๋)์ผ๋ก ์ง์ ๊ฒ์ฆํ๊ธฐimport math
# ์๊ทธ๋ชจ์ด๋ ํจ์
def sigmoid(z):
return 1 / (1 + math.e ** -z)
# ์ฒซ ๋ฒ์งธ ์ํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ (2์ฐจ์ ๋ฐฐ์ด ์ ์ง)
xn = np.array([sample_data[0]])
# 1๋จ๊ณ: ์ ํ ํ๊ท ๊ฐ (z) ๊ณ์ฐ
# z = X @ W.T + b (ํ๋ ฌ ๊ณฑ)
# model.coef_๋ (1, 8) ํํ์ด๋ฏ๋ก Transpose(.T) ํด์ฃผ๊ฑฐ๋ ๋ง์ถฐ์ ๊ณฑํด์ผ ํจ
z = np.matmul(xn, model.coef_.T) + model.intercept_
# 2๋จ๊ณ: ์๊ทธ๋ชจ์ด๋ ํต๊ณผ (ํ๋ฅ p ๊ณ์ฐ)
prob = sigmoid(z)
print(f"์ง์ ๊ณ์ฐํ ํ๋ฅ : {prob}")
print(f"๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฐ๊ณผ: {model.predict_proba(xn)[0][1]}")
# 3๋จ๊ณ: 0.5 ๊ธฐ์ค์ผ๋ก ๋ถ๋ฅ
prediction = 1 if prob > 0.5 else 0
print(f"์ต์ข
์์ธก ํด๋์ค: {prediction}")
๋ก์ง์คํฑ ํ๊ท๋ ์ด์ง ๋ถ๋ฅ(0 or 1)๋ฅผ ์ํ ๋ชจ๋ธ์ด๋ค.
์ ํ ํ๊ท์ ๊ฒฐ๊ณผ()๋ฅผ ์๊ทธ๋ชจ์ด๋ ํจ์์ ๋ฃ์ด 0~1 ์ฌ์ด์ ํ๋ฅ ()๋ก ๋ณํํ๋ค.
Odds(์น์ฐ)์ Logit(๋ก์ง) ๊ฐ๋ ์ด ๋ฐํ์ด ๋๋ค.
Scikit-learn์ predict_proba๋ฅผ ํตํด ํ๋ฅ ์ ํ์ธํ ์ ์๋ค.