๐ ๋ก์ง์คํฑ ํ๊ท
์ ํ ๋ฐฉ์ ์์ ์ฌ์ฉํ ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ
์ ํ ํ๊ท์ ๋ฌ๋ฆฌ, ์๊ทธ๋ชจ์ด๋ ํจ์๋ ์ํํธ๋งฅ์ค ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค ํ๋ฅ ์ ๊ตฌํจ
๐๋ชฉํ! ์ฌ๋ฌ ์ข ๋ฅ์ ์์ ์ด ์์ ๋, ํด๋น ์์ ์ด ๋ฌด์จ ์ข ๋ฅ์ ์์ ์ธ์ง ํ๋ฅ ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
* ์ฆ, ํ๊น ๋ฐ์ดํฐ์ 2๊ฐ ์ด์์ ํด๋์ค๊ฐ ํฌํจ๋ ๋ฌธ์
ex) [A, B, C] ํด๋์ค ๋ณ ์ด์์ ๋น์จ -> A:10%, B : 50%, C : 40% => ์์ธก : B
๋ฐ์ดํฐ ์ค๋นํ๊ธฐ
ํ๋ค์ค๋ก ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ ๋ฐฉ๋ฒ์ ์ฐธ๊ณ ํฉ๋๋ค.
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-3. ํน์ฑ ๊ณตํ๊ณผ ๊ท์
๐๋ค์ค ํ๊ท (Multiple Regression) ์ฌ๋ฌ ๊ฐ์ ํน์ฑ์ ์ฌ์ฉํ ์ ํ ํ๊ท ์๋๋ ์ ํ ํ๊ท์ ๋ํด ์์ฑํ ๊ธ์ ๋๋ค. ๐ [์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-2. ์ ํ ํ๊ท ์ฐ์ ๋ฐ์ดํฐ ์ค๋น ํ ํ๋ จ๊น์ง.. (03-1 ๋ด์ฉ
avoc-o-d.tistory.com
import pandas as pd
fish = pd.read_csv("https://bit.ly/fish_csv_data") # csv ํ์ผ์ ํ๋ค์ค ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ์ฝ๊ธฐ
fish.head() # ์ฒ์ 5๊ฐ ํ ์ถ๋ ฅ
์ค! ์ ๊ฐ์ ธ์์ต๋๋ค.
์๋์ ๊ฐ์ด ์ด๋ค ์ข ๋ฅ์ ์์ ์ด ์๋์ง Species ์ด์์ ๊ณ ์ ๊ฐ์ ์ถ์ถํ์ฌ ํ์ธํฉ๋๋ค.
# ์ด๋ค ์ข
๋ฅ์ ์์ ์ด ์๋์ง ๊ณ ์ ๊ฐ ์ถ์ถ
print(pd.unique(fish["Species"]))
๐ ๊ทธ๋ผ ์ฐ๋ฆฐ ํด๋น ์์ ์ด ๋ฌด์จ ์ข ์ธ์ง ํ๋ฅ ์ ๊ตฌํ๋ ์ค์ด๊ธฐ ๋๋ฌธ์, ํด๋น ๋ฐ์ดํฐ ํ๋ ์์์ Species ์ด์ ํ๊น์ผ๋ก ํ๊ณ ๋๋จธ์ง 5๊ฐ ์ด(Weight, Length, Diagonal, Height, Width) ์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ก ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
# ํ๊น ๋ฐ์ดํฐ
fish_target = fish["Species"].to_numpy()
# ์
๋ ฅ ๋ฐ์ดํฐ
fish_input = fish[["Weight","Length","Diagonal","Height","Width"]].to_numpy()
๐ ํ๋ จ๊ณผ ํ ์คํธ ์ธํธ๋ก ๋๋ ํ, ๋ณํ๊ธฐ๋ก ํ์คํ ์ ์ฒ๋ฆฌ(์ ๊ทํ)๊น์ง ํด์ค๋๋ค.
- โจ ๋ฐ์ดํฐํ๋ ์์์ 7๊ฐ ์์ ์ข ๋ฅ๋ฅผ ํ๊น ๋ฐ์ดํฐ๋ก ํ์ฃ . ๊ทธ๋ผ, ํ๊น ๋ฐ์ดํฐ๋ฅผ ํ๋ จ, ํ ์คํธ ์ธํธ๋ก ๋๋๋๊น ํ๋ จ, ํ ์คํธ ์ธํธ์๋ ๋น์ฐํ 7๊ฐ ์์ ์ข ๋ฅ๋ฅผ ๊ฐ๊ฐ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
- ๊ผญ ํ๋ จ ์ธํธ์ ํต๊ณ ๊ฐ์ผ๋ก ํ ์คํธ ์ธํธ๋ฅผ ๋ณํํด์ค๋๋ค~!
# ํ๋ จ, ํ
์คํธ ์ธํธ ๋๋๊ธฐ
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)
# ์ ๊ทํ
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input) # ํ๋ จ ์ธํธ์ ํต๊ณ ๊ฐ์ผ๋ก ํ๋ จ ํ ๋ณํ๊ธฐ๋ก ํ
์คํธ ์ธํธ๋ฅผ ๋ณํํด์ค์ผ ํจ
๐ k-์ต๊ทผ์ ์ด์ ๋ถ๋ฅ๊ธฐ์ ํ๋ฅ ์์ธก
์ต๊ทผ์ ์ด์ ๊ฐ์๋ฅผ 3๊ฐ๋ก ์ง์ ํ์ฌ ํ๋ จ ํ๊ฒ ์ต๋๋ค.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier(n_neighbors=3) # ์ต๊ทผ์ ์ด์ ๊ฐ์ 3
kn.fit(train_scaled, train_target)
ํด๋์ค ํ๋ฅ ์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ฏ๋ก, ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ ์ ์๋ ์ ์ ์๊ณ ...
๐ ๋ค์ค ๋ถ๋ฅ
ํ๊น ๋ฐ์ดํฐ์ 2๊ฐ ์ด์์ ํด๋์ค๊ฐ ํฌํจ๋ ๋ฌธ์
* 7๊ฐ ์์ ์ข ๋ฅ๋ฅผ ํ๊น ๋ฐ์ดํฐ๋ก ํ์์ฃ . ๐
๐ค ์๋ฌธ ? ์ด์ง ๋ถ๋ฅ์ ๋ค์ค ๋ถ๋ฅ์ ์ฐจ์ด์ ์?
๐ก ๋๋ต ! ์ด์ง ๋ถ๋ฅ๋ ํ๊น ๋ฐ์ดํฐ๋ฅผ ์์ฑ ํด๋์ค(1)์ ์์ฑ ํด๋์ค(0)๋ก ์ง์ ํฉ๋๋ค. ๋ค์ค ๋ถ๋ฅ๋ ํด๋์ค๋ฅผ ๋ฌธ์์ด๋ก ๋ ํ๊น๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. (์ซ์๋ก๋ ๊ฐ๋ฅ)
๐ ์ฃผ์ํ ์ ! ๋ค์ค ๋ถ๋ฅ์์ ํ๊น๊ฐ์ ๋ฌธ์์ด ๊ทธ๋๋ก ์ฌ์ฉํ์ฌ ์ ๋ฌํ๋ฉด ์์๊ฐ ์๋์ผ๋ก ์ํ๋ฒณ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ฉ๋๋ค.
๐ k-์ต๊ทผ์ ์ด์ ๋ถ๋ฅ๊ธฐ์ classes_ : ์ ๋ ฌ๋ ํ๊น๊ฐ
๊ทธ๋ผ, ํ ์คํธ ์ธํธ์ ์๋ ์ฒ์ 5๊ฐ ์ํ์ ํ๊น๊ฐ์ ์์ธกํ๊ฒ ์ต๋๋ค.
print(kn.predict(test_scaled[:5]))
ํ๊น๊ฐ ๊ทธ๋๋ก๋ฅผ ์ฌ์ฉํ์ฌ ์์ธกํด์ฃผ๋ค์! ์์ฃผ ํธ๋ฆฌํฉ๋๋ค.
๐ค ์๋ฌธ? ๊ทธ๋ฐ๋ฐ, ์ 5๊ฐ ์ํ์ ์์ธก์ ์ด๋ค ํ๋ฅ ๋ก ๋ง๋ค์ด์ง ๊ฑธ๊น์? ์ฆ, ํด๋์ค ํ๋ฅ ์์ธก์ ์ด๋ป๊ฒ ํ ๊ฑด๊ฐ์?
๐ก ๋๋ต ! predict_proba() ์ผ๋ก ๊ฐ ํด๋์ค์ ๋ํ ํ๋ฅ ์ ํ์ธํด๋ณด๊ณ , ๊ทธ ์ค ๊ฐ์ฅ ๋์ ํ๋ฅ (๊ฐ์ฅ ๊ฐ๊น์ด ์ด์์ ๋น์จ)์ ํด๋์ค๊ฐ ์์ธก๊ฐ์ผ๋ก ์ ๋์จ ๊ฒ ๋ง๋์ง ๋น๊ตํ๊ฒ ์ต๋๋ค.
๐ ์ฌ์ดํท๋ฐ ๋ถ๋ฅ ๋ชจ๋ธ์ predict_proba() : ํด๋์ค๋ณ ํ๋ฅ ๊ฐ ๋ฐํ
import numpy as np
proba = kn.predict_proba(test_scaled[:5])
print("\n๊ฐ classes ์ ๋ํ ํ๋ฅ ")
print(kn.classes_)
print(np.round(proba, decimals = 4)) # ๋ค์ฏ ๋ฒ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ : ์์์ ๋ค ๋ฒ์งธ ์๋ฆฌ๊น์ง ํ๊ธฐ
๋ค ๋ฒ์งธ ์ํ์ ์ต๊ทผ์ ์ด์ ํด๋์ค๋ค์ ํ์ธํ๊ฒ ์ต๋๋ค.
distances, indexes = kn.kneighbors(test_scaled[3:4])
print(train_target[indexes])
์ด ์ํ์ ์ต๊ทผ์ ์ด์์ "Roach" 1๊ฐ, "Perch" 2๊ฐ๋ค์.
์ฆ, "Roach" ์ ๋ํ ํ๋ฅ 1/3 = 0.3333, "Perch" ์ ๋ํ ํ๋ฅ 2/3 = 0.6667
๋ค ๋ฒ์งธ ์ํ์ ํด๋์ค ํ๋ฅ ๊ณผ ๊ฐ๋ค์! ํด๋์ค ์์ธก ํ๋ฅ ์ฑ๊ณต!
๐ค ๋ฌธ์ ์ ? ํ์ฌ๋ 3๊ฐ์ ์ต๊ทผ์ ์ด์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฅํ ํ๋ฅ ์ด 0/3, 1/3, 2/3, 3/3 ๋ฐ์ ์ ๋ฉ๋๋ค.
๐ก ๋ก์ง์คํฑ ํ๊ท๋ฅผ ํ์ตํด๋ด ์๋ค!
๐ ๋ก์ง์คํฑ ํ๊ท (Logistic Regression)
์ ํ ํ๊ท์ ๋์ผํ๊ฒ ์ ํ ๋ฐฉ์ ์์ ํ์ตํ๋ ๋ถ๋ฅ ๋ชจ๋ธ์ ๋๋ค. (์ด๋ฆ๋ง ํ๊ท์ผ ๋ฟ)
* ์ ํ ๋ฐฉ์ ์์ ์์ ) z = a x (ํน์ฑ1) + b x (ํน์ฑ2) + c x (ํน์ฑ3) + d ์ ๊ฐ์ ์ ํ ๋ฐฉ์ ์์ด ์์ ๋, a, b, c๋ ๊ฐ์ค์น(๊ณ์) ์ ๋๋ค. ํน์ฑ์ด ๋์ด๋ ๋ค์ค ํ๊ท๋ฅผ ์ํ ์ ํ ๋ฐฉ์ ์๊ณผ ๊ฐ์ฃ !
์ฉ์ด๊ฐ ํท๊ฐ๋ฆด ์ ์์ผ๋ ์๋๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
๐ z = a x Weight + b x Length + c x Diagonal + d x Height + e x Width + f
- ๊ฐ์ ๊ฐ๋ ์ผ๋ก a,b,c,d,e ๋ ๊ฐ์ค์น์ ๋๋ค.
- ํด๋์ค ์์ธก ํ๋ฅ ์ ์ํด, z๋ ํ๋ฅ ์ด ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฒ์๊ฐ 0~1 (0~100%) ์ด์ด์ผ ํฉ๋๋ค.
- z๊ฐ ์์ฃผ ํฐ ์์์ผ ๋ 0์ด ๋๊ณ , ์์ฃผ ํฐ ์์์ผ ๋ 1์ด ๋๋๋ก ์๊ทธ๋ชจ์ด๋ ํจ์(๋ก์ง์คํฑ ํจ์)๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. โจ
๐ ์๊ทธ๋ชจ์ด๋ ํจ์(๋ก์ง์คํฑ ํจ์)
๐z ๊ฐ์ ๋ํ ํ๋ฅ ๊ฐ์ผ๋ก ๊ณ์ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์, ( x : z, y : ํ๋ฅ ๊ฐ )์ด ๋๊ฒ ๋ค์.
z๊ฐ ๋ฌดํํ๊ฒ ํฐ ์์์ผ ๊ฒฝ์ฐ ํ๋ฅ ๊ฐ์ 0 ์ ๊ฐ๊น์์ง๊ณ , ๋ฌดํํ๊ฒ ํฐ ์์์ผ ๊ฒฝ์ฐ 1 ์ ๊ฐ๊น์์ง๋๋ค.
z๊ฐ 0 ์ผ ๊ฒฝ์ฐ 0.5 ๊ฐ ๋๋ค์. ์ฆ, 0~1 ์ด๊ธฐ ๋๋ฌธ์ 0~100% ํ๋ฅ ๋ก ํด์ํ ์ ์๊ฒ ๋์ต๋๋ค.๐
๊ทธ๋ผ, ๋ค์ค ๋ถ๋ฅ๋ฅผ ์ํํ๊ธฐ ์ ์ ๋จผ์ ์ด์ง ๋ถ๋ฅ๋ก ์ํ์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!โจ
๐ ๋ก์ง์คํฑ ํ๊ท๋ก ์ด์ง ๋ถ๋ฅ ์ํํ๊ธฐ
๐ ์์๊ฐ๊ธฐ
์ด์ง ๋ถ๋ฅ(0 ํน์ 1)๋ฅผ ์ํด, ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ ๋ฐฉ์์ผ๋ก ํ๋ จ ์ธํธ์์ ๋๋ฏธ์ ๋น์ด์ ํ๋ง ๊ณจ๋ผ๋ด๊ฒ ์ต๋๋ค.
๐ ๋ํ์ด์ ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ : true, false ๊ฐ์ ์ ๋ฌํ์ฌ ํ์ ์ ํ
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] # ํ๊น ๋ฐ์ดํฐ ์ค์์ ๋๋ฏธ์ ๋น์ด
๐ ํ๋ จ
๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ ํ๋ จํด๋ณด๊ฒ ์ต๋๋ค.
๐ ์ฌ์ดํท๋ฐ์ LogisticRegression : ์ ํ ๋ชจ๋ธ
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_bream_smelt, target_bream_smelt)
๐ ์์ธก
์ฒ์ 5๊ฐ ์ํ์ ์์ธกํด๋ณด๊ณ , ํด๋์ค ์์ธก ํ๋ฅ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐ ์ฌ์ดํท๋ฐ์ predict_proba() : ์ด์ง ๋ถ๋ฅ์์ ์์ฑ ํด๋์ค์ ์์ฑ ํด๋์ค์ ๋ํ ํ๋ฅ ๋ฐํ
# ์ฒ์ 5๊ฐ ์ํ ์์ธก
print(lr.predict(train_bream_smelt[:5]))
# ํด๋์ค ์์ธก ํ๋ฅ
# ์ํ๋ฒณ์์ผ๋ก ์ ๋ ฌ๋ ํ๊น๊ฐ๋๋ก 0, 1 ์ด ์ ํด์ง
# ์์ฑ ํด๋์ค(0) | ์์ฑ ํด๋์ค(1)์ ๋ํ ํ๋ฅ
print(lr.classes_)
print(lr.predict_proba(train_bream_smelt[:5]))
5๊ฐ ์ํ ์ค์ ๋ ๋ฒ์งธ ์ํ๋ง ์์ฑ ํด๋์ค์ธ ๋น์ด์ ํ๋ฅ ์ด ๋๋ค๊ณ ํฉ๋๋ค.
๊ทธ๋ผ, ์์ธก์ด ๋ง๋์ง ์ง์ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
๐ ์ ํ ๋ฐฉ์ ์ ์ธ์ฐ๊ธฐ
๋ก์ง์คํฑ ํ๊ท๊ฐ ํ์ตํ ์ ํ ๋ฐฉ์ ์์ ๊ณ์๋ฅผ ํ์ธ ํ, ๋ฐฉ์ ์์ ์์ฑํ๊ฒ ์ต๋๋ค.
print(lr.coef_, lr.intercept_)
โจ z = -0.404x(Weight) -0.576x(Length) -0.663x(Diagonal) -1.013x(Height) -0.732x(Width) -2.161
ํ๋ฅ ์ ์ป๊ธฐ ์ํด ์๊ทธ๋ชจ์ด๋ ๊ณ์ฐ์ ํ๋ ค๋ฉด, z ๊ฐ์ ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ณ์ฐ์ ํด์ค๋๋ค.
๐ ์ง์ ๊ณ์ฐํ์ง ์์๋, z ๊ฐ์ ๋ฐํํ๋ ํจ์๊ฐ ์์ต๋๋ค.
๐ z ๊ณ์ฐ
๐ ์ฌ์ดํท๋ฐ์ decision_function() : (์ด์ง ๋ถ๋ฅ) ์์ฑ ํด๋์ค์ ๋ํ z ๊ฐ์ ๋ฐํ
๐ค ์ ์์ฑ ํด๋์ค์ ๋ํ ๊ฐ๋ง ๋ฐํํ๋์ง๋ ๋ฐ์์ ํ์ธํ๊ฒ ์ต๋๋ค.
decisions = lr.decision_function(train_bream_smelt[:5])
print(decisions)
์์ฑ ํด๋์ค์ ๋ํ z ๊ฐ์ ์ป์์ผ๋, ํ๋ฅ ์ ์ป๊ธฐ ์ํด ์๊ทธ๋ชจ์ด๋ ๊ณ์ฐ์ ํด์ค๋๋ค. ์ด ๋ํ, ํจ์๊ฐ ์์ต๋๋ค!๐
๐ ์๊ทธ๋ชจ์ด๋ ํจ์ (ํ๋ฅ ๊ณ์ฐ)
์์์ ๊ตฌํ ์์ฑ ํด๋์ค์ ๋ํ z๊ฐ์ ์๊ทธ๋ชจ์ด๋ ํจ์์ ์ ๋ฌํ์ฌ ํ๋ฅ ๊ฐ์ ๋ฐ์ต๋๋ค.
๐ ํ์ด์ฌ ์ฌ์ดํ์ด์ expit() : ์๊ทธ๋ชจ์ด๋ ํจ์, z ๊ฐ์ 0~1(ํ๋ฅ )๋ก ๋ณํ
from scipy.special import expit
print(expit(decisions))
์ถ๋ ฅ๋ ๊ฐ์ ๋ณผ๊น์? ์๊น ์ถ๋ ฅํ๋ ์์ฑ, ์์ฑ ํด๋์ค์ ๋ํ ํ๋ฅ ๊ฒฐ๊ณผ์ ๋ ๋ฒ์งธ ์ด์ ๊ฐ๊ณผ ์ผ์นํ๋ค์! (๋ ๋ฒ์งธ ์ด์ ์์ฑ ํด๋์ค ๊ฐ์ด์ฃ .)
๐ก ๋ฆฌ๋ง์ธ๋ ! ์ ๊ฒฐ๊ณผ๋ก๋ถํฐ z ๊ฐ์ ๋ฐํํ๋ decision_function() ํจ์๋ ์์ฑ ํด๋์ค์ ๋ํ z๊ฐ์ ๋ฐํํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
๊ทธ๋ผ 7๊ฐ์ ์์ ์ข ๋ฅ๋ฅผ ๋ถ๋ฅํ๋ ๋ค์ค ๋ถ๋ฅ ๋ฌธ์ ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค~!
๐ ๋ก์ง์คํฑ ํ๊ท๋ก ๋ค์ค ๋ถ๋ฅ ์ํํ๊ธฐ
๐ ์์๊ฐ๊ธฐ
01. LogisticRegression ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๋ณต์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๋ฐ๋ณต ํ์๋ฅผ ์์๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์ถฉ๋ถํ๊ฒ ํ๋ จ์ํค๊ธฐ ์ํด 1,000์ผ๋ก ์ง์ ํ๊ฒ ์ต๋๋ค.
๐ LogisticRegression ํด๋์ค์ ๋งค๊ฐ๋ณ์ max_iter : ๋ฐ๋ณต ํ์ ์ง์ (๊ธฐ๋ณธ๊ฐ : 100)
02. LogisticRegression ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก (๋ฆฟ์ง ํ๊ท์ฒ๋ผ) ๊ณ์์ ์ ๊ณฑ์ ๊ท์ (L2 ๊ท์ )ํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๊ท์ ์ ์์ ์์๋ก ์ง์ ํ ์ ์์ต๋๋ค. ๊ท์ ๋ฅผ ์ํํ๊ธฐ ์ํด 20์ผ๋ก ์ง์ ํ๊ฒ ์ต๋๋ค.
๐ LogisticRegression ํด๋์ค์ ๋งค๊ฐ๋ณ์ C : ๊ท์ ์ ์ ์กฐ์ (๊ธฐ๋ณธ๊ฐ : 1), C ↑ => ๊ท์ ↓
- ๐ค ๋ฆฟ์ง ํ๊ท์์ ์ฐจ์ด์ ?
- ๋ฆฟ์ง ํ๊ท : ๋งค๊ฐ๋ณ์ alpha, alpha ↑ => ๊ท์ ↑
- LogisticRegression : ๋งค๊ฐ๋ณ์ C, C ↑ => ๊ท์ ↓
๐ ํ๋ จ
ํ๋ จ ํ, ๋ถ๋ฅ ๋ชจ๋ธ์ด๋๊น ์ ์๋ ํ์ธํ๊ฒ ์ต๋๋ค.
# ํ๋ จ
lr = LogisticRegression(C = 20, max_iter = 1000)
lr.fit(train_scaled, train_target)
๊ณผ๋ ์ ํฉ์ด๋ ๊ณผ์ ์ ํฉ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์์๋ค์!
๊ทธ๋ผ ํ ์คํธ ์ธํธ์ ์ฒ์ 5๊ฐ ์ํ์ ๋ํ ์์ธก๊ณผ ์์ธก ํ๋ฅ ์ ์ถ๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
๐ ์์ธก
# 5๊ฐ ์ํ ์์ธก
print(lr.predict(test_scaled[:5]))
# 5๊ฐ ์ํ ์์ธก ํ๋ฅ
print(lr.classes_) # ํด๋์ค ํ์ธ
print(lr.predict_proba(test_scaled[:5]).round(decimals = 3)) # ์์์ ๋ค ๋ฒ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ
์์ ์ด 7์ข ๋ฅ(ํด๋์ค)์ด๋๊น 7๊ฐ์ ์ด๋ก ์ ๋์๋ค์~!
- [์์ธก ํ๋ฅ ] ํ : ์ํ 5๊ฐ, ์ด : ๊ฐ ํด๋์ค ํ๋ฅ 7๊ฐ
- ์ฒซ ๋ฒ์งธ ์ํ์ ๋ํ ์์ธก๊ฐ๊ณผ ์์ธก ํ๋ฅ ๊ฐ์ ๋น๊ตํด๋ณด๋ ์ ์์ธก๋์์ต๋๋ค!
- [์์ธก]์์ ์ฒซ ๋ฒ์งธ ์ํ์ ์์ธก๊ฐ์ด Perch์ ๋๋ค.
- [์์ธก ํ๋ฅ ]์์ ์ฒซ ๋ฒ์งธ ์ํ์ ์์ธก ํ๋ฅ ๊ฐ ์ค, ์ธ ๋ฒ์งธ ์ด(Perch)์ ๊ฐ์ฅ ๋์ ํ๋ฅ ๋ก ์์ธกํ์ต๋๋ค.(84.1%)
๊ทธ๋ผ, ์์ธก์ด ๋ง๋์ง ์ง์ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
๐ ์ ํ ๋ฐฉ์ ์ ์ธ์ฐ๊ธฐ
์ ํ ๋ฐฉ์ ์์ ๋ชจ์ต์ ์ด๋จ๊น์? ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
print(lr.coef_.shape, lr.intercept_.shape)
- ํ : ํด๋์ค 7๊ฐ, ์ด : ํน์ฑ๊ณผ ๊ณฑํด์ง๋ ๊ณ์ 5๊ฐ
- ์ฆ, ํด๋์ค๋ง๋ค ์ ํ ๋ฐฉ์ ์์ ๋ง๋ค์ด z๊ฐ์ ํ๋์ฉ ๊ณ์ฐํฉ๋๋ค. (์๋ ๊ทธ๋ฆผ ์ฐธ๊ณ )
๐ z ๊ณ์ฐ
๐ ์ฌ์ดํท๋ฐ์ decision_function() : (๋ค์ค ๋ถ๋ฅ) ๊ฐ ์ํ์ ๋ํ ๋ชจ๋ ํด๋์ค์ z๊ฐ์ ๋ฐํ
decision = lr.decision_function(test_scaled[:5])
print(np.round(decision, decimals=2))
z๋ ๊ตฌํ์ผ๋, ์ด์ ํ๋ฅ ์ ๊ตฌํด์ผ๊ฒ ์ฃ !
๐ ์ํํธ๋งฅ์ค ํจ์ (ํ๋ฅ ๊ณ์ฐ)
๐ ํ์ด์ฌ ์ฌ์ดํ์ด์ softmax() : ์ํํธ๋งฅ์ค ํจ์, 1๊ฐ์ ์ํ์ ๋ํ ๋ชจ๋ ํด๋์ค์ z ๊ฐ์ 0~1(ํ๋ฅ )๋ก ๋ณํ
- ๋งค๊ฐ๋ณ์ axis : 1๋ก ์ง์ ํ์ฌ ๊ฐ ํ(์ํ)์ ๋ํด ์ํํธ๋งฅ์ค๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ง์ ํ์ง ์์ผ๋ฉด, ๋ฐฐ์ด ์ ์ฒด์ ๋ํด ์ํํธ๋งฅ์ค ๊ณ์ฐ์ ํฉ๋๋ค.
๐ค ์ด์ค ๋ถ๋ฅ์์ ์๊ทธ๋ชจ์ด๋ ํจ์์์ ์ฐจ์ด์ ?
- ์๊ทธ๋ชจ์ด๋ : ํ๋์ ์ ํ ๋ฐฉ์ ์์ ์ถ๋ ฅ๊ฐ์ 0~1๋ก ๋ณํ
- ์ํํธ๋งฅ์ค : ์ฌ๋ฌ ๊ฐ์ ์ ํ ๋ฐฉ์ ์์ ์ถ๋ ฅ๊ฐ์ 0~1๋ก ๋ณํํ๊ณ , ์ ์ฒด ํฉ์ด 1์ด ๋๋๋ก ๋ง๋ฆ (์ง์ ํจ์ ์ฌ์ฉ)
from scipy.special import softmax
proba = softmax(decision, axis = 1) # ์ํํธ๋งฅ์ค ๊ณ์ฐํ ์ถ์ ์ง์ => 1 : ๊ฐ ์ํ(ํ)์ ๋ํด ๊ณ์ฐ
print(np.round(proba, decimals = 3))
์์์ ํจ์๋ก ์์ธกํ ์์ธก ํ๋ฅ ๊ณผ ๋น๊ตํ์ ๋, ์ผ์นํ๋ค์~!
๐๐๐
'๐ป My Work > ๐ง AI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 04-2. ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ (2) (0) | 2022.12.09 |
---|---|
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 04-2. ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ (1) (0) | 2022.12.09 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-3. ํน์ฑ ๊ณตํ๊ณผ ๊ท์ (0) | 2022.12.07 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-2. ์ ํ ํ๊ท (0) | 2022.12.05 |
[์ธ๊ณต์ง๋ฅ/ํผ๊ณต๋จธ์ ] 03-1. k-์ต๊ทผ์ ์ด์ ํ๊ท (0) | 2022.12.05 |