[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 5. ํผ์…‰ํŠธ๋ก ์˜ ๋ฉ”๊ฐ€ ์ง„ํ™”์™€ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•!

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

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

https://dnai-deny.tistory.com/5   https://dnai-deny.tistory.com/6

 ์ด๋ฒˆ ์„ธ์…˜์—์„œ๋Š” ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ง„ํ™”๋ฒ„์ „์ธ ์•„๋‹ฌ๋ฆฐ๊ณผ ๋จธ์‹ ๋Ÿฌ๋‹์— ์žˆ์–ด์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ฐœ๋…์ธ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

1. ์ ์‘ํ˜• ์„ ํ˜• ๋‰ด๋Ÿฐ, ์•„๋‹ฌ๋ฆฐ

 ์•„๋‹ฌ๋ฆฐ์€ ๋‹จ์ผ ์ธต ์‹ ๊ฒฝ๋ง์˜ ๋˜ ๋‹ค๋ฅธ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋ฒ„๋‚˜๋“œ ์œ„๋“œ๋กœ์šฐ์™€ ํ…Œ๋“œ ํ˜ธํ”„๊ฐ€ ๊ฐœ๋ฐœํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์ฃ . ์ œ๋ชฉ์—์„œ ๋ณด์ด๋“ฏ ํผ์…‰ํŠธ๋ก ์ด ์ง„ํ™”ํ•œ ํ˜•ํƒœ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์•„๋‹ฌ๋ฆฐ์—์„œ๋Š” ๋น„์šฉ ํ•จ์ˆ˜(cost function)์ด๋ผ๋Š” ์ฃผ์š” ๊ฐœ๋…์ด ์ •์˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

 ์•„๋‹ฌ๋ฆฐ๊ณผ ํผ์…‰ํŠธ๋ก ์˜ ์ฐจ์ด์ ์€ ๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์— ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ฌ๋ฆฐ์€ ๋‹จ์œ„ ๊ณ„๋‹จ ํ•จ์ˆ˜ ๋Œ€์‹  ์„ ํ˜• ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์—์„œ๋Š” ์ตœ์ข… ์ž…๋ ฅ๊ณผ ๋™์ผํ•œ ํ•จ์ˆ˜๋ฅผ ์„ ํ˜• ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์•„๋ž˜ ์ˆ˜์‹์ด์ฃ .

๊ทธ๋ฆผ 1. ์„ ํ˜• ํ™œ์„ฑํ™” ํ•จ์ˆ˜

 ๊ฐ€์ค‘์น˜ ํ•™์Šต์—๋Š” ์„ ํ˜• ํ™œ์„ฑํ™” ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜์ง€๋งŒ ์ตœ์ข… ์˜ˆ์ธก์„ ๋งŒ๋“œ๋Š” ๋ฐ์—๋Š” ์—ฌ์ „ํžˆ ์ž„๊ณ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฃผ์š”ํ•œ ์ฐจ์ด์ ์€ ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ฌ๋ฆฐ์€ ์ •๋‹ต ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”๊ณผ ์„ ํ˜• ํ™œ์„ฑํ™” ํ•จ์ˆ˜์˜ ์‹ค์ˆ˜ ์ถœ๋ ฅ ๊ฐ’์„ ๋น„๊ตํ•ด ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€๋งŒ ํผ์…‰ํŠธ๋ก ์€ ์ •๋‹ต ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”๊ณผ ์˜ˆ์ธก ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ๋น„๊ตํ•œ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 2. ํผ์…‰ํŠธ๋ก ๊ณผ ์•„๋‹ฌ๋ฆฐ์˜ ๋น„๊ต

 

2. ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์œผ๋กœ ๋น„์šฉํ•จ์ˆ˜ ์ตœ์†Œํ™”ํ•˜๊ธฐ

์ง€๋„ํ•™์Šต์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋Š” ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ •์˜๋œ ๋ชฉ์ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ตœ์†Œํ™”๊ฐ€ ๋ชฉ์ ์ธ ๋น„์šฉํ•จ์ˆ˜๊ฐ€ ์ข…์ข… ๋ชฉ์ ํ•จ์ˆ˜๊ฐ€ ๋˜๊ธฐ๋„ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ฌ๋ฆฐ์€ ๊ณ„์‚ฐ๊ดธ ์ถœ๋ ฅ๊ณผ ์ง„์งœ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ” ์‚ฌ์ด์˜ ์˜ค์ฐจ์˜ ์ œ๊ณฑ์„ ํ•ฉํ•œ ๊ฐ’์œผ๋กœ ๋น„์šฉํ•จ์ˆ˜ J๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 3. cost function

 ์ด ํ•จ์ˆ˜์˜ ์žฅ์ ์€ ๋ฐ”๋กœ ๋ณผ๋กํ•จ์ˆ˜๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ ๋ณผ๋กํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ถ„์ด ๊ฐ€๋Šฅํ•˜๊ณ , ๋ฏธ๋ถ„ํ•ด์„œ ๊ตฌํ•ด์ง„ ๊ทธ ๊ธฐ์šธ๊ธฐ๋ฅผ ๊ฒฝ์‚ฌ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ด์šฉํ•œ ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•(gradient descent)๋ฅผ ์ ์šฉํ•˜์—ฌ ๋น„์šฉํ•จ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ทธ๋ฆผ 4. ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•

๊ทธ๋ฆผ 4์—์„œ๋Š” ๊ฐ€์ค‘์น˜์— ๋”ฐ๋ฅธ ๊ฒฝ์‚ฌ๊ฐ€ ์ง€์—ญ ํ˜น์€ ์ „์—ญ ์ตœ์†Ÿ๊ฐ’์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์–ธ๋•์„ ๋‚ด๋ ค์˜ค๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•™์Šต์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๊ฒฝ์‚ฌ๊ฐ€ ์™„๋งŒํ•ด์ง€๋Š” ์ชฝ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๊ณ , ์ง„ํ–‰ ํฌ๊ธฐ๋Š” ๊ธฐ์šธ๊ธฐ์™€ ํ•™์Šต๋ฅ (learning rate)๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. 

 ์ด๋•Œ w := w + โ–ณw ๋Š” ๋™์ผํ•œ๋ฐ, โ–ณw = -nโ–ฝJ(w) ๋กœ ๊ฐ€์ค‘์น˜ ๋ณ€ํ™”๋Ÿ‰์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค. ํ•™์Šต๋ฅ  n์„ ์Œ์ˆ˜์˜ ๊ทธ๋ž˜๋””์–ธํŠธ์— ๊ณฑํ•œ ๊ฒƒ์ด์ฃ . ๋น„์šฉ ํ•จ์ˆ˜์˜ ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด ๊ฐ ๊ฐ€์ค‘์น˜ wj์— ๋Œ€ํ•œ ํŽธ๋„ ํ•จ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. 

๊ทธ๋ฆผ 5. ํŽธ๋„ํ•จ์ˆ˜

 ๋”ฐ๋ผ์„œ ๊ฐ€์ค‘์น˜์˜ ์—ฝ๋ฐ์ดํŠธ ๊ณต์‹์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 6. ๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธ ๊ณต์‹

์—ฌ๊ธฐ๊นŒ์ง€ ๋ณด๋ฉด ํผ์…‰ํŠธ๋ก ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ๋ณด์ด์ง€๋งŒ, โˆฎ(z(i)) ๋Š” ์ •์ˆ˜ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์ด ์•„๋‹ˆ๊ณ  ์‹ค์ˆ˜๋ผ๋Š” ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๊ฐ€ ์ƒ˜ํ”Œ๋งˆ๋‹ค ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ชจ๋“  ์ƒ˜ํ”Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์„ ๋ฐฐ์น˜ ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•(batch gradient descent)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

3. ํŒŒ์ด์ฌ์œผ๋กœ ์•„๋‹ฌ๋ฆฐ ๊ตฌํ˜„ํ•˜๊ธฐ

class AdalineGD(object):
    """์ ์‘ํ˜• ์„ ํ˜• ๋‰ด๋Ÿฐ ๋ถ„๋ฅ˜๊ธฐ

    ๋งค๊ฐœ๋ณ€์ˆ˜
    ------------
    eta : float
      ํ•™์Šต๋ฅ  (0.0๊ณผ 1.0 ์‚ฌ์ด)
    n_iter : int
      ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์…‹ ๋ฐ˜๋ณต ํšŸ์ˆ˜
    random_state : int
      ๊ฐ€์ค‘์น˜ ๋ฌด์ž‘์œ„ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ์‹œ๋“œ

    ์†์„ฑ
    -----------
    w_ : 1d-array
      ํ•™์Šต๋œ ๊ฐ€์ค‘์น˜
    cost_ : 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

    def fit(self, X, y):
        """ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ํ•™์Šต

        ๋งค๊ฐœ๋ณ€์ˆ˜
        ----------
        X : {array-like}, shape = [n_samples, n_features]
          n_samples ๊ฐœ์˜ ์ƒ˜ํ”Œ๊ณผ n_features ๊ฐœ์˜ ํŠน์„ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ
        y : array-like, shape = [n_samples]
          ํƒ€๊นƒ๊ฐ’

        ๋ฐ˜ํ™˜๊ฐ’
        -------
        self : object

        """
        rgen = np.random.RandomState(self.random_state)
        self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])
        self.cost_ = []

        for i in range(self.n_iter):
            net_input = self.net_input(X)
            # Please note that the "activation" method has no effect
            # in the code since it is simply an identity function. We
            # could write `output = self.net_input(X)` directly instead.
            # The purpose of the activation is more conceptual, i.e.,  
            # in the case of logistic regression (as we will see later), 
            # we could change it to
            # a sigmoid function to implement a logistic regression classifier.
            output = self.activation(net_input)
            errors = (y - output)
            self.w_[1:] += self.eta * X.T.dot(errors)
            self.w_[0] += self.eta * errors.sum()
            cost = (errors**2).sum() / 2.0
            self.cost_.append(cost)
        return self

    def net_input(self, X):
        """์ตœ์ข… ์ž…๋ ฅ ๊ณ„์‚ฐ"""
        return np.dot(X, self.w_[1:]) + self.w_[0]

    def activation(self, X):
        """์„ ํ˜• ํ™œ์„ฑํ™” ๊ณ„์‚ฐ"""
        return X

    def predict(self, X):
        """๋‹จ์œ„ ๊ณ„๋‹จ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค"""
        return np.where(self.activation(self.net_input(X)) >= 0.0, 1, -1)

 ํผ์…‰ํŠธ๋ก ๊ณผ ๋‹ค๋ฅธ ์ ์ด ๋ณด์ด์‹œ๋‚˜์š”? fit ๋ฉ”์†Œ๋“œ ์•ˆ ๋ฐ˜๋ณต๋ฌธ์— self.w_[1:] += self.eta * X.T.dot(errors)์™€ self.w_[0] * errors.sum()์ด ๋‹ค๋ฅด์ฃ . 0๋ฒˆ์งธ ๊ฐ€์ค‘์น˜์ธ ์ ˆํŽธ์ด ์˜ค์ฐจํ•ฉ๊ณผ ํ•™์Šต๋ฅ ์˜ ๊ณฑ์ด๊ณ , ๊ทธ ์ด์™ธ์˜ ๋ถ€๋ถ„์—์„œ๋Š” X.T.dot(errors)๋Š” ํŠน์„ฑ ์˜ค์ฐจ ๋ฒกํ„ฐ ๊ฐ„์˜ ํ–‰๋ ฌ๊ณผ ๋ฒกํ„ฐ์˜ ๊ณฑ์„ ํ•™์Šต๋ฅ ์— ๊ณฑํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

 ๋˜ ๋‹ค๋ฅธ ์ ์€ activation ๋ฉ”์„œ๋“œ์ธ๋ฐ, ์ด๊ฒƒ์€ ๊ทธ์ € ๋‹จ์ˆœํ•œ ํ•ญ๋“ฑ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋‹ค๋ฅธ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

 ์‹ค์ œ ๋ชจ๋ธ์—์„œ๋Š” ์ตœ์ ์œผ๋กœ ์ˆ˜๋ ดํ•˜๋Š” ์ข‹์€ ํ•™์Šต๋ฅ (learning rate)๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ—˜์„ ๊ฑฐ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•™์Šต๋ฅ  0.01๊ณผ 0.0001์„ ๋น„๊ตํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))

ada1 = AdalineGD(n_iter=10, eta=0.01).fit(X, y)
ax[0].plot(range(1, len(ada1.cost_) + 1), np.log10(ada1.cost_), marker='o')
ax[0].set_xlabel('Epochs')
ax[0].set_ylabel('log(Sum-squared-error)')
ax[0].set_title('Adaline - Learning rate 0.01')

ada2 = AdalineGD(n_iter=10, eta=0.0001).fit(X, y)
ax[1].plot(range(1, len(ada2.cost_) + 1), ada2.cost_, marker='o')
ax[1].set_xlabel('Epochs')
ax[1].set_ylabel('Sum-squared-error')
ax[1].set_title('Adaline - Learning rate 0.0001')

plt.show()

๊ทธ๋ฆผ 7. ํ•™์Šต๋ฅ  ๋น„๊ต

 ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์„ ๋น„๊ตํ•ด๋ณด๋ฉด, ํ•™์Šต๋ฅ ์ด 0.01์ธ ๊ฒฝ์šฐ์— epoch์ด ๋Š˜์–ด๋‚จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์˜คํžˆ๋ ค ์˜ค์ฐจ๊ฐ€ ๊ณ„์† ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ํ•™์Šต๋ฅ ์ด ๋„ˆ๋ฌด ์ปค์„œ ๊ฒฝ์‚ฌํ•˜๊ฐ•์„ ํ•˜๋˜ ์ค‘์— ๊ธฐ์šธ๊ธฐ๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ํŠ€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ์˜ ๊ฒฝ์šฐ๋Š” ์˜คํžˆ๋ ค ํ•™์Šต๋ฅ ์ด ๋„ˆ๋ฌด ์ž‘์•„์„œ ์ตœ์†Ÿ๊ฐ’์— ์ˆ˜๋ ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„์ฃผ ๋งŽ์€ epoch์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ 8์ด ๊ธ€๋กœ ์„ค๋ช…ํ•œ ๋‚ด์šฉ์„ ๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…ํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 8. ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์—์„œ์˜ ํ•™์Šต๋ฅ ์˜ ์˜ํ–ฅ

4. ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ• ์„ฑ๋Šฅ ๊ฐ•ํ™”ํ•˜๊ธฐ

 ๋ชจ๋ธ์—์„œ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์€ ์ข‹์€ ๋ชจ๋ธ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์„ธ์…˜์— ๋‚˜์™”๋˜ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ์–ตํ•˜์‹œ๋‚˜์š”? (https://dnai-deny.tistory.com/3) ์ง€๊ธˆ ๋ณผ ๋‚ด์šฉ์€ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ํŠน์„ฑ ์Šค์ผ€์ผ, ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ์— ๋ฐœ๋์„ ๋‹ด๊ฐ€๋ณผ ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ํ™”(standardization) ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ ๋ฐ์ดํ„ฐ์— ์ •๊ทœ๋ถ„ํฌ์˜ ์„ฑ์งˆ์„ ๋ถ€์—ฌํ•ด ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ• ํ•™์Šต์ด ๋น ๋ฅด๊ฒŒ ์ˆ˜๋ ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ์ •๊ทœ๋ถ„ํฌ์™€ ๊ฐ™์ด ํ‘œ์ค€์„ 0์— ๋งž์ถ”๊ณ  ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ 1๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. j๋ฒˆ์งธ ํŠน์„ฑ์„ ํ‘œ์ค€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋ž˜ ์ˆ˜์‹์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 9. ํ‘œ์ค€ํ™”

 ๋ชจ๋“  ์ƒ˜ํ”Œ์—์„œ ํ‰๊ท ์„ ๋บ€ ๊ฒƒ์„ ํ‘œ์ค€ํŽธ์ฐจ๋กœ ๋‚˜๋ˆ„๋ฉด ๋ฉ๋‹ˆ๋‹ค. xj๋Š” ๋ชจ๋“  ์ƒ˜ํ”Œ์˜ j๋ฒˆ์งธ ํŠน์„ฑ์„ ํฌํ•จํ•œ ๋ฐฑํ„ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋˜๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ 10์—์„œ ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋” ์ ์€ ๊ณผ์ •์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ตœ์ ์˜ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์ฃ .

๊ทธ๋ฆผ 10. ํ‘œ์ค€ํ™”์˜ ํ•„์š”์„ฑ

 ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œ์ค€ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. numpy ๋‚ด์žฅ ํ•จ์ˆ˜ mean๊ณผ std๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ๋•๋ถ„์ด์ฃ . 

# ํŠน์„ฑ์„ ํ‘œ์ค€ํ™”ํ•ฉ๋‹ˆ๋‹ค.
X_std = np.copy(X)
X_std[:, 0] = (X[:, 0] - X[:, 0].mean()) / X[:, 0].std()
X_std[:, 1] = (X[:, 1] - X[:, 1].mean()) / X[:, 1].std()

ada = AdalineGD(n_iter=15, eta=0.01)
ada.fit(X_std, y)

plot_decision_regions(X_std, y, classifier=ada)
plt.title('Adaline - Gradient Descent')
plt.xlabel('sepal length [standardized]')
plt.ylabel('petal length [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()

plt.plot(range(1, len(ada.cost_) + 1), ada.cost_, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Sum-squared-error')

plt.tight_layout()
plt.show()

 ํ‘œ์ค€ํ™”๊ฐ€ ๋๋‚˜๋ฉด ๊ฒฐ์ •๊ฒฝ๊ณ„ ๊ทธ๋ž˜ํ”„์™€ ๋น„์šฉ์ด ๊ฐ์†Œ๋˜๋Š” cost function ๊ทธ๋ž˜ํ”„๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•™์Šต๋ฅ ์„ 0.01๋กœ ์‚ฌ์šฉํ•˜๊ณ , ํŠน์„ฑ์„ ํ‘œ์ค€ํ™”ํ•˜๋‹ˆ ํ™•์‹คํžˆ ๋ชจ๋ธ์ด ์ˆ˜๋ ดํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์ฃ . ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ƒ˜ํ”Œ์ด ์™„๋ฒฝํ•˜๊ฒŒ ๋ถ„๋ฅ˜๋˜๋”๋ผ๋„ Sum-Squared error์˜ ๊ฐ’์ด 0์ด ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 11. ํ‘œ์ค€ํ™”๋ฅผ ์ ์šฉํ•œ ์•„๋‹ฌ๋ฆฐ ๊ฒฐ์ • ๊ฒฝ๊ณ„์™€ ํ•™์Šต ๊ณก์„ 

 

5. ๋Œ€๊ทœ๋ชจ ๋จธ์‹ ๋Ÿฌ๋‹๊ณผ ํ™•๋ฅ ์ ์ธ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•

 4์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฅธ ๋ง๋กœ ๋ฐฐ์น˜ ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งค์šฐ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ค„์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์น˜ ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์„ ์ด์šฉํ•˜๋ฉด ๊ณ„์‚ฐ ๋น„์šฉ์ด ์ƒ๋‹นํžˆ ๋†’์•„์ง‘๋‹ˆ๋‹ค. ๊ณ„์‚ฐํ•ด์•ผํ•  ๊ฑฐ๋ฆฌ๊ฐ€ ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๊ฐ€์ค‘์น˜๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํ•™์Šตํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 ์ด ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ™•๋ฅ ์  ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•(stochastic gradient descent)๊ฐ€ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ˆ˜์‹ ๋‘ ๊ฐœ๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด์„œ ์ด์•ผ๊ธฐํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 12. ํ™•๋ฅ  ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•

 ์œ„ ์ˆ˜์‹์˜ ์‹œ๊ทธ๋งˆ ๊ธฐํ˜ธ๊ฐ€ ๋ณด์ด์‹œ๋‚˜์š”? ์ฒซ ๋ฒˆ์งธ ์ˆ˜์‹์€ ๋ฐฐ์น˜ ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋Š”๋ฐ, ์‹œ๊ทธ๋งˆ ๊ธฐํ˜ธ๋ฅผ ํ†ตํ•ด์„œ ์ „์ฒด ๋ฐ์ดํ„ฐ ์…‹ x์— ๋Œ€ํ•ด์„œ ๋ˆ„์ ๋œ ์˜ค์ฐจ ํ•ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋‘ ๋ฒˆ์งธ ์ˆ˜์‹, ํ™•๋ฅ ์  ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์—์„œ๋Š” ๊ฐ ํ›ˆ๋ จ ์ƒ˜ํ”Œ์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ์”ฉ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.

 ํ™•๋ฅ ์  ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์€ ์ผ๋ฐ˜ ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•๋ณด๋‹ค ํ›จ์”ฌ ์ž์ฃผ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋ ด ์†๋„๊ฐ€ ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์˜ค์ฐจ์˜ ๊ถค์ (๊ทธ๋ž˜ํ”„)๋Š” ํ›จ์”ฌ ์–ด์ง€๋Ÿฌ์šด ํ˜•ํƒœ๊ฐ€ ๋˜์ฃ . ํ™•๋ฅ ์  ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์—์„œ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ›ˆ๋ จ ์ƒ˜ํ”Œ์˜ ์ˆœ์„œ๋ฅผ ๋žœ๋คํ•˜๊ฒŒ, ๊ทธ๋ฆฌ๊ณ  ์—ํญ๋งˆ๋‹ค ํ›ˆ๋ จ์„ธํŠธ๋ฅผ ์„ž๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

  ์ด๋ฏธ ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์„ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ์ˆ˜์ •์„ ํ†ตํ•ด ํ™•๋ฅ ์  ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

class AdalineSGD(object):
    """ADAptive LInear NEuron ๋ถ„๋ฅ˜๊ธฐ

    Parameters
    ------------
    eta : float
      ํ•™์Šต๋ฅ  (0.0๊ณผ 1.0 ์‚ฌ์ด)
    n_iter : int
      ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์…‹ ๋ฐ˜๋ณต ํšŸ์ˆ˜
    shuffle : bool (default: True)
      True๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฐ™์€ ๋ฐ˜๋ณต์ด ๋˜์ง€ ์•Š๋„๋ก ์—ํฌํฌ๋งˆ๋‹ค ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์„ž์Šต๋‹ˆ๋‹ค
    random_state : int
      ๊ฐ€์ค‘์น˜ ๋ฌด์ž‘์œ„ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ์‹œ๋“œ

    Attributes
    -----------
    w_ : 1d-array
      ํ•™์Šต๋œ ๊ฐ€์ค‘์น˜
    cost_ : list
      ๋ชจ๋“  ํ›ˆ๋ จ ์ƒ˜ํ”Œ์— ๋Œ€ํ•ด ์—ํฌํฌ๋งˆ๋‹ค ๋ˆ„์ ๋œ ํ‰๊ท  ๋น„์šฉ ํ•จ์ˆ˜์˜ ์ œ๊ณฑํ•ฉ

    """
    def __init__(self, eta=0.01, n_iter=10, shuffle=True, random_state=None):
        self.eta = eta
        self.n_iter = n_iter
        self.w_initialized = False
        self.shuffle = shuffle
        self.random_state = random_state
        
    def fit(self, X, y):
        """ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ํ•™์Šต

        Parameters
        ----------
        X : {array-like}, shape = [n_samples, n_features]
          n_samples ๊ฐœ์˜ ์ƒ˜ํ”Œ๊ณผ n_features ๊ฐœ์˜ ํŠน์„ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ
        y : array-like, shape = [n_samples]
          ํƒ€๊นƒ ๋ฒกํ„ฐ

        ๋ฐ˜ํ™˜๊ฐ’
        -------
        self : object

        """
        self._initialize_weights(X.shape[1])
        self.cost_ = []
        for i in range(self.n_iter):
            if self.shuffle:
                X, y = self._shuffle(X, y)
            cost = []
            for xi, target in zip(X, y):
                cost.append(self._update_weights(xi, target))
            avg_cost = sum(cost) / len(y)
            self.cost_.append(avg_cost)
        return self

    def partial_fit(self, X, y):
        """๊ฐ€์ค‘์น˜๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค"""
        if not self.w_initialized:
            self._initialize_weights(X.shape[1])
        if y.ravel().shape[0] > 1:
            for xi, target in zip(X, y):
                self._update_weights(xi, target)
        else:
            self._update_weights(X, y)
        return self

    def _shuffle(self, X, y):
        """ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์„ž์Šต๋‹ˆ๋‹ค"""
        r = self.rgen.permutation(len(y))
        return X[r], y[r]
    
    def _initialize_weights(self, m):
        """๋žœ๋คํ•œ ์ž‘์€ ์ˆ˜๋กœ ๊ฐ€์ค‘์น˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค"""
        self.rgen = np.random.RandomState(self.random_state)
        self.w_ = self.rgen.normal(loc=0.0, scale=0.01, size=1 + m)
        self.w_initialized = True
        
    def _update_weights(self, xi, target):
        """์•„๋‹ฌ๋ฆฐ ํ•™์Šต ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค"""
        output = self.activation(self.net_input(xi))
        error = (target - output)
        self.w_[1:] += self.eta * xi.dot(error)
        self.w_[0] += self.eta * error
        cost = 0.5 * error**2
        return cost
    
    def net_input(self, X):
        """์ตœ์ข… ์ž…๋ ฅ ๊ณ„์‚ฐ"""
        return np.dot(X, self.w_[1:]) + self.w_[0]

    def activation(self, X):
        """์„ ํ˜• ํ™œ์„ฑํ™” ๊ณ„์‚ฐ"""
        return X

    def predict(self, X):
        """๋‹จ์œ„ ๊ณ„๋‹จ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค"""
        return np.where(self.activation(self.net_input(X)) >= 0.0, 1, -1)

ada = AdalineSGD(n_iter=15, eta=0.01, random_state=1)
ada.fit(X_std, y)

plot_decision_regions(X_std, y, classifier=ada)
plt.title('Adaline - Stochastic Gradient Descent')
plt.xlabel('sepal length [standardized]')
plt.ylabel('petal length [standardized]')
plt.legend(loc='upper left')

plt.tight_layout()
plt.show()

plt.plot(range(1, len(ada.cost_) + 1), ada.cost_, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Average Cost')

plt.tight_layout()
plt.show()

 

 ์œ„ ์ฝ”๋“œ์—์„œ fit ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๊ฐ ํ›ˆ๋ จ ์ƒ˜ํ”Œ๋งˆ๋‹ค ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  partial_fit ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ๊ฐ€์ค‘์น˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๋„๋ก ํ•ด์„œ ์˜จ๋ผ์ธ ํ•™์Šต์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ ์—ํญ๋งˆ๋‹ค ํ‰๊ท  ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜๊ณ  ์—ํฌํฌ๊ฐ€ ๋ณ€ํ•˜๊ธฐ ์ „์— ํ›ˆ๋ จ์ƒ˜ํ”Œ์„ ์„ž์Šต๋‹ˆ๋‹ค.

 ์•„๋‹ฌ๋ฆฐ ๋ถ„๋ฅ˜๊ฐ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” _shuffle ๋ฉ”์„œ๋“œ๋Š” np.random ๋ชจ๋“ˆ์˜ permutation ํ•จ์ˆ˜๋กœ 0๋ถ€ํ„ฐ 100์‚ฌ์ด์˜ ๋žœ๋ค ์ˆซ์ž ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•ด ์ƒ˜ํ”Œ์„ ์„ž๋Š” ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  fit ๋ฉ”์„œ๋“œ๋กœ ํ›ˆ๋ จํ•˜๊ณ , plot_decision_regions๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 13. ํ™•๋ฅ ์  ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์˜ ๊ฒฐ์ •๊ฒฝ๊ณ„์™€ ํ•™์Šต๊ณก์„ 

 ํ•™์Šต๊ณก์„  ๊ทธ๋ž˜ํ”„์—์„œ ํ™•์‹คํžˆ ํ‰๊ท  ๋น„์šฉ(cost)๊ฐ€ ๋น ๋ฅด๊ฒŒ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค. ์—ํฌํฌ๊ฐ€ ์–ด๋А์ •๋„ ์ง€๋‚˜๋ฉด ์ตœ์ข… ๊ฒฐ์ • ๊ฒฝ๊ณ„๋Š” ๋ฐฐ์น˜ ํ•˜๊ฐ•๋ฒ•๊ณผ ๊ฑฐ์˜ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์˜จ๋ผ์ธ ํ•™์Šต ๋ฐฉ์‹์œผ๋กœ ํ›ˆ๋ จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ๊ฐ์˜ ์ƒ˜ํ”Œ์— ์•„๋ž˜์™€ ๊ฐ™์ด partial_fit ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ada.partial_fit(X_std[0,:], y[0])

 

์ด๋ฒˆ 3, 4, 5์„ธ์…˜์—์„œ๋Š” ๊ธฐ์ดˆ์  ์„ ํ˜• ๋ถ„๋ฅ˜๊ธฐ์ธ ํผ์…‰ํŠธ๋ก ๊ณผ ์•„๋‹ฌ๋ฆฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋˜, ์•„์ฃผ ์ค‘์š”ํ•œ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•๋„ ๋ฐฐ์› ์ฃ . ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ ๊ฐ„๋‹จํ•œ ๋ถ„๋ฅ˜๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์…จ์Šต๋‹ˆ๋‹ค. ์ถ•ํ•˜๋“œ๋ ค์š”! ์ด๋ฒˆ ๊ตฌํ˜„์— ์‚ฌ์šฉํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฐฉ์‹์ด ์ดํ›„ ์‚ฌ์ดํ‚ท๋Ÿฐ์„ ์ดํ•ดํ•˜๋Š”๋ฐ์—๋„ ๋„์›€์ด ๋˜์‹ค ๊ฒ๋‹ˆ๋‹ค.

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

728x90
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

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

[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹]Session 7. ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€(logistic regression)  (0) 2020.02.05
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 6. ์‚ฌ์ดํ‚ท๋Ÿฐ ์ž…๋ฌธ!  (0) 2020.02.03
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 4. ํŒŒ์ด์ฌ์œผ๋กœ ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ!  (0) 2020.01.25
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 3. ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜ํ•™์  ์ •์˜  (0) 2020.01.21
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 2. ๋จธ์‹ ๋Ÿฌ๋‹ ์‹œ์ž‘ ์ „์— ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๊ฒƒ๋“ค  (0) 2020.01.14
'๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹]Session 7. ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€(logistic regression)
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 6. ์‚ฌ์ดํ‚ท๋Ÿฐ ์ž…๋ฌธ!
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 4. ํŒŒ์ด์ฌ์œผ๋กœ ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ!
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 3. ํผ์…‰ํŠธ๋ก  ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜ํ•™์  ์ •์˜
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 5. ํผ์…‰ํŠธ๋ก ์˜ ๋ฉ”๊ฐ€ ์ง„ํ™”์™€ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•!
์ƒ๋‹จ์œผ๋กœ

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