[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 4. ํŒŒ์ด์ฌ์œผ๋กœ ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ!

2020. 1. 25. 22:52ยท๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹
728x90

 ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๋“œ๋””์–ด ๋งˆ์นจ๋‚ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์„น์…˜์—์„œ ๊ณต๋ถ€ํ•œ ์ˆ˜์‹๋“ค์„ ํŒŒ์ด์ฌ ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ๋จธ์‹ ๋Ÿฌ๋‹์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฐ์ดํ„ฐ ์ค‘ ํ•˜๋‚˜์ธ ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ์…‹์„ ํ•™์Šต์‹œํ‚ค๋Š” ๊ฒƒ ๊นŒ์ง€ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 ๊ฐ์ž ์•ž ์„ธ์…˜์—์„œ ์ด์•ผ๊ธฐํ•œ ์•„๋‚˜์ฝ˜๋‹ค๋‚˜ ํŒŒ์ด์ฌ์„ ์„ค์น˜ํ•˜์…”๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ์ €๋Š” google colaboratory๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜์—†์ด ๊ฐ„ํŽธํ•˜๋‹ˆ ์‚ฌ์šฉํ•˜์…”๋„ ์ข‹์Šต๋‹ˆ๋‹ค :) https://colab.research.google.com/

 

Google Colaboratory

 

colab.research.google.com

 

1. ๊ฐ์ฒด ์ง€ํ–ฅ ํผ์…‰ํŠธ๋ก  API

 ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ์ „์—, ๋จผ์ € ๊ฐ„๋‹จํ•œ ์‚ฌ์ „ ์ฝ”๋“œ ์ •์˜์— ๋Œ€ํ•ด์„œ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ Perception ํด๋ž˜์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ ํ›„ fit ๋ฉ”์„œ๋“œ๋กœ ํ•™์Šตํ•˜๊ณ , predict ๋ฉ”์„œ๋“œ๋กœ ์˜ˆ์ธกํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š”๊ฒŒ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ์†์„ฑ์€ ์–ธ๋”๋ฐ”(_)๋ฅผ ์ถ”๊ฐ€ํ•ด ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

 eta ๋ณ€์ˆ˜๋Š” ํ•™์Šต๋ฅ ๋กœ float ์ž๋ฃŒํ˜•์„ ๊ฐ–๊ณ , n_iter ์€ intํ˜•์œผ๋กœ epoch๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. random_state ๋Š” intํ˜•์œผ๋กœ ๊ฐ€์ค‘์น˜๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ์ž…๋‹ˆ๋‹ค. w_๋Š” ํ•™์Šต๋œ ๊ฐ€์ค‘์น˜ ๋ฒกํ„ฐ๊ณ , errors_๋Š” ๋ˆ„์ ๋œ ์˜ค๋ฅ˜๋“ค์„ ๋ฒกํ„ฐ๋กœ ์ €์žฅํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋จผ์ € ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฌ๊ณ , ๊ทธ ๋‹ค์Œ์— ํ•ด์„ค์„ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

import numpy as np

class Perceptron(object):

