Table of Contents
Những cây này là một trong những máy học tập trực quan và phổ biến nhất để phân loại và hồi quy, và làm việc bằng cách chia dữ liệu thành các chi nhánh dựa trên các giá trị đặc trưng, bắt chước cách con người quyết định.
Cây quyết định là gì?
Một cây quyết định là một cấu trúc giống như kim loại, mỗi nút có một dấu chấm nằm trên một tính năng (v. d.: “Có phải độ tuổi > 30?), mỗi nhánh tượng trưng cho kết quả của bài kiểm tra đó, và mỗi nút có nhãn xếp hạng hoặc giá trị liên tục. Mục tiêu là tạo một mô hình dự đoán một biến số bằng cách học các quy tắc đơn giản, dựa trên các tính năng của dữ liệu.
Cây được xây lại theo kiểu đệ quy: bắt đầu từ gốc, thuật toán chọn điểm tốt nhất và chia ra để phân chia dữ liệu một cách sạch nhất. Quá trình này được lặp lại trên mỗi tập hợp nhỏ cho đến khi hoàn tất điều kiện dừng. Để tìm bối cảnh hơn, Wikipedia [FLT: 0] dựa trên việc tìm hiểu [FLT: 1] để có thể nhìn tổng quát hơn.
Quan điểm của người khác là gì?
Mũi, cành cây và lá
Nút gốc chứa toàn bộ bộ bộ dữ liệu được đào tạo. Nút nội bộ thử một tính năng và chia dữ liệu thành hai hay nhiều nút con. Các nhánh là những kết nối đại diện kết quả của một bài kiểm tra. Nút mũi tên (thôi kết thúc) xuất ra tiên đoán cuối cùng — lớp phổ biến nhất trong phân loại hoặc giá trị bình thường nhất trong hồi quy.
Chia rẽ criteria
Để xây dựng một cái cây, bạn cần một cách để đo chất lượng của một cuộc chia cắt.
- Sự ô uế củaGini – được dùng để phân loại để đo mức độ thường xuyên của một phần tử được chọn ngẫu nhiên sẽ được gán nhãn sai nếu nó được đặt nhãn ngẫu nhiên theo sự phân phối của lớp học trong tập dưới. Lower Gini tốt hơn.
- Thực tế – đo mức độ rối loạn hoặc không chắc chắn trong một tập. Mục tiêu là thu nhỏ entropy sau khi chia (lợi nhuận thông tin).
- Giảm ) – dùng cho cây hồi quy. Nó tính toán sự giảm dần trong biến thể (hay có nghĩa là bình phương lỗi) đạt được bằng cách tách rời.
Thuật toán đánh giá mỗi phần có thể được chia ra trên mỗi tính năng và chọn một phần cung cấp giảm lớn nhất trong ô uế (hoặc thu nhập thông tin).
Tỷ lệ thu thập thông tin và thu thập
Thu thập thông tin là sự khác biệt giữa sự ô uế của nút cha mẹ và tổng số lượng lớn của trẻ em bị ô nhiễm. Trong khi đơn giản, nó có xu hướng ưu tiên tính năng với nhiều giá trị. Tỉ lệ tăng (dùng trong C4. 5) bình thường hoá điều này. Đối với điều này, chúng tôi sẽ gắn với sự tăng thông tin chuẩn bằng chất tẩy rửa Gini, đó là mặc định trong CART (Sự phân phối và Phục hồi cây).
Xây dựng từng bước một một một một cây quyết định
1. chuẩn bị dữ liệu
Bạn cần một bộ dữ liệu với tính năng và nhãn mục đích. Để đơn giản, hãy dùng bộ phân loại nhị phân với tính năng số. Ví dụ:
- Các nhà khoa học: age, Thu nhập
- Mục tiêu: ) Chấp nhận (1) hoặc không chấp nhận (0)
Làm sạch dữ liệu: xử lý các giá trị bị thiếu, loại bỏ bản sao và đảm bảo các loại số.
2. Định nghĩa hàm ritterion tách ra
Chúng tôi sẽ thực hiện ô uế Gini.
Nếu bạn có thể chia đôi các phần tử, tổng thể Gini là trung bình của các nút con.
3 Làm tan rã sự phân chia
Đối với mỗi tính năng, sắp xếp các giá trị độc đáo. Kiểm tra mỗi ngưỡng có thể (chỉ giữa các giá trị sắp xếp liên tiếp). Đối với mỗi ngưỡng ứng cử viên, chia dữ liệu thành nhóm bên trái và bên phải, tính toán các Gini, và theo dõi các phân chia tốt nhất.
4 Xây dựng lại cây
Tạo một hàm cần tập hợp dữ liệu con và độ sâu hiện thời. Nó kiểm tra điều kiện để dừng (v. d., độ sâu tối đa đạt, mẫu tối thiểu trên nút, hoặc không có thu thập thông tin). Nếu một điều kiện được thỏa mãn, hãy tạo một nút chủ chốt với hạng đại đa. Nếu không, tìm điểm chia tốt nhất và tạo một nút nội bộ, rồi gọi lại hàm bên trái và phải.
5. Tiên đoán
Một khi cây được xây dựng, lời tiên đoán được trình bày một cách rõ ràng: bắt đầu từ rễ cây, theo dõi các nhánh bằng cách đánh giá tính chất thử nghiệm trên mẫu mới, và trả lại giá trị của lá bạn đáp trên.
Tăng hoàn toàn trong Python
Dưới đây là một cây quyết định hoàn chỉnh, tối thiểu để phân loại bằng cách dùng chất tẩy Ghini. Mã này có nghĩa là để học tập — nó không tối ưu hóa cho bộ dữ liệu lớn.
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'])
Thử cây
Dùng một bộ dữ liệu đơn giản như bộ dữ liệu về mắt (hai đặc điểm cho phân loại nhị phân).
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}')
Kỹ thuật cao cấp để cải thiện cây
Tránh thái độ quá
Một cây trưởng thành có thể nhớ lại tiếng ồn trong dữ liệu đào tạo. Việc rụng bớt các nhánh có ít năng lượng dự đoán. Phương pháp thông thường là trước khi cắt bỏ (bị ngừng phát triển sớm bằng ) hoặc và sau đó bỏ đi (xắp đặt toàn bộ nhánh bằng cách cắt tỉa hợp lệ hoặc chi phí tính toán). Việc thực hiện của chúng ta đã hỗ trợ việc cắt tỉa trước khi chạy.
Các đặc tính liên tục và mang tính phân loại
Để liên tục tính năng, chúng tôi dùng điểm giữa các giá trị được sắp xếp như là ngưỡng. Để phân loại các tính năng (v. d., “ màu= đỏ/ xanh lá cây/ xanh da trời), mỗi phân loại có thể trở thành một nhánh riêng biệt (chia tách) hoặc bạn có thể mã hóa chúng. Phần lớn các tính năng thực hiện (như phân chia gikitt chê) sử dụng các phân dạng nhị phân để phân chia cho các tính năng bằng cách đánh giá tất cả các nhóm nhỏ.
Đối phó với những giá trị thiếu sót
Một cách đơn giản là gán giá trị bị mất vào những chi nhánh thường xuyên nhất trong các mẫu thử có tính năng. C4.5 sử dụng phương pháp xác suất. vì đây là phương pháp hướng dẫn mới, chúng tôi giả sử dữ liệu đã hoàn thành.
So sánh với thư viện và đọc thêm
Trong khi xây dựng từ đầu là nền giáo dục, hệ thống sản xuất sử dụng thư viện như là những thư viện đa năng học được, cung cấp những tiến trình thực hiện tối ưu.
Kết luận
Xây dựng một cây quyết định từ đầu demysifecties một trong những thuật toán cơ bản nhất trong máy học tập. bạn đã học được cách đơn giản một quy trình tách đệ quy có thể tạo ra một mô hình mạnh mẽ. bằng cách tự mình viết các mã, bạn có được một hiểu biết sâu sắc hơn về các biện pháp ô uế, phân chia, và trao đổi kết hợp giữa thành kiến và biến đổi. Như một bước tiếp theo, cố gắng thêm hỗ trợ hồi quy, cắt giảm tính năng bạn phát triển ở đây cũng như bạn di chuyển đến các phương pháp phức tạp hơn như rừng ngẫu nhiên và tăng vọt.