A A
[ML] Decision Tree (๊ฒฐ์ • ํŠธ๋ฆฌ)
์ด๋ฒˆ์—๋Š” Decision Tree (๊ฒฐ์ • ํŠธ๋ฆฌ)์— ๋ฐํ•˜์—ฌ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ฒฐ์ •ํŠธ๋ฆฌ(Decision Tree)๋Š” ๋ถ„๋ฅ˜์™€ ํšŒ๊ท€ ๋ฌธ์ œ์— ๋ชจ๋‘ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ง€๋„ํ•™์Šต ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

์ด ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๊ฐ ๋‚ด๋ถ€ ๋…ธ๋“œ๋Š” ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ๋ถ„ํ• ์„ ๋‚˜ํƒ€๋‚ด๊ณ , ๊ฐ€์ง€(branch)๋Š” ๊ทธ ์กฐ๊ฑด์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ตœ์ข… ๋ฆฌํ”„ ๋…ธ๋“œ(leaf node)๋Š” ์˜ˆ์ธก ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Decision Tree์˜ ์ฃผ์š” ํŠน์ง•

  • ์ง๊ด€์„ฑ: ๊ฒฐ์ • ํŠธ๋ฆฌ๋Š” ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด ์ดํ•ด๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ๋น„๋ชจ์ˆ˜์  ๋ฐฉ๋ฒ•: ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ์— ๋Œ€ํ•ด ํŠน์ • ๊ฐ€์ •์„ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ์…‹์— ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด์„ ์šฉ์ด์„ฑ: ๋ชจ๋ธ์ด ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •์„ ๋‚ด๋ ธ๋Š”์ง€ ์‰ฝ๊ฒŒ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Decision Tree์˜ ๊ธฐ๋ณธ ์›๋ฆฌ

๋…ธ๋“œ์™€ ๊ฐ€์ง€

  • ๋ฃจํŠธ ๋…ธ๋“œ (Root Node): ํŠธ๋ฆฌ์˜ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๋ฉฐ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด๋ถ€ ๋…ธ๋“œ (Internal Node): ๊ฐ ๋…ธ๋“œ๋Š” ํŠน์ • ํŠน์„ฑ์˜ ์กฐ๊ฑด์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ๋ฆฌํ”„ ๋…ธ๋“œ (Leaf Node): ์ตœ์ข…์ ์œผ๋กœ ์˜ˆ์ธก ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ๊ฐ€์ง€ (Branch): ๋…ธ๋“œ ๊ฐ„์˜ ์—ฐ๊ฒฐ๋กœ, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋ถ„ํ• 

  • ๋ฐ์ดํ„ฐ๋Š” ๊ฐ ๋…ธ๋“œ์—์„œ ํŠน์ • ํŠน์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ค€์€ ์ •๋ณด ์ด๋“(Information Gain) ๋˜๋Š” ์ง€๋‹ˆ ๋ถˆ์ˆœ๋„(Gini Impurity) ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Decision Tree - ๋ถ„ํ•  ๊ธฐ์ค€

Decision Tree (๊ฒฐ์ • ํŠธ๋ฆฌ)์˜ ๋ถ„ํ•  ๊ธฐ์ค€์€ ์ •๋ณด์ด๋“(Information Gain)์— ๋”ฐ๋ผ์„œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

Information Gain (์ •๋ณด ์ด๋“)

์ •๋ณด์ด๋“์€ ๋ถ„ํ•  ์ „ํ›„์˜ ์—”ํŠธ๋กœํ”ผ(Entropy) ์ฐจ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

์—”ํŠธ๋กœํ”ผ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ถˆํ™•์‹ค์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํด๋ž˜์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ํ˜ผํ•ฉ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ํŠน์„ฑ์— ๋Œ€ํ•ด ์ •๋ณด ์ด๋“์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๋ถ„ํ• ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฌ๊ธฐ์„œ D๋Š” ๋ฐ์ดํ„ฐ์…‹, pi๋Š” ํด๋ž˜์Šค i์˜ ํ™•๋ฅ , c๋Š” ํด๋ž˜์Šค์˜ ์ˆ˜ ์ž…๋‹ˆ๋‹ค.

  • A๋Š” ํŠน์„ฑ, D๋Š” ํŠน์„ฑ A๊ฐ’์˜ v์— ๋ฐํ•œ ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„ ์ง‘ํ•ฉ ์ž…๋‹ˆ๋‹ค.

์ˆœ์„œ

1. ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ์…‹ D ์—์„œ ์—”ํŠธ๋กœํ”ผ H(D)๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

