Python Machine Learning - ML03 Support Vector Machine(서포트 벡터 머신)
1. 세 번째 ML
Support Vector Machine
(SVM)
세 번째 ML : 서포트 벡터 머신(SVM)
Source : MIT 6.034 Artificial Intelligence, Fall 2010, https://www.youtube.com/watch?v=_PwhiWxHK8o
2. by Pyson
어떻게 하면 데이터를 잘 분류할 수 있을까?
여기에 ‘+’ 값과 ‘-’ 값이 있습니다.
-
--
+
+
+
+
3. by Pyson
여러 가지 방법으로 데이터를 분류할 수 있음
선을 그어 data를 분류해 보자
-
--
+
++
+
-
--
+
++
+
-
--
+
++
+
4. by Pyson
그리고 참고로 Decision boundary는
Hyperplane이라고도 불림
-
-
+
+
+
+
Decision boundary
(Hyperplane)
-
앞서 그은 선(혹은 평면)을
Decision boundary(결정 경계)라 합니다.
5. by Pyson
n 차원의 data 가 있다고 할 때,
Hyperplane은 n-1 차원의 subspace 임
Hyperplane? 초평면?
2차원의 Hyperplane은 선(2-1차원)
3차원의 Hyperplane은 면(3-1차원)
6. by Pyson
그리고 각 Decision boundary와 가까이 있는 data들을
잇는 각 선(회색선)간 거리를 Margin 이라고 합시다.
-
-
+
+
+
+
Decision boundary
-
Margin
어떻게 하면 자료들을 잘 분류 할 수 있을까?
7. by Pyson
Margin을 최대화 하는 Decision boundary를 찾을 때,
분류가 잘 된다고 함. Why?
-
-
+
+
+
+
Decision boundary
Margin
-
SVM은 마진 최대화(Widest Margin Approach)로
주로 Data를 분류(Classify)하는 알고리즘 입니다.
8. by Pyson
마진이 넓으면 새로운 Data가 입력 되었을 때,
새로운 Data를 잘 분류할 수 있다 (즉, 오차가 적다)
-
-
+
+
+
+
Decision boundary
Margin
-
왜? 마진 최대화
Why? Widest Margin Approach
△
New data
10. by Pyson
어떤 분류가 잘 된 분류일까?
(Large Margin) (Small Margin)
Small margin vs Large margin
Source : https://stats.stackexchange.com/questions/31066/what-is-the-influence-of-c-in-svms-with-linear-kernel
11. by Pyson
만약 미래의 data가 위와 같다면
small margin이 분류가 잘 된 것임
Small margin vs Large margin
(Large Margin) (Small Margin)
Source : https://stats.stackexchange.com/questions/31066/what-is-the-influence-of-c-in-svms-with-linear-kernel
12. by Pyson
반대로 미래의 data가 아래와 같다면
large margin이 분류가 잘 된 것임
Small margin vs Large margin
(Large Margin) (Small Margin)
Source : https://stats.stackexchange.com/questions/31066/what-is-the-influence-of-c-in-svms-with-linear-kernel
13. by Pyson
비선형 data는 어떻게 분류할까?
아래와 같은 data는 어떻게 분류할 수
있을까?
Source : http://www.eric-kim.net/eric-kim-net/posts/1/kernel_trick.html
14. by Pyson
비선형 data도 kernel trick으로 분류할 수 있다.
Kernel trick
2차원 data를 3차원 data로 변경
x,y z = x2 + y2
Source : http://www.eric-kim.net/eric-kim-net/posts/1/kernel_trick.html
15. by Pyson
𝑢 를 𝑤 방향으로 투영(Projection) 시켜 그었을 때,
Decision boundary를 넘으면 +, 못 넘으면 – 로 분류하자
--
+
+
+
+
𝑤
Decision boundary
어떻게 분류할까?
Decision boundary에 수직인 법선 벡터(normal vector) 𝑤,
어떤 값인지 모르는 𝑢 가 있다고 하면,
𝑢
?
16. by Pyson
Decision Rule :
𝑤 ⦁ 𝑢 + b ≥ 0 이면 +, 아니면 -
𝑤
Decision boundary
𝑢
?
1) C는 Decision boundary를 결정하는 어떤 상수, b = -c
내적(dot product)
벡터의 내적(dot product)으로 decision boundary를
넘는지 안 넘는지 구할 수 있다.
𝑤 ⦁ 𝑢 ≥ c1)
이면 +, 아니면 –
17. by Pyson
두 경계선은 아래와 같이 표현된다.
𝑦(𝑤 ⦁ 𝑥 + b) = 1
-
-
+
+
+
+
Margin
-
두 경계선을 아래와 같이 구분한다고 가정
(마진을 구하기 위해 임의로 +1, -1을 가정함)
𝑤 ⦁ 𝑥+ + b ≥ 1 𝑤 ⦁ 𝑥+ + b = 1 (+경계선)
𝑤 ⦁ 𝑥− + b ≤ -1 𝑤 ⦁ 𝑥− + b = -1 (-경계선)
두 식을 합치기 위해,
+ sample 일 때 +1, - sample 일 때 -1
을 갖는 어떤 y가 있다고 가정하자
𝑤
𝑤 ⦁ 𝑥+ + b = 1 (+경계선)
𝑤 ⦁ 𝑥− + b = -1 (-경계선)
마진을 어떻게 최대화 할까?
우선 Margin을 구해보자(1)
18. by Pyson
Margin =
2
𝑤
-
+
𝑤
| 𝑤 |
𝑤 ⦁ 𝑥+ + b = 1 (+경계선)
𝑤 ⦁ 𝑥− + b = -1 (-경계선)
마진을 어떻게 최대화 할까?
우선 Margin을 구해보자(2)
𝑥−
𝑥+
Margin =
𝑤
| 𝑤 |
⦁ 𝑥+ − 𝑥− =
(𝑤 ⦁ 𝑥+ −𝑤 ⦁ 𝑥−)
𝑤
=
1−𝑏 −(−1−𝑏)
𝑤
=
2
𝑤
𝑤 ⦁ 𝑥+ = (1 – b)
𝑤 ⦁ 𝑥− = (-1 - b)
𝑤 의 단위 벡터(unit vector)
𝑤
19. by Pyson
마진을 최대화
1
2
𝑤 2
를 최소화
Margin =
2
𝑤
최대화
𝑤 를 최소화
1
2
𝑤 2 를 최소화
20. by Pyson
분류(Classification) 문제에서 에러는
어떻게 정의 될까?
y가 +1인 경우 +1
-1
예측 값 𝒇(𝒙)
실제 값이 + 인데 f(x) 가 – 인 경우 Error!
실제 값이 - 인데 f(x) 가 + 인 경우 Error!
y가 -1인 경우
실제 data y가 +1, -1 값으로 분류 되는 경우, 에러는?
+1
-1
1 - 𝐲 ∗ 𝒇 𝒙 , else
0, 𝐲 ∗ 𝒇 𝒙 ≥ 𝟏 True
False(Error)
𝐜 𝐱, 𝐲, 𝒇 𝒙 =
즉, y * f(x)가 +1 인 경우, 참(True)
y * f(x)가 –1 인 경우, 거짓(False)
21. by Pyson
Hinge loss 는 분류가 참일 때 0이고,
분류가 거짓일 때 Error 값을 가지게 됨
Hinge Loss
1 - 𝐲 ∗ 𝒇 𝒙 , else
0, 𝐲 ∗ 𝒇 𝒙 ≥ 𝟏 True
False(Error)
𝐜 𝐱, 𝐲, 𝒇 𝒙 =
𝐲 ∗ 𝒇 𝒙
𝑳𝒐𝒔𝒔
(𝐄𝐫𝐫𝐨𝐫)
22. by Pyson
마진을 최대화, 에러를 최소화하여
최적의 Decision Boundary를 구할 수 있음
결국, Margin을 최대화, Error를 최소화하는 문제는
min
1
2
λ 𝑤 2 +
𝑖=1
𝑛
(1 − 𝑦𝑖 ∗ 𝑓(𝑥𝑖, 𝑤𝑖))+
λ 는 regularizer로
λ 가 크면 overshoot(과적합)이 될 수 있고 (Margin이 작아짐)
λ 가 작으면, 수렴하지 않을 수 있음 (Margin이 커짐)
+는 Error가 양수일 때만 계산함(음수 일때는 0)
마진 최대화 에러 최소화
25. by Pyson
# Data를 불러온다
# 𝛾, λ, 학습횟수를 정한다.
# w 값을 초기화 한다
# Gradient descent 함수를 구한다
Classification이 참인 경우
Classification이 거짓인 경우
# 루프를 반복하면서 w값을 업데이트 한다.
# 결과를 출력한다.
Pseudo Code