๋ฐ์ํ
๋ก์ง์คํฑ ํ๊ท
๋ญํค๋ฐฑ์ ํ๋ฅ
K-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ ์ฃผ๋ณ ์ด์์ ์ฐพ์์ฃผ๋๊น ์ด์์ ํด๋์ค ๋น์จ์ ํ๋ฅ ์ด๋ผ๊ณ ์ถ๋ ฅํ๋ฉด ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
- ๋ณด๋ฉด ์ํ X ์ฃผ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์ ์ํ 10๊ฐ๋ฅผ ํ์ํ์ต๋๋ค. ์ผ๊ฐํ์ด 5๊ฐ, ์ฌ๊ฐํ์ด 3๊ฐ, ์ 2๊ฐ๊ฐ ์์ต๋๋ค.
- ์ด์ํ ์ํ์ ํด๋์ค๋ฅผ ํ๋ฅ ๋ก ์ผ๋๋ค๋ฉด ์ํ X๊ฐ ์ฌ๊ฐํ์ด ํ๋ฅ ์ 30%, ์ผ๊ฐํ์ผ ํ๋ฅ ์ 50%, ์์ธ ํ๋ฅ ์ 20%์ ๋๋ค.
- Scikit-learn์ K-์ต๊ทผ์ ์ด์ ๋ถ๋ฅ๊ธฐ๋ ์ด์ ๋์ผํ ๋ฐฉ์์ผ๋ก Class ํ๋ฅ ์ ๊ณ์ฐํ์ฌ ์ ๊ณตํฉ๋๋ค. ํ๋ฒ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ ํด๋ณด๊ฒ ์ต๋๋ค.
๋ฐ์ดํฐ ์ค๋น
import pandas as pd
fish = pd.read_csv('https://bit.ly/fish_csv_data')
fish.head()
# Species(7๊ฐ์ ์์ ์ ๋ํ ์ข
๋ฅ)-Target, ๋๋จธ์ง๋ ํน์ฑ ๋ฐ์ดํฐ(input_data-fish_input)
print(pd.unique(fish['Species']))
['Bream' 'Roach' 'Whitefish' 'Parkki' 'Perch' 'Pike' 'Smelt']
- ์ด ๋ฐ์ดํฐํ๋ ์์์ Species ์ด์ ํ๊น์ผ๋ก ๋ง๋ค๊ณ ๋๋จธ์ง 5๊ฐ ์ด์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ก ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
fish_input = fish[['Weight','Length','Diagonal','Height','Width']].to_numpy()
print(fish_input[:5])
[[242. 25.4 30. 11.52 4.02 ]
[290. 26.3 31.2 12.48 4.3056]
[340. 26.5 31.1 12.3778 4.6961]
[363. 29. 33.5 12.73 4.4555]
[430. 29. 34. 12.444 5.134 ]]
- ํ๊ฒ ๋ฐ์ดํฐ๋ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
# Species(7๊ฐ์ ์์ ์ ๋ํ ์ข
๋ฅ)-Target
fish_target = fish['Species'].to_numpy()
- ์์์ ๋ฐฐ์ ๋ฏ์ด ๋จธ์ ๋ฌ๋์์๋ ๊ธฐ๋ณธ์ผ๋ก ๋ฐ์ดํฐ ์ธํธ 2๊ฐ๊ฐ ํ์ํฉ๋๋ค.
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(fish_input, fish_target, random_state=42)
- ๊ทธ๋ค์ Scikit-learn์ StandardScaler ํด๋์ค๋ฅผ ์ฌ์ฉํด Training_set์ Test_set๋ฅผ ํ์คํ ์ฒ๋ฆฌํ๊ฒ ์ต๋๋ค.
- ์์์ผ ํ ์ ์, Training_set์ ํต๊ณ๊ฐ์ผ๋ก Test_set๋ฅผ ๋ณํํด์ผ ํฉ๋๋ค.
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
K-์ต๊ทผ์ ์ด์์ ๋ค์ค๋ถ๋ฅ
Scikit-learn์ KNeighborsClassifier ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ Training_set๋ก ๋ชจ๋ธ์ ํ๋ จํ ๋ค์ Training_set์ Test_set์ ์ ์๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. ์ต๊ทผ์ ์ด์ ๊ฐ์๋ k๋ 3์ผ๋ก ์ง์ ํ๊ณ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier(n_neighbors=3)
kn.fit(train_scaled, train_target)
print(kn.score(train_scaled, train_target))
print(kn.score(test_scaled, test_target))
0.8907563025210085
0.85
- ์ฌ๊ธฐ์ ์ ๊น ์ง๊ณ ๋์ด๊ฐ์ผ ํ ๋ถ๋ถ์ด ์์ต๋๋ค. ํ๊น ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค ๋ fish['Species']๋ฅผ ์ฌ์ฉํด์ ๋ง๋ค์๊ธฐ ๋๋ฌธ์, Training & Test set์ 7๊ฐ์ ์์ ์ข ๋ฅ๊ฐ ๋ค์ด๊ฐ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๊น ๋ฐ์ดํฐ์ 2๊ฐ ์ด์์ ํด๋์ค๊ฐ ํฌํจ๋ ๋ฌธ์ ๋ฅผ ๋ค์ค ๋ถ๋ฅ(Multi-class Classification)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
- ํ๋ฒ Classes๋ค์ ๊ฐ์๋ฅผ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค.
# ์์ฑ ํ์ธ, _๋ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๋ก๋ถํฐ ํ์ตํ ์์ฑ์ด๋ผ๋๊ฒ์ ๋ํ๋
print(kn.classes_)
['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']
- Bream์ด ์ฒซ๋ฒ์งธ Class, Parkki๋ ๋๋ฒ์งธ Class๊ฐ ๋๋ ์์ ๋๋ค.
- predict() Method๋ Target๊ฐ์ผ๋ก๋ ์์ธก์ ์ถ๋ ฅํฉ๋๋ค. ํ๋ฒ ์์ธกํด ๋ณด๊ฒ ์ต๋๋ค.
print(kn.predict(test_scaled[:5]))
['Perch' 'Smelt' 'Pike' 'Perch' 'Perch']
- ์ด 5๊ฐ์ ์ํ์ ๋ํ ์์ธก์ ์ด๋ค ํ๋ฅ ๋ก ๋ง๋ค์ด์ก์๊น์?
- Scikit-learn์ ๋ถ๋ฅ๋ชจ๋ธ์ predict_, proba() method๋ก class๋ณ ํ๋ฅ ๊ฐ์ ๋ฐํํฉ๋๋ค.
- ํ๋ฒ, Test_set์ ์๋ ์ฒ์ 5๊ฐ์ ์ํ์ ๋ํ ํ๋ฅ ์ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค.
- Numpy์ round() ํจ์๋ ๊ธฐ๋ณธ์ผ๋ก ์์์ ์ฒซ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ์ ํ๋๋ฐ, decimals ๋งค๊ฐ๋ณ์๋ก ์ ์งํ ์์์ ์๋ ์๋ฆฟ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
# ํ๋ฅ ์ถ๋ ฅ์ predict_proba method ์ฌ์ฉ
# 5๊ฐ์ sample, 7๊ฐ์ ์์
import numpy as np
proba = kn.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=4))
[[0. 0. 1. 0. 0. 0. 0. ]
[0. 0. 0. 0. 0. 1. 0. ]
[0. 0. 0. 1. 0. 0. 0. ]
[0. 0. 0.6667 0. 0.3333 0. 0. ]
[0. 0. 0.6667 0. 0.3333 0. 0. ]]
- predict_proba() Method์ ์ถ๋ ฅ ์์๋ ์์ ๋ณด์๋ classes_ ์์ฑ๊ณผ ๊ฐ์ต๋๋ค.
- ์ฆ, ์ฒซ๋ฒ์งธ ์ด์ด 'Bream'์ ๋ํ ํ๋ฅ , ๋๋ฒ์งธ๋ 'Parkki'์ ๋ํ ํ๋ฅ ์ ๋๋ค.
- ์ด ๋ชจ๋ธ์ด ๊ณ์ฐํ ํ๋ฅ ์ด ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ด ๋ง๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. ํ๋ฒ 4๋ฒ์งธ ์ํ์ ์ต๊ทผ์ ์ด์์ Class๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
distances, indexes = kn.kneighbors(test_scaled[3:4])
print(train_target[indexes])
[['Roach' 'Perch' 'Perch']]
- ์ด ์ํ์ ์ด์์ ๋ค์ฏ๋ฒ์งธ Class์ธ 'Roach'๊ฐ 1๊ฐ์ด๊ณ , 'Perch'๊ฐ 2๊ฐ์ ๋๋ค.
- ๋ฐ๋ผ์ ๋ค์ฏ ๋ฒ์งธ ํด๋์ค์ ๋ํ ํ๋ฅ ์ 1/3, ์ฆ 0.333์ด๊ณ ์ธ๋ฒ์งธ ํด๋์ค์ ๋ํ ํ๋ฅ ์ 2/3 = 0.6667์ ๋๋ค.
- ์์ ์ถ๋ ฅํ ๋ค ๋ฒ์งธ ์ํ์ ํด๋์ค ํ๋ฅ ๊ณผ ๊ฐ์ต๋๋ค.
- ์ด๋ฐ ๋ฒ๊ฑฐ๋ก์ด ๊ณ์ฐ์ Scikit-learn์ด ์ํํด์ฃผ๋ฏ๋ก, predict_proba() Method๋ฅผ ํธ์ถํ๋ฉด ๊ทธ๋ง์ ๋๋ค.
- ๊ทผ๋ฐ, K-์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด ๋์ค๋ ํ๋ฅ ์ 0/3, 1/3, 2/3, 3/3์ด ์ ๋ถ์ ๋๋ค. ๋ญ๊ฐ ์ด์ํ๊ธด ํ๋ค์..
Logistic Regression (๋ก์ง์คํฑ ํ๊ท)
๋ก์ง์คํฑ ํ๊ท(Logistic Regression)๋ ํ๊ท์ด์ง๋ง, ๋ถ๋ฅ๋ชจ๋ธ ์ ๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ ํ ํ๊ตฌ์ ๋์ผํ๊ฒ ์ ํ ๋ฐฉ์ ์์ ํ์ตํฉ๋๋ค.
- ์ฌ๊ธฐ์ a,b,c,d,e๋ ๊ฐ์ค์น ํน์ ๊ณ์์ ๋๋ค. ํน์ฑ์ ๋์ด๋ฌ์ง๋ง, ๋ค์ค ํ๊ท(Multiple Regression)๋ฅผ ์ํ ์ ํ ๋ฐฉ์ ์๊ณผ ๊ฐ์ต๋๋ค.
- z์๋ ์ด๋ ํ ๊ฐ๋ ๋ค์ด๊ฐ ์ ์์ต๋๋ค. ๋ค๋ง, ํ๋ฅ ์ ๋ํ๋ด๋ ค๋ฉด 0~1 (0~100%)์ฌ์ด ๊ฐ์ด ๋์ด์ผ ํ๋ค.
- ๊ทผ๋ฐ, ๋ง์ฝ์ z๊ฐ ํฐ ์์๊ฐ ๋ ๋๋ 0์ด๋๊ณ , ํฐ ์์๊ฐ ๋ ๋ 1์ด ๋๋๋ก ๋ด๊พธ๋ ๋ฐฉ๋ฒ์ด ์์๊น์?
์ฌ๊ธฐ์ Sigmoid ํจ์ or Logistic ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฅํฉ๋๋ค.
- Sigmoid ํจ์ ์์๋ ์์ ์ ํ ๋ฐฉ์ ์์ ์ด์ฉํด์ z์ ์์๋ฅผ ์ฌ์ฉํ ํ, ์์ฐ ์์ e๋ฅผ ๊ฑฐ๋ญ์ ๊ณฑ ํ๊ณ 1์ ๋ํ ๊ฐ์ ์ญ์๋ฅผ ์ทจํฉ๋๋ค.
- z๊ฐ ๋ฌดํํ๊ฒ ํฐ ์์์ผ ๊ฒฝ์ฐ๋ 0์ ๊ฐ๊น์์ง๊ณ , z๊ฐ ๋ฌดํํ๊ฒ ํฐ ์์์ผ ๊ฒฝ์ฐ์๋ 1์ ๊ฐ๊น์ ์ง๋๋ค. z๊ฐ 0์ด๋ฉด ๊ฐ์ 0.5๊ฐ ๋์ต๋๋ค.
- Sigmoid ํจ์๋ ์ ๋๋ก 0~1 ์ฌ์ด๋ฅผ ๋ฒ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ 0~1 ์ฌ์ด ๊ฐ์ 0~100%๋ก ๋ณผ์ ์์ต๋๋ค.
- ํ๋ฒ Numpy ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ -5๊ฐ 5์ฌ์ด์ 0.1 ๊ฐ๊ฒฉ์ผ๋ก ๋ฐฐ์ด z๋ฅผ ๋ง๋ค๊ณ , ๋ค์ z ์์น๋ง๋ค Sigmoid ํจ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
import numpy as np
import matplotlib.pyplot as plt
z = np.arange(-5, 5, 0.1)
phi = 1 / (1+ np.exp(-z))
plt.plot(z, phi)
plt.xlabel('z')
plt.ylabel('phi')
plt.show()
- ์ด ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด Sigmoid ํจ์์ ์ถ๋ ฅ์ 0~1 ์ฌ์ด๋ก ๋ณํ๋๊ฒ์ ์ ์ ์์ต๋๋ค.
- ๊ทธ๋ฌ๋ฉด Logistic ํ๊ท ๋ชจ๋ธ์ ํ๋ จํด ๋ณด๊ฒ ์ต๋๋ค. Scikit-learn์์๋ ๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ธ Logistic Regression Class๋ฅผ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
- ํ๋ฒ ํ ์คํธ๋ก Sigmoid ํจ์์ ์ถ๋ ฅ์ด 0.5๋ณด๋ค ํฌ๋ฉด ์์ฑ, ์์ผ๋ฉด ์์ฑ์ผ๋ก ํ๋จํ ์ ์๊ฒ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค.
# ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ, Logistic ํ๊ท๋ก ์ด์ง ๋ถ๋ฅ ์ํ
char_arr = np.array(['A','B','C','D','E'])
print(char_arr[[True, False, True, False, False]])
['A' 'C']
- ์ ๋์ค๋๊ฒ์ ํ์ธํ์๊ณ , ์ด ๋ฐฉ์์ ์ฌ์ฉํด์ ๋๋ฏธ(Bream)์ ๋น์ด(Smelt)์ ํ์ ๋น๊ต ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ๊ณจ๋ผ๋ด๊ฒ ์ต๋๋ค.
bream_smelt_indexes = (train_target == 'Bream') | (train_target == 'Smelt')
train_bream_smelt = train_scaled[bream_smelt_indexes]
target_bream_smelt = train_target[bream_smelt_indexes]
- ๋น๊ต์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ฏธ & ๋น์ด ํ์ ๋ชจ๋ Ture๋ก ๋ด๊ฟ ์ ์์ต๋๋ค.
- ์ด๋ป๊ฒ ๊ณจ๋ผ๋ด๋๋ฉด, train_target == 'Bream' & train_target == 'Smelt' ์ด๋ ๊ฒ ์ฌ์ฉํด์ ๋ฐฐ์ด์ Bream, Smelt ์ธ๊ฒ์ True, ๋๋จธ์ง๋ False๋ก ๋ฐํํฉ๋๋ค.
- bream_smelt_indexes ๋ฐฐ์ด์ ์ฝ๋๋ฅผ ๋ณด์๋ฉด ์์ ์์ง๋ง, ๋๋ฏธ์ ๋น์ด์ผ ๊ฒฝ์ฐ 'True' ๋๋จธ์ง๋ 'False' ๊ฐ์ ๋ฐํํฉ๋๋ค.
- ๋ฐ๋ผ์, train_scaled, train_target ๋ฐฐ์ด์ ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ์ ์ ์ฉํ๋ฉด ๊ณจ๋ผ๋ผ ์ ์์ต๋๋ค.
- ์ด์ ์ด ๋ฐ์ดํฐ๋ก Logistic ํ๊ท ๋ชจ๋ธ์ ํ๋ จํด ๋ณด๊ฒ ์ต๋๋ค. LogisticRegression(๋ก์ง์คํฑ ํ๊ท) ํด๋์ค๋ ์ ํ๋ชจ๋ธ์ด๋ฏ๋ก sklearn.linear_model ํจํค์ง ์์ ์์ต๋๋ค.
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_bream_smelt, target_bream_smelt)
- ํ๋ จํ ๋ชจ๋ธ์ ์ฌ์ฉํด์ train_bream_smelt์ ์๋ ์ฒ์ 5๊ฐ ์ํ์ ์์ธกํด ๋ณด๊ฒ ์ต๋๋ค.
print(lr.predict(train_bream_smelt[:5]))
['Bream' 'Smelt' 'Bream' 'Bream' 'Bream']
- ๋๋ฒ์งธ Sample์ ์ ์ธํ๊ณ ๋ชจ๋ ๋๋ฏธ(Bream)๋ก ์์ธก ํ์ต๋๋ค.
- KNeighborsClassifier์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ธก ํ๋ฅ ์ predict_proba() Method์์ ์ ๊ณตํฉ๋๋ค.
- train_bream_smelt์์ ์ฒ์ 5๊ฐ์ Sample์ ์์ธก ํ๋ฅ ์ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค.
# ์ผ์ชฝ์ด ์์ฑ, ์ค๋ฅธ์ชฝ์ด ์์ฑ ๋ฐ์ดํฐ, ์์๋ 'Bream' 'Smelt' 'Bream' 'Bream' 'Bream'
print(lr.predict_proba(train_bream_smelt[:5]))
[[0.99759855 0.00240145]
[0.02735183 0.97264817]
[0.99486072 0.00513928]
[0.98584202 0.01415798]
[0.99767269 0.00232731]]
๊ฐ Sample๋ง๋ค 2๊ฐ์ ํ๋ฅ ์ด ์ถ๋ ฅ๋์์ต๋๋ค. ์ผ์ชฝ์ ์์ฑ(0), ์ค๋ฅธ์ชฝ์ ์์ฑ(1) ํด๋์ค์ ๋ํ ํ๋ฅ ์ ๋๋ค.
- ๊ทธ๋ฌ๋ฉด Bream, Smelt ์ค์ ์ด๋ค๊ฒ์ด ์์ฑ ํด๋์ค ์ผ๊น์?
- K-์ต๊ทผ์ ์ด์ ๋ถ๋ฅ๊ธฐ์์ , Scikit-learn์ Target๊ฐ์ ์ํ๋ฒณ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ฌ์ฉํฉ๋๋ค. classes_ ์์ฑ์ ์ฌ์ฉํ๋ฉด ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
print(lr.classes_)
['Bream' 'Smelt']
- ๋น์ด(Smelt)๊ฐ ์์ฑ ํด๋์ค ๋ผ๊ณ ๋์ต๋๋ค. predict_proba() Method๊ฐ ๋ฐํํ ๋ฐฐ์ด๊ฐ์ ๋ณด๋ฉด ๋๋ฒ์งธ Sample์์๋ง ์์ฑ์ธ ๋น์ด์ ํ๋ฅ ์ด ๋์ต๋๋ค. ๋๋จธ์ง๋ ๋ชจ๋ ๋๋ฏธ(Bream)์ด๊ฒ ๊ตฐ์.
- ๊ทธ๋ฌ๋ฉด, Logistic Regression์ผ๋ก ์ด์ง ๋ถ๋ฅ๋ฅผ ํ์ผ๋๊น, ์ ํํ๊ท์์ ํ๋๊ฒ ์ฒ๋ผ ๋ก์ง์คํฑ ํ๊ท๊ฐ ํ์ตํ ๊ณ์๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
# z = -0.404 x ๋ฌด๊ฒ - 0.576 x ๊ธธ์ด - 0.663 x ๋๊ฐ์ - 0.013 x ๋์ด - 0.732 x ๋๊ป - 2.161
print(lr.coef_, lr.intercept_)
[[-0.4037798 -0.57620209 -0.66280298 -1.01290277 -0.73168947]] [-2.16155132]
- Logistic ํ๊ท ๋ชจ๋ธ์ด ํ์ตํ ๋ฐฉ์ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฐฉ์ ์์ ๋ณด๋ฉด, Logistic ํ๊ท๋ ์ ํํ๊ท๋ ๋น์ทํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด LogisticRegression ๋ชจ๋ธ๋ก z๊ฐ ๊ณ์ฐ์ด ๊ฐ๋ฅํ ๊น์?
- LogisticRegression Class๋ decision_function() Method๋ก z๊ฐ์ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
- train_bream_smelt์ ์ฒ์ 5๊ฐ์ sample z๊ฐ์ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค.
decisions = lr.decision_function(train_bream_smelt[:5])
print(decisions)
[-6.02927744 3.57123907 -5.26568906 -4.24321775 -6.0607117 ]
- ์ด z๊ฐ์ Sigmoid ํจ์์ ๋ฃ์ผ๋ฉด ํ๋ฅ ์ ์ป์ ์ ์์ต๋๋ค.
- Python์ scipy(์ฌ์ดํ์ด) ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ Sigmoid ํจ์๊ฐ ์์ต๋๋ค. expit() ์ด๋ผ๋ Method ์ ๋๋ค.
- np.exp() ํจ์๋ฅผ ์ฌ์ฉํด ๋ถ์ ๊ณ์ฐ์ ํ๋ ๊ฒ๋ณด๋ค ์์ ํฉ๋๋ค. decision ๋ฐฐ์ด์ ๊ฐ์ ํ๋ฅ ๋ก ๋ณํํด ๋ณด๊ฒ ์ต๋๋ค.
# ๊ณ์ฐ์, z๊ฐ์ ์์ฑ class์ ๋ํ z๊ฐ๋ง ๊ณ์ฐ. ์ ํํจ์๋ ํ๋. ์์ฑ class์ ๋ํ z๊ฐ๋ง ๊ณ์ฐ
from scipy.special import expit
print(expit(decisions))
[0.00240145 0.97264817 0.00513928 0.01415798 0.00232731]
- ์ถ๋ ฅ๋ ๊ฐ๋ค์ ๋ณด๋ฉด predict_proba() method ์ถ๋ ฅ์ ๋ ๋ฒ์งธ ์ด(0.97264817)์ ๊ฐ๊ณผ ๋์ผํฉ๋๋ค.
- ์ฆ, decision_function() Method๋ ์์ฑ Class์ ๋ํ z ๊ฐ์ ๋ฐํํฉ๋๋ค.
Logistic Regression(๋ก์ง์คํฑ ํ๊ท-๋ค์ค ๋ถ๋ฅ)
Logistic Regression์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฟ์ง ํ๊ท์ ๊ฐ์ด ๊ณ์์ ์ ๊ณฑ์ ๊ท์ ํฉ๋๋ค. ์ด๋ฐ ๊ท์ ๋ฅผ L2 ๊ท์ ๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค.
- ๋ฆฟ์ง ํ๊ท์์๋ alpha ๋งค๊ฐ๋ณ์๋ก ๊ท์ ์ ์์ ์กฐ์ ํฉ๋๋ค. alpha๊ฐ ์ปค์ง๋ฉด ๊ท์ ๊ฐ ์ปค์ง๋๋ค.
- Logistic Regression์์ ๊ท์ ๋ฅผ ์ ์ดํ๋ ๋งค๊ฐ๋ณ์๋ c ์ ๋๋ค.
- ํ์ง๋ง, c๋ alpha์ ๋ฐ๋๋ก ์์์๋ก ๊ท์ ๊ฐ ์ปค์ง๋๋ค. c์ ๊ธฐ๋ณธ๊ฐ์ 1์ด์ง๋ง, ๊ท์ ์ํ๋ฅผ ์ํด์ 20์ผ๋ก ๋๋ ค์ ๊ณ์ฐํด ๋ณด๊ฒ ์ต๋๋ค.
lr = LogisticRegression(C=20, max_iter=1000)
lr.fit(train_scaled, train_target)
print(lr.score(train_scaled, train_target))
print(lr.score(test_scaled, test_target))
0.9327731092436975
0.925
- ์ด๋ฒ์๋ Training_set์ Test_set์ ๋ํ ์ ์๊ฐ ๋๊ณ , ๊ณผ๋์ ํฉ(Overfitting)์ด๋ ๊ณผ์์ ํฉ(Underfitting)์ผ๋ก ์น์ฐ์น๊ฒ ๊ฐ์ง ์์ต๋๋ค.
- ๋ค์์ผ๋ก, Test_set์ ์ฒ์ 5๊ฐ Sample์ ๋ํ ์์ธก๊ฐ์ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค.
print(lr.predict(test_scaled[:5]))
['Perch' 'Smelt' 'Pike' 'Roach' 'Perch']
- ํ ์คํธ ์ธํธ์ ์ฒ์ 5๊ฐ sample์ ๋ํ ์์ธก ํ๋ฅ ์ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค. ์์ซ์ ๋ค๋ฒ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ ํ๊ฒ ์ต๋๋ค.
proba = lr.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=3))
[[0. 0.014 0.841 0. 0.136 0.007 0.003]
[0. 0.003 0.044 0. 0.007 0.946 0. ]
[0. 0. 0.034 0.935 0.015 0.016 0. ]
[0.011 0.034 0.306 0.007 0.567 0. 0.076]
[0. 0. 0.904 0.002 0.089 0.002 0.001]]
- 5๊ฐ ์ํ์ ๋ํ ์์ธก์ด๋ฏ๋ก 5๊ฐ์ ํน์ด ์ถ๋ ฅ๋์์ต๋๋ค.
- ์์๋ถํฐ ํ์ผ๋ก 'Perch', 'Smelt', 'Pike', 'Roach', 'Perch' ์์ ๋๋ค.
print(lr.classes_)
['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']
- print๋ก classes_ ๊ฐ์ฒด๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ํด๋์ค์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ์ด๋ก๋ 'Bream', 'Parkki', 'Perch', 'Pike', 'Roach', 'Smelt', 'Whitefish' ์์์ ๋๋ค.
๋ณด๋ฉด, ์ฒซ๋ฒ์งธ sample์ 'Perch'๋ก ๊ฐ์ฅ ๋์ ํ๋ฅ ๋ก ์์ธก์ ํ์๊ณ , 3๋ฒ์งธ sample์ 'Pike'๋ก ๋์ ํ๋ฅ ๋ก ์์ธกํ์์ต๋๋ค.
- ๊ทธ๋ฌ๋ฉด ๋ค์ค ๋ถ๋ฅ์ธ ๊ฒฝ์ฐ ์ ํ ๋ฐฉ์ ์์ ์ด๋ค ๋ชจ์ต์ผ๊น์? coef_ ์ intercept_์ ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค.
print(lr.coef_.shape, lr.intercept_.shape)
(7, 5) (7,)
- ์ด ๋ฐ์ดํฐ๋ 5๊ฐ์ ํน์ฑ(sample)์ ์ฌ์ฉํ๋ฏ๋ก coef_๋ฐฐ์ด์ ์ด์ 5๊ฐ, ํ์ 7๊ฐ ์ ๋๋ค, intercept_๋ 7๊ฐ๊ฐ ์์ต๋๋ค.
- ์ฆ, ์ด๋ง์ ์ด์ง ๋ถ๋ฅ์์ ๋ณด์๋ z๋ฅผ 7๊ฐ๋ ๊ณ์ฐํ๋ค๋ ๋ง์ ๋๋ค.
- ๋ค์ค ๋ถ๋ฅ๋ ํด๋์ค๋ง๋ค z๊ฐ์ 1๊ฐ์ฉ ๊ณ์ฐํฉ๋๋ค. ์ด์ค ๊ฐ์ฅ ๋์ z ๊ฐ์ ์ถ๋ ฅํ๋ ํด๋์ค๊ฐ ์์ธก ํด๋์ค๊ฐ ๋ฉ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ฌ๊ธฐ์ ํ๋ฅ ์ ์ด๋ป๊ฒ ๊ณ์ฐํ ๊น์? ์ด์ง๋ถ๋ฅ๋ Sigmoid ํจ์๋ฅผ ์ฌ์ฉํด z๋ฅผ 0~1์ฌ์ด ํ๋ฅ ๊ฐ์ผ๋ก ๋ณํํฉ๋๋ค.
- ๋ค์ค๋ถ๋ฅ๋ ๊ทธ๋ฅ ์ด์ง๋ถ๋ฅ์ฒ๋ผ ๋๊ฐ์ด Sigmoid ํจ์๋ฅผ ์ฌ์ฉํด ํ๋ฅ ๊ฐ์ผ๋ก ๋ณํํ์ง๋ง. z๊ฐ์ ๊ฐ์๋งํผ ํ๋ฅ ๋ก ๋ณํํฉ๋๋ค.
Softmax ํจ์
Softmax ํจ์๋ z๊ฐ์ ์ง์ํจ์์ ์ ์ฉํ์ฌ ๊ณ์ฐํฉ๋๋ค. ๊ณ์ฐ๋ฐฉ์์ ํ์ด๋ณด๊ฒ ์ต๋๋ค.
- z๊ฐ ๊ฐ์์ ์ด๋ฆ์ z1, z2, ... z7๊น์ง ๋ถ์ด๊ฒ ์ต๋๋ค. (z๊ฐ์ 7๊ฐ)
- ๊ทธ๋ฆฌ๊ณ z1~z7๊น์ง ๊ฐ์ ์ฌ์ฉํด ์ง์ํจ์๋ฅผ ๋ชจ๋ ๋ํฉ๋๋ค. ๋ค ๋ํ ๊ฐ์ e_sum์ด๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ๊ฐ์ e_sum์ผ๋ก ๋๋์ด ์ฃผ๋ฉด ๋ฉ๋๋ค.
- ์ด์ ์ด์ง ๋ถ๋ฅ์์ decision_function() Method๋ก z1~z7 ๊น์ง์ ๊ฐ์ ๊ตฌํ ๋ค๋ฆ Softmax ํจ์๋ฅผ ์ฌ์ฉํด ํ๋ฅ ๋ก ๋ด๊พธ์ด ๋ณด๊ฒ ์ต๋๋ค.
- Test_set์ ์ฒ์ 5๊ฐ ์ํ์ ๋ํ z1~z7๊น์ง์ ๊ฐ์ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
# z๊ฐ ์ถ๋ ฅ, ์ ํํจ์ 7๊ฐ(๋ค์ค๋ถ๋ฅ) - 7๊ฐ์ ์ถ๋ ฅ. 5๊ฐ์ sample์ ๋ํ์ฌ 7๊ฐ์ ๊ฒฐ์ ํจ์(z)๊ฐ ์ถ๋ ฅ
decision = lr.decision_function(test_scaled[:5])
print(np.round(decision, decimals=2))
[[ -6.5 1.03 5.16 -2.73 3.34 0.33 -0.63]
[-10.86 1.93 4.77 -2.4 2.98 7.84 -4.26]
[ -4.34 -6.23 3.17 6.49 2.36 2.42 -3.87]
[ -0.68 0.45 2.65 -1.19 3.26 -5.75 1.26]
[ -6.4 -1.99 5.82 -0.11 3.5 -0.11 -0.71]]
- ๋ํ scipy๋ Softmax ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. spicy.special ์๋์ softmax()ํจ์๋ฅผ importํด ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
from scipy.special import softmax
proba = softmax(decision, axis=1)
print(np.round(proba, decimals=3))
[[0. 0.014 0.841 0. 0.136 0.007 0.003]
[0. 0.003 0.044 0. 0.007 0.946 0. ]
[0. 0. 0.034 0.935 0.015 0.016 0. ]
[0.011 0.034 0.306 0.007 0.567 0. 0.076]
[0. 0. 0.904 0.002 0.089 0.002 0.001]]
- ์์ ๊ตฌํ decision ๋ฐฐ์ด์ softmax() ํจ์์ ์ ๋ฌํ์ต๋๋ค.
- softmax()์ axis ๋งค๊ฐ๋ณ์๋ softmax๋ฅผ ๊ณ์ฐํ ์ถ์ ์ง์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ axis=1๋ก ์ง์ ํ์ฌ ๊ฐ ํ, ์ฆ ๊ฐ sample์ ๋ํด softmax๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ๋ง์ฝ, axis ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด? ๋ฒ ์ด ์ ์ฒด์ ๋ํด softmax๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ๋ํ, proba ๋ฐฐ์ด๊ณผ ๋น๊ตํด๋ ๊ฒฐ๊ณผ๊ฐ ์ผ์นํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ง๊ฒ ํ๋ จํ ๊ฒ์ด ๋ง์ต๋๋ค.
Keywords
- ๋ก์ง์คํฑ ํ๊ท๋ ์ ํ ๋ฐฉ์ ์์ ์ฌ์ฉํ ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ ํ ํ๊ท์ ๋ฌ๋ฆฌ ์๊ทธ๋ชจ์ด๋ ํจ์๋ ์ํํธ๋งฅ์ค ํ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค ํ๋ฅ ์ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
- ๋ค์ค ๋ถ๋ฅ๋ ํ๊น ํด๋์ค๊ฐ 2๊ฐ ์ด์์ธ ๋ถ๋ฅ ๋ฌธ์ ์ ๋๋ค. ๋ก์ง์คํฑ ํ๊ท๋ ๋์ค ๋ถ๋ฅ๋ฅผ ์ํด ์ํํธ๋งฅ์ค ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค๋ฅผ ์์ธกํฉ๋๋ค.
- ์๊ทธ๋ชจ์ด๋ ํจ์๋ ์ ํ ๋ฐฉ์ ์์ ์ถ๋ ฅ์ O๊ณผ 1 ์ฌ์ด์ ๊ฐ์ผ๋ก ์์ถํ๋ฉฐ ์ด์ง ๋ถ๋ฅ๋ฅผ ์ํด ์ฌ์ฉํฉ๋๋ค.
- ์ํํธ๋งฅ์ค ํจ์๋ ๋์ค ๋ถ๋ฅ์์ ์ฌ๋ฌ ์ ํ ๋ฐฉ์ ์์ ์ถ๋ ฅ ๊ฒฐ๊ดด๋ฅผ ์ ๊ทํํ์ฌ ํฉ์ด 1์ด ๋๋๋ก ๋ง๋ญ๋๋ค.
ํต์ฌ ํจํค์ง์ ํจ์
scikit-learn
- Logistic Regression์ ์ ํ ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ์ธ ๋ก์ง์คํด ํ๊ท๋ฅผ ์ํ ํด๋์ค์ ๋๋ค.
- solver ๋งค๊ฐ๋ณ์์์ ์์ฉํ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ‘lbfgs’์ ๋๋ค. ์ฌ์ดํท ๋ฐ 0.17 ๋ฒ์ ์ ์ถ๊ฐ๋ ‘sag’๋ ํ๋ฅ ์ ํ๊ท ๊ฒฝ์ฌ ํ๊ฐ๋ฒ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํน์ฑ๊ณผ ์ํ ์๊ฐ ๋ง์ ๋ ์ฑ๋ฅ์ ๋น ๋ฅด๊ณ ์ข์ต๋๋ค. ์ฌ์ดํท๋ฐ 0.19 ๋ฒ์ ์๋ ‘sag’์ ๊ฐ์ ๋ฒ์ ์ธ ‘saga’๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
- penalty ๋งค๊ฐ๋ณ์์์ L2 ๊ท์ (๋ฆฟ์ง ๋ฐฉ์)์ L1 ๊ท์ (๋ผ์๋ฐฉ์)๋ฅผ์ ํํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ L2 ๊ท์ ๋ฅผ ์๋ฏธํ๋ ‘12’์ ๋๋ค.
- c ๋งค๊ฐ๋ณ์์์ ๊ท์ ์ ๊ฐ๋๋ฅผ ์ ์ดํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 1.0์ด๋ฉฐ ๊ฐ์ด ์์์๋ก ๊ท์ ๊ฐ ๊ฐํด์ง ๋๋ค.
- predict_proba() ๋ฉ์๋๋ ์์ธก ํ๋ฅ ์ ๋ฐํํฉ๋๋ค. ์ด์ง ๋ถ๋ฅ์ ๊ฒฝ์ฐ์๋ ์ํ๋ง๋ค ์์ฑ ํด๋์ค์ ์์ฑ ํด๋์ค์ ๋ํ ํ๋ฅ ์ ๋ฐํํฉ๋๋ค. ๋ค์ค ๋ถ๋ฅ์ ๊ฒฝ์ฐ์๋ ์ํ๋ง๋ค ๋ชจ๋ ํด๋์ค์ ๋ํ ํ๋ฅ ์ ๋ฐํํฉ๋๋ค.
- decision function()์ ๋ชจ๋ธ์ด ํ์ตํ ์ ํ๋ฐฉ์ ์์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค. ์ด์ง ๋ถ๋ฅ์ ๊ฒฝ์ฐ ์์ฑ ํด๋์ค์ ํ๋ฅ ์ด ๋ฐํ ๋ฉ๋๋ค. ์ด ๊ฐ์ด 0๋ณด๋ค ํฌ๋ฉด ์์ฑ ํด๋์ค, ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์์ฑ ํด๋์ค๋ก ์์ธกํฉ๋๋ค. ๋ค์ค๋ถ๋ฅ์ ๊ฒฝ์ฐ ๊ฐํด๋์ค๋ง๋ค ์ ํ ๋ฐฉ์ ์์ ๊ณ์ฐํฉ๋๋ค. ๊ฐ์ฅ ํฐ ๊ฐ์ ํด๋์ค๊ฐ ์์ธก ํด๋์ค๊ฐ ๋ฉ๋๋ค.
๋ฐ์ํ
'๐น๏ธ ํผ๊ณต๋จธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํผ๊ณต๋จธ์ ] Decision Tree (๊ฒฐ์ ํธ๋ฆฌ) (0) | 2023.11.06 |
---|---|
[ํผ๊ณต๋จธ์ ] Stochastic Gradient Descent (ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ) (0) | 2023.11.05 |
[ML] ํน์ฑ ๊ณตํ๊ณผ ๊ท์ (0) | 2023.09.24 |
[ํผ๊ณต๋จธ์ ] Linear Regression (0) | 2023.09.23 |
[ํผ๊ณต๋จธ์ ] K-์ต๊ทผ์ ์ด์ ํ๊ท (0) | 2023.09.22 |