2. ๊ฐ ํŠน์„ฑ ์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ’์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ์…‹์„ ๋ถ„ํ• ํ•˜๊ณ , ๋ถ„ํ• ๋œ ๊ฐ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์—”ํŠธ๋กœํ”ผ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

3. ๊ฐ ๋ถ„ํ• ์˜ ์ •๋ณด ์ด๋“ IG(D, A)๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ์ •๋ณด ์ด๋“์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ํŠน์„ฑ์„ ์„ ํƒํ•˜์—ฌ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.


์ง€๋‹ˆ ๋ถˆ์ˆœ๋„(Gini Impurity)

์ง€๋‹ˆ ๋ถˆ์ˆœ๋„๋Š” ๋…ธ๋“œ๊ฐ€ ํ•œ ํด๋ž˜์Šค์— ์†ํ•  ํ™•๋ฅ ์„ ์ธก์ •ํ•˜์—ฌ ๋ถˆ์ˆœ๋„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.

์ง€๋‹ˆ ๋ถˆ์ˆœ๋„ ๊ฐ์†Œ๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ํŠน์„ฑ์œผ๋กœ ๋ถ„ํ• ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • D๋Š” ๋ฐ์ดํ„ฐ์…‹, pi๋Š” ํด๋ž˜์Šค i์˜ ํ™•๋ฅ , c๋Š” ํด๋ž˜์Šค ์ˆ˜ ์ž…๋‹ˆ๋‹ค.

์ˆœ์„œ

1. ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ์…‹ D ์—์„œ ์ง€๋‹ˆ ๋ถˆ์ˆœ๋„ G(D)๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

2. ๊ฐ ํŠน์„ฑ ์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ’์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ์…‹์„ ๋ถ„ํ• ํ•˜๊ณ , ๋ถ„ํ• ๋œ ๊ฐ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์ง€๋‹ˆ ๋ถˆ์ˆœ๋„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

3. ๊ฐ ๋ถ„ํ• ์˜ ์ง€๋‹ˆ ๋ถˆ์ˆœ๋„ ๊ฐ์†Œ G ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ์ง€๋‹ˆ ๋ถˆ์ˆœ๋„ ๊ฐ์†Œ๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ํŠน์„ฑ ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.


Decision Tree - ๊ฒฐ์ •ํŠธ๋ฆฌ์˜ ์žฅ,๋‹จ์ 

๊ฒฐ์ •ํŠธ๋ฆฌ์˜ ์žฅ์ 

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

๊ฒฐ์ •ํŠธ๋ฆฌ์˜ ๋‹จ์ 

  • ๊ณผ์ ํ•ฉ: ํŠธ๋ฆฌ๊ฐ€ ๊นŠ์–ด์งˆ์ˆ˜๋ก ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์— ๊ณผ์ ํ•ฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
  • ๋ณ€๋™์„ฑ: ๋ฐ์ดํ„ฐ์˜ ์ž‘์€ ๋ณ€ํ™”์—๋„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ํฌ๊ฒŒ ๋ณ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Decision Tree Example Code

# ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž„ํฌํŠธ
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import classification_report, ConfusionMatrixDisplay
import matplotlib.pyplot as plt

 

# ์™€์ธ ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋“œ
wine = load_wine()
X, y = wine.data, wine.target

# ๋ฐ์ดํ„ฐ์…‹์„ ํ•™์Šต ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋ถ„ํ• 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# ๊ฒฐ์ • ํŠธ๋ฆฌ ๋ชจ๋ธ ํ•™์Šต
tree = DecisionTreeClassifier(random_state=42)
tree.fit(X_train, y_train)

# ์˜ˆ์ธก ๋ฐ ํ‰๊ฐ€
y_pred = tree.predict(X_test)
print(classification_report(y_test, y_pred))
              precision    recall  f1-score   support

           0       0.93      0.93      0.93        14
           1       0.93      1.00      0.97        14
           2       1.00      0.88      0.93         8

    accuracy                           0.94        36
   macro avg       0.95      0.93      0.94        36
weighted avg       0.95      0.94      0.94        36
# ํ˜ผ๋™ ํ–‰๋ ฌ ์‹œ๊ฐํ™”
ConfusionMatrixDisplay.from_estimator(tree, X_test, y_test)
plt.title("Decision Tree Confusion Matrix")
plt.show()

# ๊ฒฐ์ • ํŠธ๋ฆฌ ๊ตฌ์กฐ ์‹œ๊ฐํ™”
plt.figure(figsize=(20,10))
plot_tree(tree, filled=True, feature_names=wine.feature_names, class_names=wine.target_names)
plt.title("Decision Tree Structure")
plt.show()