"""
eta : float
n_iter : int
random_state : int
w_ : 1d-array
errors_ : list
"""

    def __init__(self, eta = 0.01, n_iter = 50, random_state = 1):
        self.eta = eta
        self.n_iter = n_iter
        self.random_state = random_state
    
    """
    X : {array-like}, shape = [n_samples, n_feaures] -> {}์•ˆ์— ๋ฐ์ดํ„ฐ, n_samples๊ฐœ ์ƒ˜ํ”Œ๊ณผ n_features๊ฐœ์˜ ํŠน์„ฑ, ํ›ˆ๋ จ๋ฐ์ดํ„ฐ
    y : array-like, shape = [n_samples] -> {}์•ˆ์— ๋ฐ์ดํ„ฐ, n_samples๊ฐœ์˜ ์ •๋‹ต ํƒ€๊นƒ
    """

    def fit(self, X, y):
        rgen = np.random.RandomState(self.random_state)
        self.w_ = rgen.normal(loc = 0.0, scale = 0.01, size = 1 + X.shape[1])
        self.errors_ = []
        for _ in range(self.n_iter):
            errors = 0
            for xi, target in zip(X, y):
                update = self.eta * (target - self.predict(xi))
                self.w_[1:] += update * xi
                self.w_[0] += update
                errors += int(update != 0.0)
            self.errors.append(errors)
    return self

    def net_input(self, X):
        return np.dot(X, self.w_[1:] + self.w_[0])
    
    def predict(self, X):
        return np.where(self.net_input(X) >= 0.0, 1, -1)

 ๋จผ์ €, fit ํ•จ์ˆ˜์—์„œ self.w_ ๋กœ ํ‘œํ˜„๋œ ๊ฐ€์ค‘์น˜๋Š” ๋ฒกํ„ฐ R^(m+1)๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. m์€ ๋ฐ์ดํ„ฐ ์…‹์˜ ์ฐจ์›์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. 2์ฐจ์›๋ฐ์ดํ„ฐ๋ผ๋ฉด R์€ R^3์ด ๋˜๊ฒ ์ฃ . size ์— 1์„ ๋”ํ•œ ์ด์œ ๋Š” ์•ž์„  ์„น์…˜์—์„œ ์ด์•ผ๊ธฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ ˆํŽธ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ self.w_[0]์€ ์ ˆํŽธ์ด ๋ฉ๋‹ˆ๋‹ค. 

 fit ์—์„œ ์“ฐ์ด๊ณ  ์žˆ๋Š” self.w_๋ฒกํ„ฐ๋Š” rgen.normal(loc = 0.0, scale=0.01, size = 1+X.shape[1])๋กœ ํ‘œ์ค€ํŽธ์ฐจ(scale)์ด 0.01์ธ ์ •๊ทœ๋ถ„ํฌ์—์„œ ๋ฝ‘์€ ๋žœ๋คํ•œ ์ž‘์€ ์ˆ˜๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ •๊ทœ๋ถ„ํฌ์ธ ๊ฒƒ๋„, 0.01์ธ ๊ฒƒ๋„ ํฌ๊ฒŒ ์˜๋ฏธ๋Š” ์—†์œผ๋‹ˆ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์œผ์…”๋„ ๋ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์€ ์ˆ˜๋กœ ๊ฐ€์ค‘์น˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์“ฐ์ธ rgenํ•จ์ˆ˜๋Š” numpy์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋กœ, ์‹œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์† ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰์— ๋”ฐ๋ผ ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ๋ง์ด์ฃ . 

 ์ด๋•Œ ์šฐ๋ฆฌ๋Š” ์™œ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์ง€? ๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ํ•™์Šต๋ฅ ์ด ๊ฐ€์ค‘์น˜ ๋ฒกํ„ฐ์˜ ๋ฐฉํ–ฅ์ด ์•„๋‹Œ ํฌ๊ธฐ์—๋งŒ ์˜ํ–ฅ์„ ๋งˆ์น˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๊ฐ€์ค‘์น˜๊ฐ€ 0์ด๋ผ๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

๊ทธ๋ฆผ 1. ์ดˆ๊ธฐ ๊ฐ€์ค‘์น˜ 0 ์ด ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฆ๋ช…

