์ด๋ฒ ์ธ์ ์์๋ ๋ชจ๋ธ์ ๊ฒฐ์ ๊ณผ์ ์ ์ค๋ช ํ ๋ ์์ฃผ ์ค์ํ ๊ฒฐ์ ํธ๋ฆฌ(decision tree) ๋ถ๋ฅ๊ธฐ๋ผ๋ ๋ชจ๋ธ์ ์๊ฐํด๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
1. ๊ฒฐ์ ํธ๋ฆฌ๋?
๊ฒฐ์ ํธ๋ฆฌ๋ ์ด๋ค ์ง๋ฌธ์ ๋ํ ๊ฒฐ์ ์ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ๋ถํดํ๋ ๋ชจ๋ธ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆผ 1์์ ์๋ฅผ ๋ค์ด๋ณผ๊น์?
๊ฒฐ์ ํธ๋ฆฌ๋ ํ๋ จ ๋ฐ์ดํฐ์ ํน์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ํ์ ํด๋์ค ๋ ์ด๋ธ์ ์ถ์ ํ ์ ์๋ ์ง๋ฌธ์ ํ์ตํฉ๋๋ค. ์์๋ ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง๋ง ๋์ผํ ๊ฐ๋ ์ ๋ถ๊ฝ ๋ฐ์ดํฐ์ ๊ฐ์ ์ค์ํ ํน์ฑ์์๋ ์ ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด "๊ฝ์์ ๊ธธ์ด๊ฐ 3cm๋ณด๋ค ๊ธด๊ฐ์?"๋ผ๋ ์/์๋์ค ์ง๋ฌธ์ ํ ์ ์์ต๋๋ค.
๊ฒฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌ์ ๋ฃจํธ, ๊ทธ๋ฌ๋๊น ํธ๋ฆฌ์ ๊ธฐ์์ด ๋๋ ๋ถ๋ถ๋ถํฐ ์์ํด์ ์ ๋ณด ์ด๋(Information Gain, IG)๊ฐ ์ต๋๊ฐ ๋๋ ํน์ฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋๋๋ค. ๋ฐ๋ณต์ ํตํด์ ๋ฆฌํ ๋ ธ๋๊ฐ ์์ํด์ง ๋๊น์ง ๋ชจ๋ ์์ ๋ ธ๋์์ ์ด ๋ถํ ์์ ์ ๋ฐ๋ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ์ด๋ ๊ฒ ํ๋ฉด ๊น์ ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ ธ์ ์ค๋ฒํผํ ์ด ๋ ํ๋ฅ ์ด ๋์๋ฐ, ์ด๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ๊ฐ์ง์น๊ธฐ(pruning)ํฉ๋๋ค.
์ ๋จ๋ฝ์์ ์ ๋ณด ์ด๋์ด ๋์์ฃ ? ์ฐ๋ฆฌ๋ ์ต๋ํ ์ํ์์ ์ ๋ณด๊ฐ ํ๋ถํ ํน์ฑ์ผ๋ก ๋ ธ๋๋ฅผ ๋๋๋ ๊ฒ์ด ๋ถ๋ฅ์ ์ ํฉํฉ๋๋ค. ์ด๋ ๋ ธ๋๋ฅผ ๋๋๊ธฐ ์ํด ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ต์ ํํ ๋ชฉ์ ํจ์๋ฅผ ์ ์ํด์ผํ๋๋ฐ, ์ด ๋ชฉ์ ํจ์๋ ๊ฐ ๋ถํ ์์ ์ ๋ณด ์ด๋์ ์ต๋ํํฉ๋๋ค. ์ ๋ณด ์ด๋์ ์๋ ์๊ณผ ๊ฐ์ต๋๋ค.
์ด ์์์ f๋ ๋ถํ ์ ์ฌ์ฉํ ํน์ฑ, ์ฆ ์ง๋ฌธ์ ๋๋ค. Dp์ Dj๋ ๋ถ๋ชจ์ j๋ฒ์งธ ์์ ๋ ธ๋์ ๋ฐ์ดํฐ์ด๊ณ , I๋ ๋ถ์๋(impurity)์ ๋๋ค. Np๋ ๋ถ๋ชจ ๋ ธ๋์ ์๋ ์ ์ฒด ์ํ ๊ฐ์์ ๋๋ค. ๊ฐ๊ฐ์ ์ํ์ด ์ง๋ฌธ์ ๋ง๋๊ธฐ ์ ์ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. Nj๋ j๋ฒ์งธ ์์ ๋ ธ๋์ ์ํ ๊ฐ์์ ๋๋ค. ์ ๋ณด ์ด๋์ ๋จ์ํ ๋ถ๋ชจ ๋ ธ๋์ ๋ถ์๋์ ์์ ๋ ธ๋์ ๋ถ์๋ ํฉ์ ์ฐจ์ด์ ๋๋ค. ์์ ๋ ธ๋์ ๋ถ์๋๊ฐ ๋ฎ์์๋ก ์ ๋ณด ์ด๋์ด ์ปค์ง๋๋ค. ์ฌ์ดํท๋ฐ์ ํฌํจํ ๋๋ถ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด์ง ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ถ๋ชจ๋ ธ๋๋ ๋ ๊ฐ์ ์์ ๋ ธ๋๋ก ๋๋์ด์ง๋๋ค.
์ด์ง ๊ฒฐ์ ํธ๋ฆฌ์ ์ค์ํ ์ญํ ์ ํ๋ ๋ถ์๋ ์งํ(๋ถํ ์กฐ๊ฑด)์ ๋ํ์ ์ผ๋ก ์ง๋ ๋ถ์๋(Gini impurity), ์ํธ๋กํผ(entropy, IH), ๋ถ๋ฅ ์ค์ฐจ(classification error, IE)์ ๋๋ค. ์ํ์ด ์๋ ๋ชจ๋ ํด๋์ค p(i|t)!=0์ ๋ํ ์ํธ๋กํผ์ ์ ์๋ ๊ทธ๋ฆผ 4์ ๊ฐ์ต๋๋ค.
์ฌ๊ธฐ์ p(i|t)๋ ํน์ ๋ ธ๋ t์์ ํด๋์ i์ ์ํ ์ํ ๋น์จ์ ๋๋ค. ํ ๋ ธ๋์ ๋ชจ๋ ์ํ์ด ๊ฐ์ ํด๋์ค์ด๋ฉด ์ํธ๋กํผ๋ 0์ด ๋ฉ๋๋ค. ํด๋์ค ๋ถํฌ๊ฐ ๊ท ๋ฑํ ๋ ์ํธ๋กํผ๊ฐ ์ต๋๊ฐ ๋๊ฒ ์ฃ . ์๋ฅผ ๋ค์ด, i=1์ผ ๋ p๊ฐ 1์ด๊ฑฐ๋ i=0์ด๊ณ p=1์ด๋ฉด ์ํธ๋กํผ๋ 0์ด๊ณ , i=1์ผ ๋ p๊ฐ 0.5์ i=0์ผ ๋ p๊ฐ 0.5๋ก ๊ท ๋ฑํ๋ฉด ์ํธ๋กํผ๋ 1์ด ๋ฉ๋๋ค. ์ํธ๋กํผ๋ ๋ฌผ๋ฆฌ์์ ๋ถ๊ท์นํจ์ ๋ปํ๋ค๋ ๊ฒ์ ๋ค์ด๋ณด์ จ๊ฒ ์ฃ ? ํธํ๊ฒ ๋น์ทํ ๊ฐ๋ ์ผ๋ก ์ดํดํ์๋ฉด ๋ฉ๋๋ค.
์ง๋ ๋ถ์๋๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์๋ชป ๋ถ๋ฅ๋ ํ๋ฅ ์ ์ต์ํํ๊ธฐ ์ํ ์ผ์ข ์ ๊ธฐ์ค์ ๋๋ค. ์ํธ๋กํผ์ ๋น์ทํ๊ฒ ์ง๋ ๋ถ์๋๋ ํด๋์ค๊ฐ ์๋ฒฝํ๊ฒ ๊ท ๋ฑํ๊ฒ ์์ฌ์์ ๋ ์ต๋๊ฐ ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ด์ง ํด๋์ค ํ๊ฒฝ, ์ฆ c๊ฐ 2์ผ ๋๋ I๊ฐ 0.5๊ฐ ๋ฉ๋๋ค. ์ค์ ๋ก ์ง๋ ๋ถ์๋์ ์ํธ๋กํผ๋ ๋ชจ๋ ๋งค์ฐ ๋น์ทํ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง๋ง, ๋ถ์๋ ์กฐ๊ฑด์ ๋ฐ๊พธ์ด์ ํธ๋ฆฌ๋ฅผ ํ๊ฐํ๋ ๊ฒ๋ณด๋ค๋ ๊ฐ์ง์น๊ธฐ์ ์์ค์ ๋ฐ๊พธ๋ ํธ์ด ๋ซ๋ค๊ณ ํฉ๋๋ค.
๋ง์ง๋ง ๋ถ์๋ ์งํ๋ ๋ถ๋ฅ ์ค์ฐจ์ ๋๋ค. ๊ฐ์ง์น๊ธฐ๋ ์ข์ ๊ธฐ์ค์ด๋ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ๋ ๋ ธ๋์ ํด๋์ค ํ๋ฅ ๋ณํ์ ๋๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
์ด์ ์ดํดํ๊ธฐ ์ฌ์ด ์์๋ฅผ ๋ค์ด๋ณผ๊น์? ์ฌ๋ฌ๋ถ๊ป ๋ ๊ฐ์ ๋ถํ ์๋๋ฆฌ์ค๋ฅผ ๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ถ๋ชจ๋ ธ๋์์ ์์ ๋งํ๋๋ก ๋ฐ์ดํฐ์ Dp๋ก ์์ํฉ๋๋ค. ํด๋์ค 1์ด 40๊ฐ, ํด๋์ค 2๊ฐ 40์ ์ํ์ ๊ฐ๊ณ ์๋ค์. ์ด๊ฒ์ ๋ ๊ฐ์ ๋ฐ์ดํฐ ์ Dleft์ Dright๋ก ๋๋๋๋ค. ๋ถ๋ฅ ์ค์ฐจ๋ฅผ ๋ถํ ๊ธฐ์ค์ผ๋ก ํ์ ๋ ์ ๋ณด ์ด๋์ ์๋๋ฆฌ์ค A์ B๊ฐ ๊ฐ์ต๋๋ค.(IG = 0.25)
๊ทธ๋ผ ์ด๋ฒ์๋ ์ง๋ ๋ถ์๋๋ก ๋๋์ด๋ณผ๊น์? ์ด ๊ฒฝ์ฐ์๋ ์๋๋ฆฌ์ค A(IG = 0.125)๋ณด๋ค ์๋๋ฆฌ์ค B(IG = 0.16)์ด ๋ ์์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๋์ต๋๋ค.
๋น์ทํ๊ฒ ์ํธ๋กํผ์ ๊ธฐ์ค๋ ์๋๋ฆฌ์ค A(IG=0.19)๋ณด๋ค ์๋๋ฆฌ์ค B(IG = 0.31)์ ๋ ์ ํธํฉ๋๋ค
์์ ๋์จ ์ธ ๊ฐ์ ๋ถ์๋ ๊ธฐ์ค์ ๋น๊ตํ๊ธฐ ์ํด ํด๋์ค 1์ ํ๋ฅ ๋ฒ์์ธ 0๋ถํฐ 1 ์ฌ์ด์ ๋ถ์๋ ์ธ๋ฑ์ค๋ฅผ ๊ทธ๋ ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ง๋ ๋ถ์๋๊ฐ ์ํธ๋กํผ์ ๋ถ๋ฅ ์ค์ฐจ์ ์ค๊ฐ์์ ๊ด์ฐฐํ๊ธฐ ์ํด ์ค์ผ์ผ์ด ์กฐ์ ๋ entropy/2๋ฅผ ์ถ๊ฐํ์์ต๋๋ค. ์๋ ์ฝ๋๋ฅผ ์คํํด๋ณผ๊น์?
import matplotlib.pyplot as plt
import numpy as np
def gini(p):
return p * (1 - p) + (1 - p) * (1 - (1 - p))
def entropy(p):
return - p * np.log2(p) - (1 - p) * np.log2((1 - p))
def error(p):
return 1 - np.max([p, 1 - p])
x = np.arange(0.0, 1.0, 0.01)
ent = [entropy(p) if p != 0 else None for p in x]
sc_ent = [e * 0.5 if e else None for e in ent]
err = [error(i) for i in x]
fig = plt.figure()
ax = plt.subplot(111)
for i, lab, ls, c, in zip([ent, sc_ent, gini(x), err],
['Entropy', 'Entropy (scaled)',
'Gini Impurity', 'Misclassification Error'],
['-', '-', '--', '-.'],
['black', 'lightgray', 'red', 'green', 'cyan']):
line = ax.plot(x, i, label=lab, linestyle=ls, lw=2, color=c)
ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.15),
ncol=5, fancybox=True, shadow=False)
ax.axhline(y=0.5, linewidth=1, color='k', linestyle='--')
ax.axhline(y=1.0, linewidth=1, color='k', linestyle='--')
plt.ylim([0, 1.1])
plt.xlabel('p(i=1)')
plt.ylabel('Impurity Index')
plt.show()
๊ทธ๋ฆผ 8์์ ํ์ธํ ์ ์๋ค์ํผ ์ง๋ ๋ถ์๋๋ ์ค์ผ์ผ์ด 1/2๋ก ์กฐ์ ๋ entropy์ ๊ฑฐ์ ์ผ์นํฉ๋๋ค. ์ด๋ ๊ฒ ๋ถ์๋ ์งํ ์ธ ๊ฐ์ง, ๋ถ๋ฅ ์ค์ฐจ, ์ํธ๋กํผ, ์ง๋ ๋ถ์๋๋ฅผ ์์๋ณด์์ต๋๋ค. ์ด์ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ณผ๊น์?
2. ๊ฒฐ์ ํธ๋ฆฌ ๋ง๋ค๊ธฐ
๊ฒฐ์ ํธ๋ฆฌ๋ ํน์ฑ๊ณต๊ฐ์ ์ฌ๊ฐํ์ผ๋ก ๋๋๊ธฐ ๋๋ฌธ์ ๋ณต์กํ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ค๋ง ์์์ ์ธ๊ธํ ๊ฒ๊ณผ ๊ฐ์ด ํธ๋ฆฌ๊ฐ ๋๋ฌด ์ปค์ง๊ณ ๊น์ด์ง๋ฉด ๊ฒฝ๊ณ๊ฐ ๋๋ฌด ๋ณต์กํด์ง๊ณ ์ค๋ฒํผํ ๋๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ์ฃผ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ ์ฝ๋๋ ์ฌ์ดํท๋ฐ๊ณผ ์ง๋ ๋ถ์๋ ์กฐ๊ฑด์ผ๋ก ์ต๋ ๊น์ด๊ฐ 4์ธ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ํ๋ จํฉ๋๋ค.
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(criterion='gini',
max_depth=4,
random_state=1)
tree.fit(X_train, y_train)
X_combined = np.vstack((X_train, X_test))
y_combined = np.hstack((y_train, y_test))
plot_decision_regions(X_combined, y_combined,
classifier=tree, test_idx=range(105, 150))
plt.xlabel('petal length [cm]')
plt.ylabel('petal width [cm]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
์ฌ์ดํท๋ฐ์ ํ๋ จ ์ดํ์ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ .dot ํ์ผ๋ก ์ถ์ถํ ์ ์์ต๋๋ค. GraphViz ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ ์๊ฐํํ ์ ์๋๋ฐ, ์ด ํ๋ก๊ทธ๋จ์ ์ฌ๊ธฐ์์ ๋ค์ด ๋ฐ์ ์ ์์ต๋๋ค. ๋ฌด๋ฃ์ ๋๋ค!
GraphViz ์ด์ธ์๋ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ pydotplus๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ pip ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ํตํด์ ์ค์นํ ์ ์์ต๋๋ค. ์๋์ฝ๋ค์ ๊ฒฝ์ฐ์๋ ๋์งธ ์ค์ ์ฐธ๊ณ ํ์ธ์.
pip3 install pydotplus
conda install pydotplus
์ ๋ค์ ์ฝ๋๋ ๋ก์ปฌ ๋๋ ํฐ๋ฆฌ์ pngํํ์ ๊ฒฐ์ ํธ๋ฆฌ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. out_file์ none์ผ๋ก ์ค์ ํ๋ฉด tree.dot ํ์ผ์ ๋ง๋ค์ง ์๊ณ dot ๋ฐ์ดํฐ๋ฅผ dot_data ๋ณ์์ ์ ํด์ค๋๋ค. filled, rounded, class_names, feature_names๋ ์ ํ์ฌํญ์ ๋๋ค.
from pydotplus import graph_from_dot_data
from sklearn.tree import export_graphviz
dot_data = export_graphviz(tree,
filled=True,
rounded=True,
class_names=['Setosa',
'Versicolor',
'Virginica'],
feature_names=['petal length',
'petal width'],
out_file=None)
graph = graph_from_dot_data(dot_data)
graph.write_png('tree.png')
๊ทธ๋ฆผ 10์ ๋ณด๋ฉด ๊ฒฐ์ ํธ๋ฆฌ๊ฐ ์ ํํ ๋ถํ ์ ์ฝ๊ฒ ๋ถ์ํ ์ ์์ต๋๋ค. ์ฒ์ ๋ฃจํธ ๋ ธ๋์์ 105๊ฐ์ ์ํ๋ก ์์ํ๊ณ , ๊ทธ ๋ค์์ ๊ฝ์ ๋๋น ๊ธฐ์ค์ ์ฌ์ฉํด 0.75๋ฅผ ๊ธฐ์ค์ผ๋ก 35๊ฐ์ 70๊ฐ ์ํ๋ก ๋๋๋๋ค. ์ฒซ ๋ถํ ๋ก ์ผ์ชฝ ์์ ๋ ธ๋๋ Iris-setasaํด๋์ค์ ์ํ๋ง์ ๊ฐ๊ฒ ๋์์ต๋๋ค! ๊ทธ ๋ค์ ์ค๋ฅธ์ชฝ์์ ๋ถํ ์ด ์ผ์ด๋์ Iris-versicolor์ Iris-verginica ํด๋์ค์ ์ํ์ ๊ตฌ๋ถํฉ๋๋ค.
3. ๋๋ค ํฌ๋ ์คํธ๋ก ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ์ ํธ๋ฆฌ ์ฐ๊ฒฐ
๋๋ค ํฌ๋ ์คํธ(random forest)๋ ๊ฒฐ์ ํธ๋ฆฌ์ ์์๋ธ(ensemble)๋ก ์๊ฐํ๋ฉด ์ฝ์ต๋๋ค. ๋๋ค ํฌ๋ ์คํธ๋ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ํ๊ท ๋ด๋ ๊ฒ์ ๋๋ค. ๊ฐ๊ฐ์ ํธ๋ฆฌ๋ ๋ถ์ฐ์ด ๋๋ฌด ๋์ ๋ฌธ์ ๊ฐ ์์ง๋ง ์์๋ธํ๋ฉด ๊ฒฌ๊ณ ํ ๋ชจ๋ธ์ ๋ง๋ค์ด์ ์ผ๋ฐํ ์ฑ๋ฅ์ ๋์ด๊ณ ์ค๋ฒํผํ ์ ์ํ์ ์ค์ผ ์ ์์ต๋๋ค. ๋๋ค ํฌ๋ ์คํธ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ 4๋จ๊ณ๋ก ์์ฝ๋ฉ๋๋ค.
- n๊ฐ์ ๋๋คํ ๋ถํธ์คํธ๋ฉ(bootstrap)์ํ์ ๋ฝ์ต๋๋ค. (์ค๋ณตํ์ฉํ๋ฉฐ ๋๋คํ๊ฒ n๊ฐ ์ํ ์ ํ)
- ๋ถํธ์คํธ๋ฉ ์ํ์์ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ํ์ตํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋
ธ๋์ ๋ํด์ ์๋์ ๊ฐ์ด ์ ์ฉํฉ๋๋ค
- ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ ๋๋คํ๊ฒ d๊ฐ์ ํน์ฑ์ ์ ํํฉ๋๋ค.
- ์ ๋ณด ์ด๋๊ณผ ๊ฐ์ ๋ชฉ์ ํจ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ต์ ์ ๋ถํ ์ ๋ง๋๋ ํน์ฑ์ ์ด์ฉํด ๋ ธ๋๋ฅผ ๋ถํ ํฉ๋๋ค.
- ๋จ๊ณ 1๊ณผ 2๋ฅผ k๋ฒ ๋ฐ๋ณตํฉ๋๋ค.
- ๊ฐ ํธ๋ฆฌ์ ์์ธก์ ๋ชจ์์ ๋ค์๊ฒฐ ํฌํ(majority voting)๋ก ํด๋์ค ๋ ์ด๋ธ์ ํ ๋นํฉ๋๋ค.
๋จ๊ณ 2์์ ํ๋ จํ ๋ ์กฐ๊ธ ๋ค๋ฅธ ์ ์ ๊ฐ ๋ ธ๋์์ ์ต์ ์ ๋ถํ ์ ์ฐพ๊ธฐ ์ํด ๋ชจ๋ ํน์ฑ์ ํ๊ฐํ๋ ๊ฒ ์๋๋ผ ๋๋คํ๊ฒ ์ ํ๋ ์ผ๋ถ ํน์ฑ๋ง ํ๊ฐํฉ๋๋ค.
๋๋ค ํฌ๋ ์คํธ๋ ๊ฒฐ์ ํธ๋ฆฌ์ฒ๋ผ ํด์์ด ์ฌ์ด ๊ฒ์ ์๋์ง๋ง ํ์ดํผ ํ๋ผ๋ฏธํฐ ํ๋์ ์๊ฐ์ ๋ง์ด ํฌ์ํ์ง ์์๋ ๋ฉ๋๋ค. ์ฆ ์์๋ธ ๋ชจ๋ธ์ด ๊ฐ๋ณ ๊ฒฐ์ ํธ๋ฆฌ๊ฐ ๋ง๋๋ ์ก์์ด ๊ฑฐ์ ์์ด ์์ ๋์ด์์ด ๊ฐ์ง์น๊ธฐ๋ฅผ ํ ํ์๊ฐ ์์ต๋๋ค. ์ค์ ์์ ์ ๊ฒฝ์จ์ผํ ๊ฒ์ ๋จ๊ณ 3 ๋ฟ์ ๋๋ค. ํธ๋ฆฌ ๊ฐ์๊ฐ ๋ง์์๋ก ๊ณ์ฐ ๋น์ฉ์ด ์ฆ๊ฐํ๊ณ ๊ทธ๋งํผ ๋ถ๋ฅ๊ธฐ์ ์ฑ๋ฅ์ด ์ข์์ง๋๋ค.
๋ถํธ์คํธ๋ฉ ์ํ ํฌ๊ธฐ๊ฐ ์์์ง๋ฉด ๊ฐ๋ณ ํธ๋ฆฌ์ ๋ค์์ฑ์ด ์ฆ๊ฐํ๊ณ , ๋ฐ๋ผ์ ๋๋ค ํฌ๋ ์คํธ์ ๋ฌด์์์ฑ์ด ์ฆ๊ฐํ๊ณ ์ค๋ฒํผํ ์ํฅ์ด ์ค์ด๋ญ๋๋ค. ํ์ง๋ง ๋ณดํต ๋ถํธ์คํธ๋ฉ ์ํ์ด ์์์๋ก ์ฑ๋ฅ์ด ์ค์ด๋ญ๋๋ค. ํ๋ จ ์ฑ๋ฅ๊ณผ ํ ์คํธ ์ฑ๋ฅ ์ฌ์ด์ ๊ฒฉ์ฐจ๊ฐ ์์์ง๊ธฐ ๋๋ฌธ์ด์ฃ . ๋ฐ๋๋ก ๋ถํธ์คํธ๋ฉ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ๋ฉด ์ค๋ฒํผํ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค. ๋ถํธ ์คํธ๋ฉ๊ณผ ๊ฐ๋ณ ๊ฒฐ์ ํธ๋ฆฌ๊ฐ ์๋ก ๋น์ทํด์ง๊ธฐ ๋๋ฌธ์ด์ฃ .
์ฌ์ดํท๋ฐ์ RandomForestClassifier์ ํฌํจํ ๋๋ถ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋ถํธ์คํธ๋ฉ ์ํ ํฌ๊ธฐ๋ฅผ ์๋ณธ ํ๋ จ ์ธํธ์ ์ํ ๊ฐ์์ ๊ฐ๊ฒ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ท ํ์กํ ํธ๋ ์ด๋ ์คํ๋ฅผ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ . ๋ถํ ํ ๋ ์ฌ์ฉํ ํน์ฑ ๊ฐ์ d๋ ์ ์ฒด ํน์ฑ ๊ฐ์๋ณด๋ค ์๊ฒ ํฉ๋๋ค. ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ๋ ์ ๋นํ ๊ธฐ๋ณธ๊ฐ์ d = m^(1/2)์ ๋๋ค.
from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(criterion='gini',
n_estimators=25,
random_state=1,
n_jobs=2)
forest.fit(X_train, y_train)
plot_decision_regions(X_combined, y_combined,
classifier=forest, test_idx=range(105, 150))
plt.xlabel('petal length [cm]')
plt.ylabel('petal width [cm]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
์ ์ฝ๋์ n_estimators ๋งค๊ฐ๋ณ์๋ก 25๊ฐ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ จํ๊ณ , ์ง๋ ๋ถ์๋๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
3. k-์ต๊ทผ์ ์ด์: ๊ฒ์ผ๋ฅธ ํ์ต ์๊ณ ๋ฆฌ์ฆ
์ด๋ฒ ์ธ์ ์ ๋ง์ง๋ง ์ง๋ํ์ต ์๊ณ ๋ฆฌ์ฆ์ k-์ต๊ทผ์ ์ด์(K-Nearest Neighbor, KNN)์ ๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ด์ ์ ์๊ณ ๋ฆฌ์ฆ๋ค๊ณผ๋ ์์ฃผ ๋ค๋ฅธ๋ฐ, KNN์ด ๊ฒ์ผ๋ฅธ ํ์ต๊ธฐ(lazy learner)๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฐ์ ์ฝ๊ฒ ์ ์ถํ ์ ์์ต๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ํ๋ จ ๋ฐ์ดํฐ์์ ํ๋ณ ํจ์๋ฅผ ํ์ตํ๋ ๊ฒ ์๋๋ผ ํ๋ จ ๋ฐ์ดํฐ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํฉ๋๋ค.
KNN์ ์์ฝํ์๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- ์ซ์ k์ ๊ฑฐ๋ฆฌ ์ธก์ ๊ธฐ์ค์ ์ ํํฉ๋๋ค.
- ๋ถ๋ฅํ๋ ค๋ ์ํ์์ k๊ฐ์ ์ต๊ทผ์ ์ด์์ ์ฐพ์ต๋๋ค.
- ๋ค์๊ฒฐ ํฌํ๋ฅผ ํตํด ํด๋์ค ๋ ์ด๋ธ์ ํ ๋นํฉ๋๋ค.
๊ทธ๋ฆผ 12๋ฅผ ํตํด์ ์ฐ๋ฆฌ๋ ๋ฌผ์ํ๋ก ํ์๋ ํฌ์ธํธ๊ฐ ๋๊ทธ๋ผ๋ฏธ ์ ๋ค์ฏ ๊ฐ์ ๋ค์๊ฒฐ ํฌํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ผ๊ฐํ ํด๋์ค ๋ ์ด๋ธ์ ํ ๋น๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
์ด๋ฌํ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ ๋ถ๋ฅ๊ธฐ๋ ์์ง๋ ์๋ก์ด ๋ฐ์ดํฐ์ ์ฆ์ ์ ์ํ ์ ์๋ ๊ฒ์ด ์ฅ์ ์ ๋๋ค. ๋จ์ ์ ์๋ก์ด ์ํ์ ๋ถ๋ฅํ๋ ๊ณ์ฐ์ด ์๋นํ ๋ณต์กํ๋ค๋ ์ ์ด์ฃ . ๋ฐ์ดํฐ์ ์ฐจ์์ด ์ ๊ณ ์๊ณ ๋ฆฌ์ฆ์ด ํจ์จ์ ์ธ ๊ตฌ์กฐ๊ฐ ์๋๋ผ๋ฉด ๊ณ์ฐ์ ๋ณต์ก๋๋ ์ํ ๊ฐ์์ ์ ํ์ ์ผ๋ก ์ฆ๊ฐํ ๊ฒ๋๋ค. ๋ ํ๋ จ ๋จ๊ณ๊ฐ ์์ผ๋ ํ๋ จ ์ํ์ ๋ฒ๋ฆด ์ ์์ด์ ์ ์ฅ๊ณต๊ฐ์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ฃ .
์๋ ์ฝ๋๋ฅผ ํตํด์ ์ ํด๋ฆฌ๋์(euclidean)๊ฑฐ๋ฆฌ ์ธก์ ๋ฐฉ์์ ์ฌ์ฉํ KNN๋ชจ๋ธ์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5,
p=2,
metric='minkowski')
knn.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std, y_combined,
classifier=knn, 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()
์ ์ ํ k๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค๋ฒํผํ ๊ณผ ์ธ๋ํผํ ์ฌ์ด์ ๊ท ํ์ ์ก์ ์ ์์ต๋๋ค. ๋น์ฐํ ๋ฐ์ดํฐ์ ํน์ฑ์ ์๋ง๋ ๊ฑฐ๋ฆฌ ์ธก์ ์งํ๋ฅผ ์ ํํด์ผํ์ฃ . ๋ถ๊ฝ ๋ฐ์ดํฐ์ฒ๋ผ ์ค์ ๊ฐ์ ๊ฐ์ง ๊ฒฝ์ฐ์๋ ์ ํด๋ฆฌ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ํด๋ฆฌ๋์์ ํ์คํํด์ผํ๋ค๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ์ฝ๋์์ minkowski ๊ฑฐ๋ฆฌ๋ ์ ํด๋ฆฌ๋์๊ณผ ๋งจํดํผ ๊ฑฐ๋ฆฌ๋ฅผ ์ผ๋ฐํํ ๊ฒ์ผ๋ก, ์๋ ๊ทธ๋ฆผ 14์ ๊ฐ์ต๋๋ค.
๋งค๊ฐ๋ณ์ p=2๋ก ์ง์ ํ๋ฉด ์ ํด๋ฆฌ๋์์ด, p-1๋ก ์ง์ ํ๋ฉด ๋งจํดํผ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋๋ค. ์ฌ์ดํท๋ฐ์๋ ๋ค๋ฅธ ๊ฑฐ๋ฆฌ ์ธก์ ๊ธฐ์ค์ด ๋ง์ผ๋ ์๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ถ๋ ์กฐ์ ์ ์คํจํ์ต๋๋ค! ์ฃ์กํฉ๋๋คใ ใ ์ด์ฉ์ง ๊ธ์ ์ธ ๋๋ง๋ค ์ ์ ์ธ์ ์ด ๊ธธ์ด์ง๋ ๊ฒ ๊ฐ์ ๊ธฐ๋ถ์ด๋ค์. ์ด๋ฒ ์ธ์ ์์ํ ๊ฒฐ์ ํธ๋ฆฌ, ์์๋ธ์ด๋ผ๋ ๊ฐ๋ ๊ณผ k-์ต๊ทผ์ ์ด์ ๋ชจ๋ธ์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์์๋ณด์์ต๋๋ค. ์ธ ๊ฐ์ง์ ๋ถ์๋ ์งํ์ ๋ํด์๋ ์์๋ณด์์ต๋๋ค. ์ง๋ ๋ถ์๋, ์ํธ๋กํผ, ๊ทธ๋ฆฌ๊ณ ๋ถ๋ฅ ์ค์ฐจ์์ฃ . ์ด๋ฒ ์ธ์ ์์๋ ๋ฐฉ๊ธ ์ธ๊ธ๋ ํค์๋๋ค๋ง ์ ๋๋ก ์์ ๋ ์ถฉ๋ถํ์ค ๊ฒ๋๋ค. ๋ฌธ์ฅ์ด ๋งค๋๋ฝ์ง ์์ ๋ถ๋ถ์ ํ์ ๊ฒ์ํ๋ฉด์ ์์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค. ๊ทธ๋ผ ์ ๋ ๋ค์ ์ธ์ ์์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ์ ๋ํ ๋ด์ฉ์ ๋ค๊ณ ์ค๋๋ก ํ๊ฒ ์ต๋๋ค!