
결정 트리는 데이터를 분할해가면서 예측하는 모델로, 각 노드에서 특정 특성을 기준으로 데이터를 분할하며 진행된다. 이러한 분할을 통해 노드 내의 불순도를 최소화하거나 정보 이득을 최대화하는 방향으로 학습된다.
# 결정 트리 알고리즘
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(train_scaled, train_target)
print(dt.score(train_scaled, train_target))
# 0.996921300750433
print(dt.score(test_scaled, test_target))
# 0.8584615384615385 #과대적합
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(train_scaled, train_target)
print(dt.score(train_scaled, train_target))
#출력 0.8454877814123533
print(dt.score(test_scaled, test_target))
#출력 0.8415384615384616

노드 내부 표현값
1) 테스트조건 (sugar)
2) 불순도(gini)
3) 총 샘플 수(smaples)
4) 클래스별 샘플 수(value)
노드의 불순도를 측정하는 지표로, 해당 노드의 클래스 분포에 따라 계산된다. 0에 가까울수록 불순도가 낮으며, 한 클래스로만 이루어진 경우 0이된다.
노드에 하나의 클래스만 존재한다면 지니 불순도가 0이 되어 가장 작다.
결정 트리 모델은 부모 노드와 자식 노드의 불순도 차이가 가능한 크도록 트리를 성장시킨다.
ex)
불확실성으로 나타내는 지표로, 클래스의 확률 분포에 따라 계산된다. 0에 가까울수록 불순도가 낮으며, 한클래스로만 이루어진 경우 0이된다.
ex)
부모와 자식 노드 사이의 불순도 차이를 나타내는 지표로, 불순도 차이가 크면 정보 이득이 크다고 한다. 이를 통해 어떤 특성이 가장 중요한지를 결정 할 수 있다.
ex)
과대적합을 방지하기위해 결정 트리의 깊이를 제한하는 과정이다. 트리의 최대 깊이(max_depth)나 분할되는 노드의 최소 샘플 수 등을 조절하여 모델을 일반화시킨다.
와인 데이터를 사용하여 로지스틱 회귀와 결정 트리 모델을 학습시켜보았다.
# 특성 표준화
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
# 로지스틱 회귀 모델 훈련
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_scaled, train_target)
print(lr.score(train_scaled, train_target))
#출력 0.7808350971714451
print(lr.score(test_scaled, test_target))
#출력 0.7776923076923077
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(train_input, train_target) #전처리 하지않은 데이터
print(dt.score(train_input, train_target))
#출력 0.8454877814123533
print(dt.score(test_input, test_target))
#출력 0.8415384615384616
plt.figure(figsize=(20,15))
plot_tree(dt, filled=True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()