v1 = np.array([1,2,3])
v2 = 0.5 * v1
np.arccos(v1.dot(v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
...
0.0

 ์œ„ ์ฝ”๋“œ์—์„œ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. np.arccos ํ•จ์ˆ˜๋Š” ์—ญ์ฝ”์‚ฌ์ธ ํ•จ์ˆ˜์ด๊ณ  np.linalg.norm์€ ๋ฒกํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด v1๊ณผ v2 ์‚ฌ์ด ๊ฐ์ด 0๋„๊ฐ€ ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ๊ฐ„์— ์ดˆ๊ธฐ ๊ฐ€์ค‘์น˜๊ฐ€ 0์ด ์•„๋‹Œ ํŽธ์ด ์ข‹๋‹ค๋Š” ๊ฒƒ๋งŒ ๊ธฐ์–ตํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 fit ๋ฉ”์„œ๋“œ๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ ํ›„ X์— ์žˆ๋Š” ๋ชจ๋“  ์ƒ˜ํ”Œ์— ๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋Ÿฌ ๋Œ์•„๋‹ค๋‹™๋‹ˆ๋‹ค. ์ด ํ›ˆ๋ จ ์ƒ˜ํ”Œ์ด ์–ด๋А ํด๋ž˜์Šค์ธ์ง€๋Š” predict ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์ธกํ•ฉ๋‹ˆ๋‹ค. fit์—์„œ ๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด predict ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ์˜ˆ์ธก์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ epoch๋งˆ๋‹ค self.errors_๋ฆฌ์Šค๋А์— ์ž˜๋ชป ๋ถ„๋ฅ˜๋œ ํšŸ๋ฃจ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ๋‚˜์ค‘์— ํ›ˆ๋ จ๊ณผ์ •์„ ๋ถ„์„ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. net_input ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•œ np.dot ํ•จ์ˆ˜๋Š” w^T์™€ x์˜ ์ ๊ณฑ์„ ์—ฐ์‚ฐํ•ฉ๋‹ˆ๋‹ค.

 

2. ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ์…‹ ํ›ˆ๋ จ!

 ์•ž์—์„œ ๋งŒ๋“  ๊ตฌํ˜„์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ์…‹ ์ค‘์—์„œ ๋”ฑ ๋‘ ๊ฐœ์˜ ๊ฝƒ, Setosa ์™€ Versicolor ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ผ๋Œ€๋‹ค ์ „๋žต ๋“ฑ ๋‹ค์ค‘ ํด๋ž˜์Šค ๋ถ„๋ฅ˜๋กœ ํ™•์žฅ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 ๋จผ์ €, ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•ด์™€์•ผ๊ฒ ์ฃ ? ๊ตณ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ปดํ“จํ„ฐ์— ๋ฐ›์•„์•ผํ•  ์ด์œ ๋Š” ์—†์Šต๋‹ˆ๋‹ค. pandas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ UCI ๋จธ์‹ ๋Ÿฌ๋‹ ์ €์žฅ์†Œ์—์„œ ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ์…‹์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. tail()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ทธ๋ฆผ 2์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

import pandas as pd
df = pd.read_csv('https://archive.ics.uci.edu/ml/'
        'machine-learning-databases/iris/iris.data', header=None)
df.tail()

๊ทธ๋ฆผ 2. ๋ฐ์ดํ„ฐ์…‹ (feat. df.tail())

๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ์ปฌ ๋””ํ…ํ† ๋ฆฌ์— ์žˆ๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

df = pd.read.cvs('your/local/path/to/iris.data', header = None)

 ๊ทธ ๋‹ค์Œ 50๊ฐœ์˜ iris setosa์™€ 50๊ฐœ์˜ iris versicolor์— ํ•ด๋‹นํ•˜๋Š” 100๊ฐœ ๋ ˆ์ด๋ธ”์„ ์ถ”์ถœํ•˜๊ณ , ๊ฐ ๊ฝƒ์„ 1๊ณผ -1 ํด๋ž˜์Šค๋กœ ๋ฐ”๊พผ ํ›„์— y์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ ์ƒ˜ํ”Œ์˜ ์ฒซ๋ฒˆ์งธ ํŠน์„ฑ ๊ฝƒ๋ฐ›์นจ ๊ธธ์ด์™€ ์„ธ ๋ฒˆ์งธ ํŠน์„ฑ ๊ฝƒ์žŽ ๊ธธ์ด๋ฅผ X์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. plt.show()๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

import matplotlib.pyplot as plt
import numpy as np

# setosa์™€ versicolor๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค
y = df.iloc[0:100, 4].values
y = np.where(y == 'Iris-setosa', -1, 1)

# ๊ฝƒ๋ฐ›์นจ ๊ธธ์ด์™€ ๊ฝƒ์žŽ ๊ธธ์ด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค
X = df.iloc[0:100, [0, 2]].values

# ์‚ฐ์ ๋„๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค
plt.scatter(X[:50, 0], X[:50, 1],
            color='red', marker='o', label='setosa')
plt.scatter(X[50:100, 0], X[50:100, 1],
            color='blue', marker='x', label='versicolor')

plt.xlabel('sepal length [cm]')
plt.ylabel('petal length [cm]')
plt.legend(loc='upper left')

plt.show()

๊ทธ๋ฆผ 3. ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ์…‹ ์‚ฐ์ ๋„

 ์œ„ ๊ทธ๋ž˜ํ”„๋Š” ์„ ํ˜• ๊ฒฐ์ • ๊ฒฝ๊ณ„๋กœ ๋‘ ๊ฝƒ์„ ๋ถ„๋ฅ˜ํ•˜๊ธฐ์— ์•„์ฃผ ์˜ˆ์œ ์‚ฐ์ ๋„๋„ค์š”. ์ด์ œ ์ถ”์ถœํ•œ ๋ฐ์ดํ„ฐ๋“ค์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ›ˆ๋ จํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. epoch์— ๋”ฐ๋ผ ์ž˜๋ชป ๋ถ„๋ฅ˜๋œ ์˜ค์ฐจ ์ •๋„๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ฆฌ๊ณ , ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ˆ˜๋ ด์„ ํ†ตํ•ด์„œ ๊ฒฐ์ • ๊ฒฝ๊ณ„๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

ppn = Perceptron(eta=0.1, n_iter=10)

ppn.fit(X, y)

plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Number of errors')

plt.show()

 ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด epoch์— ๋”ฐ๋ผ ์˜ค์ฐจ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋‹ฌ๋ผ์ง€๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 1๋ฒˆ์—์„œ ๊ณต๋ถ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์‹คํ–‰์‹œํ‚จ ๋‹ค์Œ์— ๋ง๋ถ™์—ฌ์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”! ์ด๋ฒˆ ๊ณผ์ •์€ Perceptron ๋ฉ”์„œ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ํ•™์Šต์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 4. epoch์— ๋”ฐ๋ฅธ ์˜ค์ฐจ ์ˆ˜๋ ด

 ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๊ฒฐ์ • ๊ฒฝ๊ณ„๋ฅผ ๊ทธ๋ž˜ํ”„ ์ƒ์— ํ‘œํ˜„ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํ•จ์ˆ˜๋Š” ์‚ฐ์ ๋„์™€ ๊ฒฐ์ •๊ฒฝ๊ณ„๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

from matplotlib.colors import ListedColormap


def plot_decision_regions(X, y, classifier, resolution=0.02):

    # ๋งˆ์ปค์™€ ์ปฌ๋Ÿฌ๋งต์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])

    # ๊ฒฐ์ • ๊ฒฝ๊ณ„๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                           np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha=0.3, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())

    # ์ƒ˜ํ”Œ์˜ ์‚ฐ์ ๋„๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค
    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y == cl, 0], 
                    y=X[y == cl, 1],
                    alpha=0.8, 
                    c=colors[idx],
                    marker=markers[idx], 
                    label=cl, 
                    edgecolor='black')
                    
 
