Table of Contents
이 튜토리얼은 스크랩의 핵심 요소인 스크랩의 핵심 요소인 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩을 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩을 스크랩의 스크랩의 스크랩의 스크랩의 스크랩의 스크랩
결정 트리는 무엇입니까?
이 웹 사이트는 귀하가 웹 사이트를 탐색하는 동안 귀하의 경험을 향상시키기 위해 쿠키를 사용합니다. 이 쿠키들 중에서 필요에 따라 분류 된 쿠키는 웹 사이트의 기본적인 기능을 수행하는 데 필수적이므로 브라우저에 저장됩니다. 또한이 웹 사이트의 사용 방식을 분석하고 이해하는 데 도움이되는 제 3 자 쿠키를 사용합니다. 이 쿠키는 귀하의 동의하에 만 브라우저에 저장됩니다. 이러한 쿠키를 거부 할 수도 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다.
나무는 재발적으로 구축됩니다 : 루트에서 시작, 알고리즘은 가장 깨끗하게 데이터를 분리하는 최고의 기능과 분할 지점을 선택합니다. 이 과정은 정지 상태가 충족 될 때까지 각 하위 세트에 반복됩니다. 더 많은 배경을 위해, Wikipedia의 는 결정 트리 학습에 대한 일관성는 고체 개요를 제공합니다.
핵심 개념 당신은 이해해야
노드, 지점 및 휴가
루트 노드는 전체 교육 데이터셋을 포함합니다. 내부 노드는 기능 테스트를 거쳐 데이터를 2개 이상의 어린이 노드로 나눕니다. 분기는 테스트의 결과를 나타내는 연결입니다. 리프 노드(terminal 노드)는 최종 예측을 출력합니다. – 분류의 가장 일반적인 클래스 또는 회귀의 평균값입니다.
분할 Criteria
나무를 구축하려면 잠재적 인 분할의 품질을 측정하는 방법이 필요합니다. 가장 일반적인 기준은 다음과 같습니다.
- Gini impurity – 분류에 사용되어, 임의 선택된 요소가 임의로 표시된 경우, 임의로 레테르를 붙일 수 있는 방법을 측정하는 데 사용됩니다. 아래 Gini는 더 낫습니다.
- Entropy – 설정된 장애 또는 불확실한 금액을 측정합니다. 목표는 분할 후의 열 대열을 최소화하는 것입니다 (정보 이득).
- Variance reduce – 회귀 나무에 사용. 그것은 분할에 의해 달성 된 가변 (또는 측면의 정사 오류)의 감소를 계산합니다.
알고리즘은 모든 기능에 대해 모든 분할을 평가하고 불순물의 가장 큰 감소를 산출하는 것을 선택합니다 (또는 정보에서 이익을).
정보 이득 및 이익 비율
정보 이득은 부모 노드의 불순과 자녀 불순의 무게를 갖는 요약의 차이입니다. 단순하지만, 많은 값으로 특징을 선호하는 경향이 있습니다. 이득 비율 (C4.5에서 사용)은 이것을 정상화합니다. 이 튜토리얼에서는 Gini 불순을 사용하여 표준 정보 이득을 스틱 할 것이며, CART (Classification and Regression Trees)의 기본입니다.
단계별 결정 트리를 구축
1. 당신의 자료를 준비하십시오
당신은 기능 및 대상 라벨이있는 데이터 세트가 필요합니다. 단순성에 대해서는 숫자 기능이있는 바이너리 분류 데이터 세트를 사용합니다. 예를 들어 :
- 특징: 나이, 소득
- 대상: 승인 (1) 또는 승인되지 않음 (0)
데이터를 청소: 누락된 값을 처리하고 중복을 제거하고 숫자 유형을 보장합니다. 결정 나무는 혼합 된 데이터 유형을 처리 할 수 있지만 우리는 구현을 위해 숫자로 넣을 것입니다.
2. 분할 기능 정의
우리는 Gini 불순을 구현합니다. 품목 세트에 대한 Gini 인덱스는 다음과 같습니다.
] ]] ]] ]] ]] ] ] ] ] ] ] ] ] ]] ]] ] ]] ] ]
p i는 클래스 i.의 비례입니다. 이진 분할의 경우, 전체 Gini는 아이 노드의 무게가 큰 평균입니다.
3. 분할 평가
각 기능에 대해 고유한 값을 정렬합니다. 각 가능한 임계값( 연속 정렬 값 간의 중간점)을 테스트합니다. 각 후보자 임계값을 위해, 왼쪽 및 오른쪽 그룹으로 데이터를 분할하고, Gini를 계산하고, 최고의 분할을 추적합니다.
4. 나무 재조절을
데이터와 현재 심도의 하위 설정이 필요한 기능을 만듭니다. 이 체크는 (예를 들어, 최대 깊이 도달, 노드 당 최소 샘플 또는 정보 이득)를 확인합니다. 상태가 충족되면 대부분의 클래스와 잎 노드를 만듭니다. 그렇지 않으면, 최고의 분할을 찾아 내부 노드를 만들 수 있습니다. 따라서 왼쪽과 오른쪽 분할에서 함수를 호출합니다.
5. 예측
나무가 내장되면 예측은 곧 시작됩니다 : 루트에서 시작, 새로운 샘플의 기능 테스트를 평가하여 지점을 따르고, 잎의 값을 반환합니다.
Python의 전체 구현
아래는 Gini 불순물을 사용하여 분류를위한 결정 트리의 최소 구현입니다. 이 코드는 학습에 대해 의미 – 그것은 큰 데이터 세트에 최적화되지 않습니다.
import numpy as np
from collections import Counter
class DecisionTree:
def __init__(self, max_depth=None, min_samples_split=2):
self.max_depth = max_depth
self.min_samples_split = min_samples_split
self.tree = None
def fit(self, X, y):
dataset = np.column_stack((X, y))
self.tree = self._grow_tree(dataset)
def _grow_tree(self, dataset, depth=0):
X, y = dataset[:, :-1], dataset[:, -1]
n_samples, n_features = X.shape
n_labels = len(np.unique(y))
# Stopping conditions
if (n_labels == 1 or depth == self.max_depth or n_samples < self.min_samples_split):
leaf_value = Counter(y).most_common(1)[0][0]
return {'leaf': True, 'value': leaf_value}
best_feature, best_threshold = self._best_split(dataset, n_features)
if best_feature is None:
leaf_value = Counter(y).most_common(1)[0][0]
return {'leaf': True, 'value': leaf_value}
left_idx, right_idx = self._split(dataset[:, best_feature], best_threshold)
left_subtree = self._grow_tree(dataset[left_idx], depth+1)
right_subtree = self._grow_tree(dataset[right_idx], depth+1)
return {'leaf': False,
'feature': best_feature,
'threshold': best_threshold,
'left': left_subtree,
'right': right_subtree}
def _best_split(self, dataset, n_features):
best_gini = float('inf')
best_feature, best_threshold = None, None
for feature in range(n_features):
thresholds = np.unique(dataset[:, feature])
for i in range(len(thresholds)-1):
thresh = (thresholds[i] + thresholds[i+1]) / 2
left_idx, right_idx = self._split(dataset[:, feature], thresh)
if len(left_idx) == 0 or len(right_idx) == 0:
continue
gini = self._gini_gain(dataset, left_idx, right_idx)
if gini < best_gini:
best_gini = gini
best_feature = feature
best_threshold = thresh
return best_feature, best_threshold
def _split(self, values, threshold):
left_idx = np.where(values <= threshold)[0]
right_idx = np.where(values > threshold)[0]
return left_idx, right_idx
def _gini_gain(self, dataset, left_idx, right_idx):
total = len(left_idx) + len(right_idx)
gini_left = self._gini(dataset[left_idx, -1])
gini_right = self._gini(dataset[right_idx, -1])
return (len(left_idx)/total) * gini_left + (len(right_idx)/total) * gini_right
def _gini(self, labels):
_, counts = np.unique(labels, return_counts=True)
p = counts / np.sum(counts)
return 1 - np.sum(p**2)
def predict(self, X):
return np.array([self._predict_row(x, self.tree) for x in X])
def _predict_row(self, x, node):
if node['leaf']:
return node['value']
if x[node['feature']] <= node['threshold']:
return self._predict_row(x, node['left'])
else:
return self._predict_row(x, node['right'])
트리를 테스트
클래식 아이리스 데이터 세트 (이진 분류의 두 가지 기능)와 같은 간단한 데이터 세트를 사용합니다. scikit‐learn Iris dataset 잘 작동. scikit‐learn의 와 나무의 정확도를 비교하여 정확한 확인을 할 수 있습니다.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
data = load_iris()
X = data.data[:100] # take only first two classes (binary)
y = data.target[:100]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
tree = DecisionTree(max_depth=3)
tree.fit(X_train, y_train)
preds = tree.predict(X_test)
accuracy = np.mean(preds == y_test)
print(f'Accuracy: {accuracy:.2f}')
당신의 나무를 개선하는 고급 기술
과잉을 피하기 위해 Pruning
이 웹 사이트는 귀하가 웹 사이트를 탐색하는 동안 귀하의 경험을 향상시키기 위해 쿠키를 사용합니다. 이 쿠키들 중에서 필요에 따라 분류 된 쿠키는 웹 사이트의 기본적인 기능을 수행하는 데 필수적이므로 브라우저에 저장됩니다. 또한이 웹 사이트의 사용 방식을 분석하고 이해하는 데 도움이되는 제 3 자 쿠키를 사용합니다. 이 쿠키는 귀하의 동의하에 만 브라우저에 저장됩니다. 이러한 쿠키를 거부 할 수도 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다.
지속 및 의향 기능 취급
지속적인 기능을 위해, 우리는 문턱으로 분류된 값 사이 중간 점을 사용했습니다. categorical 특징 (예를들면, “색깔 = 빨강/녹색/파란색”)를 위해, 각 범주는 분리되는 분지 (다방 분할)가 될 수 있습니다 또는 당신은 이진 ‐ 암호를 ‐ 암호로 할 수 있습니다. 대부분의 현대 구현 (스카이키트 ‐잎과 같은)는 모든 하위 세트를 증발해서 이진 분할을 사용합니다.
Missing Values와 거래
Real-world 데이터는 종종 값을 누락했습니다. 간단한 접근법은 기능이있는 교육 샘플 중 가장 빈번한 지점에 누락 된 값을 할당하는 것입니다. C4.5는 확률적인 방법을 사용합니다. 이 초보자 튜토리얼이기 때문에 데이터가 완료됩니다.
도서관과 더 읽기
스크래치에서 구축하는 동안 교육, 생산 시스템 사용 라이브러리는 최적화 된 C 구현을 제공하는 scikit ‐ learn과 같은. 당신은 공식에서 더 배울 수 있습니다 scikit‐learn 결정 나무 문서. 더 깊은 이론을 위해, 책 “Statistical Learning의 요소” Hastie, Tibshirani, Friedman은 권위있는 자원입니다. 또 다른 우수한 참조는 원래 CART 책이다.
관련 기사
스크래치에서 결정적인 트리를 구축하는 것은 기계 학습의 가장 기본적인 알고리즘 중 하나를 결정합니다. 간단한 재발하는 분할 절차가 강력한 모델을 생산할 수있는 방법을 배웠습니다. 코드를 작성함으로써, 당신은 불순도 측정, 분할 선택 및 bias와 variance 사이의 무역 ‐ 오프의 깊은 이해를 얻게됩니다. 다음 단계로, 회귀 지원, 실행, 또는 categorical 기능을 추가하려고합니다. 당신이 개발하는 기술은 여기에서 당신이 단지 복잡한 숲과 같은 복잡한 숲과 같은 방법을 이동하기 위해 더 많은 방법을 제공 할 것입니다.