Home 개굴캐글개굴 결정트리
Post
Cancel

개굴캐글개굴 결정트리

Tab_study에서 공부한 AI 결정 트리에 대해 정리해보려한다.

결정 트리(Decision tree)란?

결정 트리는 분류, 회귀 등에서 사용하는 지도학습에 대한 학습 모델이다. 기본적으로 결정 트리는 예/아니오 질문을 이어 나가면서 학습한다.

위의 사진처럼 결정 트리는 질문에 의해 학습을 이어나간다. 코드를 통해 확인해보자.

결정트리 사용해보기

데이터 준비하기

1
2
3
import pandas as pd

wine = pd.read_csv('https://bit.ly/wine_csv_data') # wine 데이터
1
2
wine.info()
wine.describe()
1
2
3
4
5
6
7
8
9
10
11
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6497 entries, 0 to 6496
Data columns (total 4 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   alcohol  6497 non-null   float64
 1   sugar    6497 non-null   float64
 2   pH       6497 non-null   float64
 3   class    6497 non-null   float64
dtypes: float64(4)
memory usage: 203.2 KB
alcoholsugarpHclass
count6497.0000006497.0000006497.0000006497.000000
mean10.4918015.4432353.2185010.753886
std1.1927124.7578040.1607870.430779
min8.0000000.6000002.7200000.000000
25%9.5000001.8000003.1100001.000000
50%10.3000003.0000003.2100001.000000
75%11.3000008.1000003.3200001.000000
max14.90000065.8000004.0100001.000000

데이터를 확인해보면 결측치는 없는 것으로 확인 된다.

데이터 나누기

1
2
3
4
from sklearn.model_selection import train_test_split
data = wine.drop(columns=["class"])
target = wine["class"]
train_input, test_input, train_target, test_target = train_test_split(data, target, test_size=0.2, random_state=42)

데이터 전처리

1
2
3
4
5
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

결정트리 모델로 학습시키기

1
2
3
4
5
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(random_state=42)
dt.fit(train_scaled, train_target)
print(dt.score(train_scaled, train_target))
print(dt.score(test_scaled, test_target))
1
2
0.996921300750433
0.8592307692307692

결정 트리의 스코어를 확인해봤을때 약간의 과대적합이 보인다.

결정트리 모델 시각화 해보기

1
2
3
4
5
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(10,7))
plot_tree(dt)
plt.show()

결정 트리의 max_depth를 조절해 결정트리를 자세히 확인해보자

1
2
3
plt.figure(figsize=(10,7))
plot_tree(dt, max_depth=1, filled=True, feature_names=['alcohol','sugar','pH'])
plt.show()

plot_tree의 매개변수를 확인해보면 max_depth는 트리의 높이를 제한할 수 있고, filled를 통해 트리 노드 색칠 여부, feature_names를 통해 트리의 각 노드에서 어떤 피처가 사용되는지 확인할 수 있다.

max_depth 조절하고 스코어 확인해보기

1
2
3
4
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(train_scaled, train_target)
print(dt.score(train_scaled, train_target))
print(dt.score(test_scaled, test_target))
1
2
0.8454877814123533
0.8415384615384616

테스트 스코어의 점수는 낮아졌지만 과대적합 문제를 해결한 것을 볼 수 있다.

feature importances_(특성들의 중요도)

1
print(dt.feature_importances_)
1
[0.12345626 0.86862934 0.0079144 ]

dt.feature_importances를 통해 각 피쳐들의 중요도를 확인할 수 있는데 ‘alcohol’,’sugar’,’pH’ 중 2번째 특성이 sugar의 중요도가 가장 높은 것을 확인할 수 있다.

지니 불순도

$지니불순도=1-(음성클래스 비율^2 + 양성클래스비율^2)$

지니 불순도는 결정 트리 모델에서 데이터의 분할을 결정하고, 모델의 품질을 평가하는 데 사용되는 중요한 지표 중 하나이다. 낮은 지니 불순도를 가진 노드가 모델의 분류 작업에서 더 효과적인 분할을 나타내며, 이를 통해 모델이 더 나은 예측을 수행할 수 있다.

느낀점

결정트리에 대해 공부해보면서 각 질문들을 통해 모델이 학습을 하여 예측한다는 것에 신기함을 느꼈고 분류, 회귀를 모두 하는 모델이므로 결정트리는 중요한 모델이라는 것을 느꼈다.

This post is licensed under CC BY 4.0 by the author.