plot_decision_regions(X, y, classifier=ppn)
plt.xlabel('sepal length [cm]')
plt.ylabel('petal length [cm]')
plt.legend(loc='upper left')

plt.show()

 ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ˆ์œ ๊ฒฐ์ • ๊ฒฝ๊ณ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. 

๊ทธ๋ฆผ 5. ๊ฒฐ์ • ๊ฒฝ๊ณ„ ๊ทธ๋ž˜ํ”„

 ์ด๋ฅผ ํ†ตํ•ด ํผ์…‰ํŠธ๋ก ์˜ ๊ฒฐ์ •๊ฒฝ๊ณ„๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ๋‘ ๊ฐœ์˜ ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์–ด๋– ์…จ๋‚˜์š”? ์ฒ˜์Œ์œผ๋กœ ์—„์ฒญ ๋งŽ์€ ์ฝ”๋“œ๋“ค์„ ์ ‘ํ•˜์…จ์„ํ…Œ๊ณ , ํŒŒ์ด์ฌ์ด ์ƒ์†Œํ•˜์…จ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ฌธ๋ฒ•๋“ค๊ณผ ์—ฌํƒœ ๋ณธ ์  ์—†๋˜ numpy ํ•จ์ˆ˜๋“ค, pandas ํ•จ์ˆ˜๋“ค์ด ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค ์ดํ•ดํ•˜์‹œ๊ณ  ์™ธ์šฐ์‹ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

ํผ์…‰ํŠธ๋ก  ํ•จ์ˆ˜๊ฐ€ ์ด๋ ‡๊ฒŒ ๋Œ์•„๊ฐ€๊ณ , ์ด ์–ด๋ ค์šด ์ˆ˜์‹์„ ์ฝ”๋“œ๋กœ๋Š” ์ด๋ ‡๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ตฌ๋‚˜, ๋ผ๋Š” ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ด์‹œ๋Š”๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹น์žฅ ๋ชจ๋ธ์„ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฑฐ๋‹ˆ๊นŒ์š”! ๊ณ„์†ํ•ด์„œ ์‹ค์Šต ์ฝ”๋“œ๋“ค์€ ๋‚˜์˜ค๊ฒ ์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„์€ ์นœ์ˆ™ํ•ด์ง€์‹œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. 

