๐Ÿ’ป My Work/๐Ÿง  AI

[์ธ๊ณต์ง€๋Šฅ/ํ˜ผ๊ณต๋จธ์‹ ] 04-1. ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€

Jaeseo Kim 2022. 12. 8. 17:11

๐Ÿ“Œ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€

์„ ํ˜• ๋ฐฉ์ •์‹์„ ์‚ฌ์šฉํ•œ ๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์„ ํ˜• ํšŒ๊ท€์™€ ๋‹ฌ๋ฆฌ, ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜๋‚˜ ์†Œํ”„ํŠธ๋งฅ์Šค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ํ™•๋ฅ ์„ ๊ตฌํ•จ

 

 

๐Ÿ“๋ชฉํ‘œ! ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ƒ์„ ์ด ์žˆ์„ ๋•Œ, ํ•ด๋‹น ์ƒ์„ ์ด ๋ฌด์Šจ ์ข…๋ฅ˜์˜ ์ƒ์„ ์ธ์ง€ ํ™•๋ฅ ์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

* ์ฆ‰, ํƒ€๊นƒ ๋ฐ์ดํ„ฐ์— 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

csv ํŒŒ์ผ ์ผ๋ถ€ ) https://bit.ly/fish_csv_data

import pandas as pd

fish = pd.read_csv("https://bit.ly/fish_csv_data") # csv ํŒŒ์ผ์„ ํŒ๋‹ค์Šค ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์œผ๋กœ ์ฝ๊ธฐ
fish.head() # ์ฒ˜์Œ 5๊ฐœ ํ–‰ ์ถœ๋ ฅ

๊ฒฐ๊ณผ

์˜ค! ์ž˜ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ƒ์„ ์ด ์žˆ๋Š”์ง€ Species ์—ด์—์„œ ๊ณ ์œ ๊ฐ’์„ ์ถ”์ถœํ•˜์—ฌ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

# ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ƒ์„ ์ด ์žˆ๋Š”์ง€ ๊ณ ์œ ๊ฐ’ ์ถ”์ถœ
print(pd.unique(fish["Species"]))

์ƒ์„  ์ข…๋ฅ˜ 7๊ฐœ

๐Ÿ“ ๊ทธ๋Ÿผ ์šฐ๋ฆฐ ํ•ด๋‹น ์ƒ์„ ์ด ๋ฌด์Šจ ์ข…์ธ์ง€ ํ™•๋ฅ ์„ ๊ตฌํ•˜๋Š” ์ค‘์ด๊ธฐ ๋–„๋ฌธ์—, ํ•ด๋‹น ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์—์„œ 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 ๊ฐ’์„ ์–ป์—ˆ์œผ๋‹ˆ, ํ™•๋ฅ ์„ ์–ป๊ธฐ ์œ„ํ•ด ์‹œ๊ทธ๋ชจ์ด๋“œ ๊ณ„์‚ฐ์„ ํ•ด์ค๋‹ˆ๋‹ค. ์ด ๋˜ํ•œ, ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!๐Ÿ˜

 

๐Ÿ“ ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜ (ํ™•๋ฅ  ๊ณ„์‚ฐ)

์œ„์—์„œ ๊ตฌํ•œ ์–‘์„ฑ ํด๋ž˜์Šค์— ๋Œ€ํ•œ 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))

๊ฐ ์ƒ˜ํ”Œ์— ๋Œ€ํ•œ z1 ~ z7 ๊ฒฐ๊ณผ

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))

ํ™•๋ฅ  ๊ฒฐ๊ณผ

์•ž์—์„œ ํ•จ์ˆ˜๋กœ ์˜ˆ์ธกํ•œ ์˜ˆ์ธก ํ™•๋ฅ ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์ผ์น˜ํ•˜๋„ค์š”~!

์˜ˆ์ธก ํ™•๋ฅ 

๐Ÿ˜๐Ÿ˜๐Ÿ˜