๋ก์ง์คํฑ ํ๊ท(Logistic Regression)
๐ก ํ๊ท๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ๋ฒ์ฃผ์ ์ํ ํ๋ฅ ์ 0์์ 1 ์ฌ์ด์ ๊ฐ์ผ๋ก ์์ธกํ๊ณ ๊ทธ ํ๋ฅ ์ ๋ฐ๋ผ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ ๋ฒ์ฃผ์ ์ํ๋ ๊ฒ์ผ๋ก ๋ถ๋ฅํด์ฃผ๋ ์ง๋ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์)
์ํ์ ํฉ๊ฒฉํ ๊ฒฝ์ฐ์ ๋ถํฉ๊ฒฉํ ๊ฒฝ์ฐ
๋ณ์ ๊ฑธ๋ฆฐ ๊ฒฝ์ฐ์ ๊ฑธ๋ฆฌ์ง ์์ ๊ฒฝ์ฐ
⇒ ๋๊ฐ์ ์ ํ์ง ์ค์์๋ง ์ ํํ ์ ์๋ค.
ํ๋ฅ ์ด ์๊ณผ ์์ ๋ฐฉํฅ์ผ๋ก ๋ฌดํ๋๊น์ง ๋ป์ด ๊ฐ๋ ์ ํํ๊ท์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ค.
์ฅ์
- ๊ณ์ฐ ๋น์ฉ์ด ์ ๊ณ , ๊ตฌํํ๊ธฐ ์ฌ์ฐ๋ฉฐ ๊ฒฐ๊ณผ ํด์์ ์ํ ์ง์ ํํ์ด ์ฝ๋ค.
๋จ์
- Underfitting(์ธ๋ํผํ ) ๊ฒฝํฅ์ด ์์ด ์ ํ๋๊ฐ ๋ฎ๊ฒ ๋์ฌ ์๋ ์๋ค.
์๊ทธ๋ชจ์ด๋ ํจ์(Sigmoid Function)
๐ก ํ๋ฅ ์ 0์์ 1์ฌ์ด๋ก ์ปค๋ธ ๋ชจ์์ผ๋ก ๋ํ๋ผ ์ ์๊ฒ ํด์ฃผ๋ ํจ์์ด๋ค.
์๊ทธ๋ชจ์ด๋ ํจ์ ์ฅ๋จ์
์ฅ์
- ์ถ๋ ฅ ๊ฐ์ ๋ฒ์๊ฐ 0 ~ 1 ์ฌ์ด์ด๋ฉฐ, ๋งค์ฐ ๋งค๋๋ฌ์ด ๊ณก์ ์ ๊ฐ์ง๋ฏ๋ก ํ์ ํ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ํํ ๋, ๊ธฐ์ธ๊ธฐ๊ฐ ๊ธ๊ฒฉํ๊ฒ ๋ณํด์ ๋ฐ์ฐํ๋ ๊ธฐ์ธ๊ธฐ ํญ์ฃผ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
- ๋ถ๋ฅ๋ 0๊ณผ 1๋ก ๋๋๋ฉฐ ์ถ๋ ฅ ๊ฐ์ด ์ด๋ ๊ฐ์ ๊ฐ๊น์ด์ง๋ฅผ ํตํด ์ด๋ ๋ถ๋ฅ์ ์ํ๋์ง ์ฝ๊ฒ ์ ์ ์๋ค.
๋จ์
- ์ ๋ ฅ๊ฐ์ด ์๋ฌด๋ฆฌ ํฌ๋๋ผ๋ ์ถ๋ ฅ๋๋ ๊ฐ์ ๋ฒ์๊ฐ ๋งค์ฐ ์ข๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ ์ํ ์์ ๋ฒ์๊ฐ ๋๋ฌด ์ข์ 0์ ์๋ ดํ๋ ๊ธฐ์ธ๊ธฐ ์์ค(Gradient Vanishing) ์ด ๋ฐ์ํ ์ ์๋ค.
⇒ ์ถ๋ ฅ๊ฐ์ด ๋๋ฌด ์์ ๊ธฐ์ธ๊ธฐ๊ฐ ๊ธ๊ฒฉํ๊ฒ ๋ณํ์ง ์์ผ๋ ํ์ต์ด ์ ๋๋ก ๋์ง ์๊ณ , ์๊ฐ๋ ์ค๋ ๊ฑธ๋ฆฐ๋ค.
์์
import pandas as pd
import numpy as np
#์ฌ์ดํท๋ฐ์ ๋ก์ง์คํฑ ํ๊ท ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
#ํ์ดํ๋ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
data = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')
print(data.shape)
#๋งจ ์์ ๋ฐ์ดํฐ 10๊ฐ ์ถ๋ ฅ
data.head(10)
#๋ฐ์ดํฐ์ null์ด ํฌํจ๋์ด ์๋์ง ํ์ธ
data.isna().sum()
# target ๋ฐ์ดํฐ ๋ฐ๋ก ์ ์ฅ
target = data['Survived']
data.drop(labels=['Name', 'Survived'], axis = 1, inplace = True)
print(target.shape)
# ์ฑ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ซ์๋ก ๋ณํ|
data['Sex'] = data['Sex'].map({'male': 0, 'female': 1})
data
# ํ๋ จ ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ ๋ถ๋ฆฌ
train_input, test_input, train_target, test_target = train_test_split(data, target, random_state = 42)
print(train_input)
print(train_target)
# ๋ก์ง์คํฑ ํ๊ท ์ธ์คํด์ค ์์ฑ
lr = LogisticRegression()
# ํ๋ จ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ ํ๋ จ
lr.fit(train_input, train_target)
# ์์ธก ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(lr.predict(test_input))
#๋ณ์ ์ข
๋ฅ ์ถ๋ ฅ
print(data.head(0))
#๊ฐ ํน์ง(๋ณ์, feature)๋ค์ ๊ฐ์ค์น
print(lr.coef_)
#๋ด๊ฐ ํ์ ๋๋ฅผ ๊ฐ์ ํ ์กฐ๊ฑด
pred = lr.predict([[1, 0, 26.0, 0, 0, 30.5789]])
if(pred[0] == 0):
print('์ฌ๋งํ์ค ๊ฒ์ผ๋ก ์์ธก๋ฉ๋๋ค.\n')
else:
print('์์กดํ์ค ๊ฒ์ผ๋ก ์์ธก๋ฉ๋๋ค.\n')
#์์ฑ ํด๋์ค / ์์ฑ ํด๋์ค์ ํ๋ฅ
print('์์ฑ ํด๋์ค / ์์ฑ ํด๋์ค : {}'.format(lr.predict_proba([[2, 0, 23.0, 1, 0, 30.5789]])))