๋‹ค์‹œ ๋ง์”€ ๋“œ๋ฆฌ์ง€๋งŒ, ๊ตณ์ด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋‹ค ์ดํ•ดํ•˜์‹ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค! ์ฑ…์„ ๋‹ค ๋ณด๊ณ , ๋‹ค์‹œ ๋Œ์•„์™€์„œ ์ฒœ์ฒœํžˆ ํ•ด๋„ ๋Šฆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ณต๋ถ€๋Š” ์žฌ๋ฏธ๊ฐ€ ์žˆ์–ด์•ผํ•˜๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์žฌ๋ฏธ์—†์„์ง€๋„ ๋ชฐ๋ผ์š”. 

๊ทธ๋Ÿผ ์กฐ๊ธˆ ๋” ๊ฐ€๋ฒผ์šด ๋งˆ์Œ์œผ๋กœ, ๋‹ค์Œ ๋ฒˆ์—๋Š” ์ ์‘ํ˜• ์„ ํ˜• ๋‰ด๋Ÿฐ๊ณผ ํ•™์Šต์˜ ์ˆ˜๋ ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋“ค๊ณ  ์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„์ฃผ ์ค‘์š”ํ•œ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์ด ๋‚˜์˜ค๋‹ˆ ๋†“์น˜์ง€ ๋งˆ์„ธ์š”!

 

728x90
์ €์ž‘์žํ‘œ์‹œ

'๐Ÿฌ ML & Data > ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 6. ์‚ฌ์ดํ‚ท๋Ÿฐ ์ž…๋ฌธ!  (0) 2020.02.03
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 5. ํผ์…‰ํŠธ๋ก ์˜ ๋ฉ”๊ฐ€ ์ง„ํ™”์™€ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•!  (0) 2020.02.01
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 3. ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜ํ•™์  ์ •์˜  (0) 2020.01.21
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 2. ๋จธ์‹ ๋Ÿฌ๋‹ ์‹œ์ž‘ ์ „์— ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๊ฒƒ๋“ค  (0) 2020.01.14
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 1. ๋„ˆ์–ด์–ฟ์€ ์‹œ๊ฐ์œผ๋กœ ๋ณด๋Š” ๋จธ์‹ ๋Ÿฌ๋‹์˜ ๊ธฐ์ดˆ  (0) 2020.01.14
'๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 6. ์‚ฌ์ดํ‚ท๋Ÿฐ ์ž…๋ฌธ!
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 5. ํผ์…‰ํŠธ๋ก ์˜ ๋ฉ”๊ฐ€ ์ง„ํ™”์™€ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•!
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 3. ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜ํ•™์  ์ •์˜
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 2. ๋จธ์‹ ๋Ÿฌ๋‹ ์‹œ์ž‘ ์ „์— ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๊ฒƒ๋“ค
darly213
darly213
ํ˜ธ๋ฝํ˜ธ๋ฝํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž
  • darly213
    ERROR DENY
    darly213
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (97)
      • ๐Ÿฌ ML & Data (50)
        • ๐ŸŒŠ Computer Vision (2)
        • ๐Ÿ“ฎ Reinforcement Learning (12)
        • ๐Ÿ“˜ ๋…ผ๋ฌธ & ๋ชจ๋ธ ๋ฆฌ๋ทฐ (8)
        • ๐Ÿฆ„ ๋ผ์ดํŠธ ๋”ฅ๋Ÿฌ๋‹ (3)
        • โ” Q & etc. (5)
        • ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹ (20)
      • ๐Ÿฅ Web (21)
        • โšก Back-end | FastAPI (2)
        • โ›… Back-end | Spring (5)
        • โ” Back-end | etc. (9)
        • ๐ŸŽจ Front-end (4)
      • ๐ŸŽผ Project (8)
        • ๐ŸงŠ Monitoring System (8)
      • ๐Ÿˆ Algorithm (0)
      • ๐Ÿ”ฎ CS (2)
      • ๐Ÿณ Docker & Kubernetes (3)
      • ๐ŸŒˆ DEEEEEBUG (2)
      • ๐ŸŒ  etc. (8)
      • ๐Ÿ˜ผ ์‚ฌ๋‹ด (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
    • GitHub
    • Notion
    • LinkedIn
  • ๋งํฌ

    • Github
    • Notion
  • ๊ณต์ง€์‚ฌํ•ญ

    • Contact ME!
  • 250x250
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
darly213
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 4. ํŒŒ์ด์ฌ์œผ๋กœ ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ!
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”