์ด๋ฒ ์ธ์ ์์๋ ์ต๋ ๋ง์ง๊ณผ SVM, ๋น์ ํ ๋ถ๋ฅ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1. ์ํฌํธ ๋ฒกํฐ ๋จธ์ ๊ณผ ์ต๋ ๋ง์ง ๋ถ๋ฅ
์ํฌํธ ๋ฒกํฐ ๋จธ์ (support vector machine, SVM)์ ํผ์ ํธ๋ก ์ ํ์ฅ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ํผ์ ํธ๋ก ์ด ๋ถ๋ฅ ์ค์ฐจ๋ฅผ ์ต์ํํ๋ค๋ฉด SVM์ ์ต์ ํ ๋์์ ๋ง์ง์ ์ต๋ํํ๋ ๊ฒ์ ๋๋ค. ๋ง์ง์ ํด๋์ค๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒฐ์ ๊ฒฝ๊ณ์ ๊ฒฐ์ ๊ฒฝ๊ณ์ ๊ฐ์ฅ ๊ฐ๊น์ด ํ๋ จ ์ํ ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ ๋๋ค. ์ด ๊ฐ์ฅ ๊ฐ๊น์ด ํ๋ จ ์ํ์ ์ํฌํธ ๋ฒกํฐ(support vector)๋ผ๊ณ ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง์ง์ด ํฐ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ์ํ๋ ์ด์ ๋ ์ผ๋ฐํํ ๋ ์ค์ฐจ๊ฐ ๋ฎ์์ง๋ ๊ฒฝํฅ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ง์ด ์์ผ๋ฉด ์์ ์๋ก ๊ฒฐ์ ๊ฒฝ๊ณ์ ์ํ์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์์ ธ ์ค๋ฒํผํ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋ง์ง ์ต๋ํ์ ์ดํด๋ฅผ ์ํด ์์ฑ ์ํ ์ชฝ์ ๊ฒฐ์ ๊ฒฝ๊ณ์ ์์ฑ ์ํ ์ชฝ์ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ์์ธํ๊ฒ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆผ 2์ ์ฒซ์งธ ์ค์ด ์์ฑ ์ํ ๊ฒฝ๊ณ, ๋์งธ ์ค์ด ์์ฑ ์ํ ๊ฒฝ๊ณ์ ๋๋ค. ์ฒซ ๋ฒ์งธ ์์์ ๋ ๋ฒ์งธ ์์ ๋นผ๋ฉด ์ ์งธ ์ค๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ด ์์ ๋ฒกํฐ w์ ๊ธธ์ด๋ก ์ ๊ทํ ํ ์ ์์ต๋๋ค.
์ฒซ์งธ ์ค์ด w์ ๊ธธ์ด๋ก ์ ๊ทํ๋ ์์ด๊ณ ๊ทธ ์๋์ ์์ด ๊ฒฐ๊ณผ์์ ๋๋ค. ๊ฒฐ๊ณผ์์ ์ข๋ณ์ ์์ฑ ์ชฝ ๊ฒฐ์ ๊ฒฝ๊ณ์ ์์ฑ ์ชฝ ๊ฒฐ์ ๊ฒฝ๊ณ์ ๊ฑฐ๋ฆฌ๋ก, ์ต๋ํํ๋ ค๋ ๋ง์ง(margin)์ ๋๋ค.
SVM์ ๋ชฉ์ ํจ์๋ ์ํ์ด ์ ํํ๊ฒ ๋ถ๋ฅ๋๋ค๋ ์กฐ๊ฑด ํ์ ์ฐ๋ณ์ ์ต๋ํํจ์ผ๋ก์จ ๋ง์ง์ ์ต๋ํํ๋ ๊ฒ์ ๋๋ค. ์ด ์กฐ๊ฑด์ ์๋ ๊ทธ๋ฆผ 4์ ๊ฐ์ด ์ธ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ 4์ ํ๊ธฐ๋ N์ ๋ฐ์ดํฐ์ ์๋ ์ํ์ ๊ฐ์์ ๋๋ค. ์ด ๋ ์์ ๋ชจ๋ ์์ฑ ์ํ์ ์์ฑ ์ชฝ ๊ฒฐ์ ๊ฒฝ๊ณ ๋๋จธ์, ์์ฑ ์ํ์ ์์ฑ ์ชฝ ๊ฒฐ์ ๊ฒฝ๊ณ ๋๋จธ์ ์์ด์ผํ๋ค๋ ๊ฒ์ ์ด์ผ๊ธฐํฉ๋๋ค. ์ด๋ ๊ทธ๋ฆผ 5์ ์์๊ณผ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ์ธ ์ ์์ต๋๋ค.
์ค์ ๋ก๋ ๋์ผํ ํจ๊ณผ๋ฅผ ๋ด๋ฉด์ ์ฝฐ๋๋ผํฑ ํ๋ก๊ทธ๋๋ฐ(quadratic programming) ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์๋ ๋ฒกํฐ w์ ๊ธธ์ด์ ์ ๊ณฑ์ 1/2๋ฅผ ๊ณฑํ ๊ฐ์ ์ต์ํํ๋ ๊ฒ์ด ๋ ์ฝ๋ค๊ณ ํฉ๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ฝฐ๋๋ผํฑ ํ๋ก๊ทธ๋๋ฐ์ ์์ผ๋ก๋ ๋ค๋ฃจ์ง ์์ ๊ฒ์ด๋ฏ๋ก, ์์ธํ ์๊ณ ์ถ์ผ์ ๋ถ๋ค์ <ํธ์ฆ์จ ํ๋ก๊ทธ๋๋ฐ>์ด๋ผ๋ ์ฑ ์ ์ฐธ์กฐํด์ฃผ์๊ธธ ๋ฐ๋๋๋ค. ์ํฌํธ ๋ฒกํฐ ๋จธ์ ์ ๋ํ ๋ ์์ธํ ๋ด์ฉ์ <The Nature of Statistical Learning Theory, Springer Science+Business Media, Vladimir Vapnik, 2000> ํน์ <A Tutorial on Support Vector Machines for Pattern Recognition(Data Mining and Knowledge Discovery, 2(2) : 121-167, 1998>์ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.
2. ์ฌ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋น์ ํ ๋ฌธ์ ๋ค๋ฃจ๊ธฐ
์ด๋ฒ์๋ 1995๋ ๋ธ๋ผ๋๋ฏธ๋ฅด ๋ฐํ๋์ด ์๊ฐํ ์ฌ๋ ๋ณ์๋ง ๊ฐ๋จํ๊ฒ ์ด์ผ๊ธฐ ํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด ์ฌ๋ ๋ณ์๋ฅผ ์ํํธ ๋ง์ง ๋ถ๋ฅ(soft margin classfication)์ด๋ผ๊ณ ํฉ๋๋ค. 1์์ ์๊ฐํ ์ฌ๋ ๋ณ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ ํ๋ ๋ง์ง ๋ถ๋ฅ๋ผ๊ณ ๋ ๋ถ๋ฅด์ฃ . ์ฌ๋ ๋ณ์๊ฐ ์ฐธ ์์๊ฒ ์๊ฒผ๋๋ฐ, ์ํ์์ ์ฐพ์ ์ ์์ด์ ์์ฌ์ธ ๋ฐ๋ฆ์ ๋๋ค. ์ฌ๋ ๋ณ์๋ ์ ํ์ ์ผ๋ก ๊ตฌ๋ถ๋์ง ์๋ ๋ฐ์ดํฐ์์ ์ ํ ์ ์ฝ ์กฐ๊ฑด์ ์ํํ๊ธฐ ์ํด์ ๋์ ๋์์ต๋๋ค. ์ด๋์ ๋ ๋น์ฉ์ ์ํด๋ณด๋ฉด์ ๋ถ๋ฅ ์ค์ฐจ๊ฐ ์๋ ์ํฉ์์ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ดํ๋๋ก ํ๋ ๊ฒ์ด์ฃ . ์์ ๊ฐ์ธ ์ฌ๋ ๋ณ์๋ฅผ ์ ํ ์ ์ฝ ์กฐ๊ฑด์ ๋ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ฌ๊ธฐ์ N์ ๋ฐ์ดํฐ์ ์ ์๋ ์ํ ๊ฐ์์ ๋๋ค. ์ ์ฝ ์กฐ๊ฑด ์๋์์ ์ต์ํํ ์๋ก์ด ๋ชฉ์ ํจ์๋ ๊ทธ๋ฆผ 7๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆผ 7์ ๋ณ์ C๋ฅผ ํตํด ๋ถ๋ฅ ์ค์ฐจ์ ๋ํ ๋น์ฉ์ ์กฐ์ ํ ์ ์์ต๋๋ค. C๊ฐ์ด ํฌ๋ฉด ์ค์ฐจ์ ๋ ์๊ฒฉํด์ ธ ์ค์ฐจ์ ๋ํ ๋น์ฉ์ด ์ปค์ง๊ณ , ์์ผ๋ฉด ๋ถ๋ฅ ์ค์ฐจ์ ๋ ์๊ฒฉํด์ ธ ๋น์ฉ์ด ์์์ง๋๋ค. ๋งค๊ฐ๋ณ์ C๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ง ํญ์ ์ ์ดํ ์ ์์ต๋๋ค ๊ทธ๋ฆผ 8๋ก ์๊ฐ์ ์ผ๋ก ํ์ธํด๋ณผ๊น์?
์ฌ๋ฌ๋ถ๋ ๋์น์ฑ์ จ๊ฒ ์ง๋ง ์ด ๊ฐ๋ ์ ๊ท์ ์ ๊น์ ๊ด๋ จ์ด ์์ต๋๋ค. Session 7์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ๊ท์ ๊ฐ ์๋ ๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ C๊ฐ์ ์ค์ด๋ฉด ํธํฅ์ด ๋๊ณ , ๋ชจ๋ธ ๋ถ์ฐ์ ์ค์ด๋ญ๋๋ค.
์๋ ์ฝ๋๋ ๋ถ๊ฝ ๋ฐ์ดํฐ์ ์ ๊ฝ ๋ถ๋ฅ ๋ฌธ์ ์ SVM ๋ชจ๋ธ์ ํ๋ จํ๋ ๋ด์ฉ์ ๋๋ค. ์ฝ๋๋ฅผ ์คํํ๋ฉด ๊ทธ๋ฆผ 9์ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
from sklearn.svm import SVC
svm = SVC(kernel='linear', C=1.0, random_state=1)
svm.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std,
y_combined,
classifier=svm,
test_idx=range(105, 150))
plt.scatter(svm.dual_coef_[0, :], svm.dual_coef_[1, :])
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
์ด๋ฒ์๋ ์ฌ์ดํท๋ฐ์ ๋๋ค. ์ด์ ์ธ์ ์์ ๋ณด์ จ๋ ์ฌ์ดํท๋ฐ์ Logistic Regression ํด๋์ค๋ฅผ LIBLINEAR ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ C/C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋งํฌ์์ ํ์ธํ์ค ์ ์์ต๋๋ค. SVM์ ํ๋ จํ๋ SVC ํด๋์ค๋ LISVM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ SVM์ ํนํ๋ C/C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์๊ธฐ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
์์ํ๊ฒ ํ์ด์ฌ์ผ๋ก๋ง ๊ตฌํํ๋ ๊ฒ์ ๋ฏธํด LIBLINEAR์ LIBSVM์ ๋ง์ ์ ํ ๋ถ๋ฅ๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ จํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ์ข ์ข ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ์ปค์ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ๋ง์ง ์๋ ๊ฒฝ์ฐ, ์ฌ์ดํท๋ฐ์ ๋์์ผ๋ก SDGClassifier ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํด๋์ค๋ partial_fit์ผ๋ก ์จ๋ผ์ธ ํ์ต์ ์ง์ํฉ๋๋ค. ์จ๋ผ์ธ ํ์ต์ ๋ํด์๋ ๊ธฐ์ตํ์์ฃ ? SDGClassifier์ ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ๊ณผ ๋น์ทํ ๊ฐ๋ ์ ๋๋ค.
ํผ์ ํธ๋ก , ๋ก์ง์คํฑ ํ๊ท, ์ํฌํธ ๋ฒกํฐ ๋จธ์ ์ ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ์๋ ์ฝ๋์ ๊ฐ์ต๋๋ค.
from sklearn.linear_model import SGDClassifier
ppn = SGDClassifier(loss='perceptron') #perceptron
lr = SGDClassifier(loss='log') #logistic regression
svm = SGDClassifier(loss='hinge') #svm
3. ๋น์ ํ ๋ถ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์ํ ์ปค๋
๋จธ์ ๋ฌ๋์ ํ๋ ์ฌ๋๋ค ์ฌ์ด์์ SVM์ด ์ธ๊ธฐ๊ฐ ๋ง์ ์ด์ ๋ ๋น์ ํ ๋ถ๋ฅ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ์ปค๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ปค๋ SVM(kernel SVM)์ ์ฃผ์ ๊ฐ๋ ์ค๋ช ์ ์, ์ ํ์ผ๋ก ๋ถ๋ฅ๋์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ํ ๋ฐ์ดํฐ์ ์ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ ์ฝ๋์์ numpy ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ logical_or ํจ์๋ฅผ ์ฌ์ฉํด XOR ํํ์ ๊ฐ๋จํ ๋ฐ์ดํฐ์ ์ ๋ง๋ญ๋๋ค. ๋๋ต 100๊ฐ ์ํ์ ํด๋์ค ๋ ์ด๋ธ 1๋ก ํ ๋นํ๊ณ ๋๋จธ์ง 100๊ฐ ์ํ์ ํด๋์ค ๋ ์ด๋ธ -1๋ก ํ ๋นํฉ๋๋ค.
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0,
X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)
plt.scatter(X_xor[y_xor == 1, 0],
X_xor[y_xor == 1, 1],
c='b', marker='x',
label='1')
plt.scatter(X_xor[y_xor == -1, 0],
X_xor[y_xor == -1, 1],
c='r',
marker='s',
label='-1')
plt.xlim([-3, 3])
plt.ylim([-3, 3])
plt.legend(loc='best')
plt.tight_layout()
plt.show()
๊ทธ๋ฆผ 10์์ ํ์ธํ ์ ์๋ค์ํผ ์์ฑ๊ณผ ์์ฑ ํด๋์ค๋ฅผ ์ ํ ๊ฒฐ์ ๊ฒฝ๊ณ๋ก๋ ๊ตฌ๋ถํ ์ ์์ ๊ฒ ๊ฐ์ฃ ? ์ด๋ ๊ฒ ์ ํ์ ์ผ๋ก ๊ตฌ๋ถ๋์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ปค๋ ๋ฐฉ๋ฒ(kernel method)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ปค๋ ๋ฐฉ๋ฒ์ ๋งคํํจ์ ๋ฅผ ์ฌ์ฉํด ์๋ณธ ํน์ฑ๋ค์ ์ ํ ์กฐํฉ์ ์ ํ์ ์ผ๋ก ๊ตฌ๋ถํ ์ ์๋ ๊ณ ์ฐจ์ ๊ณต๊ฐ์ ๋ํ๋ด๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆผ 12์ ๊ฐ์ด ๊ณ ์ฐจ์ ๊ณต๊ฐ์์ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ๊ทธ๋ฆฌ๊ณ ์๋ณธ ํน์ฑ ๊ณต๊ฐ์ผ๋ก ๋๋๋ฆฌ๋ฉด ๋น์ ํ ํํ์ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ผ ์ด์ ๊ณ ์ฐจ์ ๊ณต๊ฐ์์ ๋ถํ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ์ฐพ์๋ณผ๊น์? ๋จผ์ , SVM์ผ๋ก ๋น์ ํ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์ ๋งคํํจ์ โฎ๋ฅผ ์ฌ์ฉํด์ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ฐจ์์ผ๋ก ๋ณํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ณ ์ฐจ์ ํน์ฑ ๊ณต๊ฐ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๋ ์ ํ SVM ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค. ์ดํ์ ๊ฐ์ ๋งคํ ํจ์์ ์ ํ ๋ชจ๋ธ๋ก ๋ถ๋ฅํ ์ ์์ต๋๋ค.
์ด ๋ฐฉ๋ฒ์ ๋ฌธ์ ์ ์ ์๋ก์ด ํน์ฑ์ ๋ง๋๋ ๊ณ์ฐ์์ ๋น์ฉ์ด ๋๋ฌด ๋น์ธ๋ค๋ ์ ์ ๋๋ค. ๊ทธ๋์ ์ฌ๊ธฐ์ ์์ ์ปค๋ ๊ธฐ๋ฒ์ด ๋ฑ์ฅํ๊ฒ ๋ฉ๋๋ค. SVM ํ๋ จ์ ์ํ ์ฝฐ๋๋ผํฑ ํ๋ก๊ทธ๋๋ฐ์ ์์์ ๋งํ๋ค์ํผ ๋ค๋ฃจ์ง๋ ์๊ฒ ์ง๋ง ์ค์ ์์ ํ์ํ ๊ฒ์ ๊ทธ๋ฆผ 13๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆผ 13์ ์ ๊ณฑ์ ๊ณ์ฐํ๋๋ฐ ๋๋ ๋น์ฉ ์ ๊ฐ์ ์ํด ๊ทธ๋ฆผ 13 ๋์งธ ์ค์ ์ปค๋ ํจ์๊ฐ ํ์ํฉ๋๋ค.
๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ปค๋ ์ค ํ๋๋ ๋ฐฉ์ฌ ๊ธฐ์ ํจ์(Radial Basis Function, RBF)์ ๋๋ค. ๋ค๋ฅธ ๋ง๋ก ๊ฐ์ฐ์์ ์ปค๋(Gaussian kernel)์ด๋ผ๊ณ ๋ ํฉ๋๋ค. ์ฒซ์งธ ์ค๋ก ์ธ ์ ์๊ณ , ์กฐ๊ธ ๋ ๊ฐ๋จํ๊ฒ ๋ ๋ฒ์งธ ์ค๋ก๋ ์ธ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๊ฐ๋ง๋ ์ต์ ํ ๋์ ํ๋ผ๋ฏธํฐ๋ ์๋๋๋ค.
๋๋ต ๋งํ๋ฉด ์ปค๋์ด๋ ์ฉ์ด๋ ์ํ ๊ฐ์ ์ ์ฌ๋ ํจ์๋ก ํด์ํ ์ ์์ต๋๋ค. ์์ ์ฐ์ธ ์์ ๋ถํธ๊ฐ ๊ฑฐ๋ฆฌ ์ธก์ ์ ์ ์ฌ๋ ์ ์๋ก ๋ฐ๊พธ๋ ์ญํ ์ ํฉ๋๋ค. ์ ์ฌ๋ ์ ์๋ 0๊ณผ 1์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋๋ค.
์ด์ ์ปค๋ SVM์ ํ๋ จํด XOR ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์์ ์ฌ์ดํท๋ฐ์ SVCํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ , kernel='linear'์ kernel='rbf'๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฉ๋๋ค.
svm = SVC(kernel='rbf', random_state=1, gamma=0.10, C=10.0)
svm.fit(X_xor, y_xor)
plot_decision_regions(X_xor, y_xor,
classifier=svm)
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
gamma = 0.1๋ก ์ง์ ํ ๋งค๊ฐ๋ณ์ ๊ฐ๋ง๊ฐ์ ํฌ๊ฒ ํ๋ฉด ์ํฌํธ ๋ฒกํฐ์ ์ํฅ, ๋ฒ์๊ฐ ์ค์ด๋ค๊ณ ๊ฒฐ์ ๊ฒฝ๊ณ๊ฐ ๋ ์ํ์ ๊ฐ๊น์์ง๊ณ ๊ตฌ๋ถ๊ตฌ๋ถํด์ง๋๋ค. ์ด๋ ๊ฐ์ฐ์์ ๊ตฌ์ ํฌ๊ธฐ๋ฅผ ์ ํํ๋ ๋งค๊ฐ๋ณ์๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์์ธํ ์ดํด๋ฅผ ์ํด ์๋ ์ฝ๋๋ฅผ ๋ณผ๊น์?
svm = SVC(kernel='rbf', random_state=1, gamma=0.2, C=1.0)
svm.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std, y_combined,
classifier=svm, test_idx=range(105, 150))
plt.scatter(svm.dual_coef_[0,:], svm.dual_coef_[1,:])
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
๊ฐ๋ง ๊ฐ์ ์๊ฒ ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ์ ๊ฒฝ๊ณ๊ฐ ๋ถ๋๋ฝ๊ณ ํํํฉ๋๋ค. ๋ฐ๋ฉด์ ๊ฐ๋ง ๊ฐ์ ํฌ๊ฒํ ๊ฒฐ๊ณผ๋ ๋ณผ๊น์?
svm = SVC(kernel='rbf', random_state=1, gamma=100.0, C=1.0)
svm.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std, y_combined,
classifier=svm, test_idx=range(105, 150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
๊ทธ๋ฆผ 17๊ณผ ๊ฐ์ ๊ทธ๋ํ๋ฅผ ํ์ธํ ์ ์๋๋ฐ, ์ ๋ง ๊ฒฐ์ ๊ฒฝ๊ณ๊ฐ ๋ถ๋๋ฝ์ง ๋ชปํ๊ณ ํ๋ จ๋ฐ์ดํฐ์ ์ง๋์น๊ฒ ๋ง์ถฐ์ง ์ค๋ฒํผํ ์ด ์ผ์ด๋ฌ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ณธ ์ ์๋ ํ ์คํธ ๋ฐ์ดํฐ์์๋ ์ผ๋ฐํ ์ค์ฐจ๊ฐ ๋์ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์์ ๊ฐ๋ง ๋งค๊ฐ๋ณ์๊ฐ ๊ณผ๋์ ํฉ์ ์กฐ์ ํ๋ ์ค์ํ ์ญํ ์ ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด๋ฒ ์ธ์ ์์๋ ๋ง์ง๊ณผ ๋น์ ํ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์์ต๋๋ค. ์ต๋ ๋ง์ง์ ์ ์ํ๋์ง, ์ ํ์ ์ผ๋ก ๋ถ๋ฅํ ์ ์๋ ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ์ฌ ๋ถ๋ฅํ๋์ง ๋ ์ค๋ฅด์๋์? ๊ท์ ์ ๊ด๋ จ๋ ๊ฐ๋ง ํจ์์ ์ฌ๋๋ณ์๋ ๊ธฐ์ต๋์์ฃ ? SVM๊ณผ ๋ง์ง, ๊ท์ ์ ๊ฐ๋ง ๋งค๊ฐ๋ณ์๊ฐ ๊ธฐ์ต๋์ ๋ค๋ฉด ๊ฑฐ์ ๋ค ํ์ จ์ต๋๋ค. ๋ค์ ์ธ์ ์์๋ ๊ฒฐ์ ํธ๋ฆฌ ํ์ต์ ๋ํด์ ๋ค๋ฃจ๊ฒ ๋ฉ๋๋ค. ๋ค์ ์ธ์ ์์ ๋ด์!