Tôi đã tạo chức năng của riêng mình để trích xuất các quy tắc từ các cây quyết định được tạo bởi sklearn:
import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
# dummy data:
df = pd.DataFrame({'col1':[0,1,2,3],'col2':[3,4,5,6],'dv':[0,1,0,1]})
# create decision tree
dt = DecisionTreeClassifier(max_depth=5, min_samples_leaf=1)
dt.fit(df.ix[:,:2], df.dv)
Hàm này trước tiên bắt đầu bằng các nút (được xác định bởi -1 trong mảng con) và sau đó tìm đệ quy cha mẹ. Tôi gọi đây là 'dòng dõi' của nút. Trên đường đi, tôi lấy các giá trị tôi cần để tạo logic logic if / then / other:
def get_lineage(tree, feature_names):
left = tree.tree_.children_left
right = tree.tree_.children_right
threshold = tree.tree_.threshold
features = [feature_names[i] for i in tree.tree_.feature]
# get ids of child nodes
idx = np.argwhere(left == -1)[:,0]
def recurse(left, right, child, lineage=None):
if lineage is None:
lineage = [child]
if child in left:
parent = np.where(left == child)[0].item()
split = 'l'
else:
parent = np.where(right == child)[0].item()
split = 'r'
lineage.append((parent, split, threshold[parent], features[parent]))
if parent == 0:
lineage.reverse()
return lineage
else:
return recurse(left, right, parent, lineage)
for child in idx:
for node in recurse(left, right, child):
print node
Các bộ dữ liệu bên dưới chứa mọi thứ tôi cần để tạo ra các câu lệnh if / then / other. Tôi không thích sử dụng do
các khối trong SAS, đó là lý do tại sao tôi tạo logic mô tả toàn bộ đường dẫn của một nút. Số nguyên đơn sau các bộ dữ liệu là ID của nút đầu cuối trong một đường dẫn. Tất cả các bộ trước đó kết hợp để tạo nút đó.
In [1]: get_lineage(dt, df.columns)
(0, 'l', 0.5, 'col1')
1
(0, 'r', 0.5, 'col1')
(2, 'l', 4.5, 'col2')
3
(0, 'r', 0.5, 'col1')
(2, 'r', 4.5, 'col2')
(4, 'l', 2.5, 'col1')
5
(0, 'r', 0.5, 'col1')
(2, 'r', 4.5, 'col2')
(4, 'r', 2.5, 'col1')
6