의사결정나무 모델 Decision Trees (DT)
분류 및 회귀에 사용되는 지도 학습 방법으로 데이터 특징에서 추론한 의사결정 규칙을 학습하여 결과를 예측한다.
데이터로 부터 if-then-else 의사결정 규칙으로 사인곡전 근사치를 학습한다.
트리가 깊을수록 의사결정 규칙이 더 복잡해지고 모델에 더 적합하다.
장점
- 트리구조로 시각화가 가능해서 이해하기 쉽다
- 수치형, 범주형 데이터를 모두 처리할 수 있다. 하지만 skit-learn에서는 범주형을 지원하지 않는다.
단점
- 복잡하고 깊은 트리를 만들어 과적합을 발생시킬 수 있다. 최소 샘플 수 설정, 트리 최대 깊이 설정과 같은 해결방안이 있다.
- 각 데이터에서 특징을 추론하기 때문에 위 그래프에서 볼 수 있듯이 예측 결과가 매끄럽지 않을 수 있다.
분류
다른 분류 알고리즘과 마찬가지로 두개의 배열이 훈련에 필요하다. x에는 (n_samples, n_features), y에는 (n_samples, ) 데이터가 들어간다.
from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier() # 모델 선언
clf = clf.fit(X, Y) # 데이터 훈련
훈련된 모델로 샘플 데이터의 클래스를 예측할 수 있다.
clf.predict([[2., 2.]]) # 데이터 결과 예측
Out[1]: array([1]) # 1로 예측
만약 확률이 가장 높으면서 동일한 클래스가 여러 개 있으면, 가장 낮은 인덱스를 가진 클래스를 예측한다.
clf.predict_proba([[2., 2.]])
# predict_proba의 출력은 각 클래스에 대한 확률
# 첫 번째 원소는 첫 번째 클래스의 예측 확률이고 두번째 원소는 두 번째 클래스의 예측 확률
# 확률이므로 항상 0~1 사이 값
Out[2]: array([[0., 1.]])
트리 구조 그리기
plot_tree 함수를 사용해서 데이터에서 추론한 특징들을 학습한 의사결정나무의 구조를 볼 수 있다.
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris() # iris 데이터 로드
X, y = iris.data, iris.target # 데이터 입력
clf = tree.DecisionTreeClassifier() # 모델 선언
clf = clf.fit(X, y) # 학습
tree.plot_tree(clf) # 트리 구조 보기
데이터의 컬럼에 해당하는 feature의 값에 대해 특정한 하나의 값을 정하면 이를 기준으로 모든 행을 두 개의 노드로 분류 할 수 있다. 예를 들어 '날개 유무'라는 feature에는 0(날개 있음)과 1(날개 없음)이라는 값이 존재하고 이를 기준으로 삼으면 모든 행은 0과 1이라는 두 개의 노드로 분류되는 것이다. 파생된 두 개의 노드에 대해 또 새로운 feature의 특정한 값을 정하고 분류를 진행한다. 이를 반복하게 되면 데이터들이 분류가 되고 이것이 의사결정나무 모델의 원리이다.
위 트리 구조에서 볼 수 있듯이 데이터들을 한쪽 방향으로 쏠리도록 분류되며 데이터들을 공평하게 비슷한 양으로 나뉘지 않는다.
회귀
회귀에서는 TreeRegressor 클래스를 사용한다. 그리고 y는 정수 값 대신 부동 소수점 값을 가져야 한다.
from sklearn import tree
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
clf = tree.DecisionTreeRegressor()
clf = clf.fit(X, y)
clf.predict([[1, 1]])
참고자료
1.10. Decision Trees
Decision Trees (DTs) are a non-parametric supervised learning method used for classification and regression. The goal is to create a model that predicts the value of a target variable by learning s...
scikit-learn.org
Lv1 모델링 python 파이썬 2/6 모델개념(의사결정나무)
#오늘의 파이썬 #1일1오파 #파이썬 # python
dacon.io
'study' 카테고리의 다른 글
[데이터] PA 01. 사이트 속도와 이탈률 (Site Speed, Bounce Rate) (0) | 2022.02.04 |
---|---|
[데이터] DA 01. 판다스 데이터 프레임에서 NaN값 확인하는 법 (0) | 2022.01.26 |
[머신러닝] 오파 00. 간단한 머신러닝 모델 사용하는 방법 (0) | 2021.12.31 |
댓글