데이터로그😎
2. Decision Tree 본문
- 회귀, 분류에 모두 사용 가능
- ‘정보 균일도’ 라는 룰을 기반으로 하고 있어 알고리즘이 직관적임.
정보균일도 측정 지표 | 정의 |
정보이득지수 |
|
지니계수 |
|
- Decision Tree Classification의 파라미터
- min_samples_split
- 노드를 분할하기 위해 필요한 최소한의 샘플 수
- min_samples_split=2로 설정하면 노드를 분할하려면 적어도 2개의 샘플이 있어야 함
- 값을 늘리면 트리의 깊이가 줄어들고 모델이 더 간단해지며, 과적합을 줄일 수 있음
- 작은 값은 더 복잡한 트리를 생성할 수 있
- max_depth
- 결정 트리의 최대 깊이를 제한
- 모델의 복잡성을 제어하고 과적합을 방지할 수 있음
- min_samples_leaf
- 리프 노드(마지막 노드)에 필요한 최소한의 샘플 수
- 리프 노드의 샘플 수가 이 값보다 작으면 더 이상 분할하지 않음
- 결정 트리의 리프 노드의 크기를 제한하고 과적합을 방지할 수 있
- max_features
- 각 노드에서 분할을 고려할 때 고려할 최대 특성(변수)의 수
- 이 값을 조절하여 모델이 무작위성을 가지도록 할 수 있음
- 모델의 다양성을 높일 수 있고 과적합을 줄일 수 있음
- min_samples_split
데이터 로드
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris_data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris_data.data,
iris_data.target,
test_size=0.2,
random_state=11
)
결정트리 학습(fit)
from sklearn.tree import DecisionTreeClassifier
dt_clf = DecisionTreeClassifier()
dt_clf.fit(X_train,y_train)
결정트리 시각화 (Graphviz)
from sklearn.tree import export_graphviz
export_graphviz(
dt_clf,
out_file = 'tree11.dot',
class_names= iris_data.target_names,
feature_names = iris_data.feature_names,
impurity= True,
filled= True)
import graphviz
with open('tree11.dot') as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
예측(predict) & 모델 평가 (accuracy 확인)
from sklearn.metrics import accuracy_score
train_pred = dt_clf.predict(X_train)
test_pred = dt_clf.predict(X_test)
print('훈련 세트에 대한 점수: {:.3f}'.format(accuracy_score(y_train, train_pred)))
print('테스트 세트에 대한 점수: {:.3f}'.format(accuracy_score(y_test, test_pred)))
>>결과:
훈련 세트에 대한 점수: 1.000
#----> 과적합!!!!! max_depth통해 과적합 해결
# fit을 X_train, y_train으로 했는데,,, 당연한거 아닐까..?
테스트 세트에 대한 점수: 0.933
max_depth 이용한 질문의 깊이 제어 (과적합 해결)
dt_clf_depth_2 = DecisionTreeClassifier(max_depth=2).fit(X_train,y_train)
train_pred = dt_clf_depth_2.predict(X_train) # 알고 있는 데이터에 대한 예측
test_pred = dt_clf_depth_2.predict(X_test) # 새로 보는 데이터에 대한 예측
print("훈련 세트에 대한 점수 : {:.3f}".format(accuracy_score(y_train, train_pred)))
print("테스트 세트에 대한 점수 : {:.3f}".format(accuracy_score(y_test, test_pred)))
>> 결과:
훈련 세트에 대한 점수 : 0.967
테스트 세트에 대한 점수 : 0.867
각 피처 중요도 확인
dt_clf.feature_importances_
>>>array([0.02500521, 0. , 0.55490281, 0.42009198])
## sepal_length sepal width petal length petal width
피처 중요도 시각화
import seaborn as sns
import numpy as np
%matplotlib inline
print("feature importances:\n{0}".format(np.round(dt_clf.feature_importances_,3)))
for name, value, in zip(iris_data.feature_names, dt_clf.feature_importances_):
print(name, value)
sns.barplot(x=dt_clf.feature_importances_, y=iris_data.feature_names)
반응형
'머신러닝 > 지도 학습' 카테고리의 다른 글
4-1. Voting (0) | 2023.09.04 |
---|---|
4. Ensemble (앙상블) (0) | 2023.09.04 |
3. Logistic Regression (0) | 2023.09.04 |
0. 분류(Classification) (0) | 2023.09.04 |
1. 분류의 평가지표 (0) | 2023.09.04 |