Saya membuat fungsi saya sendiri untuk mengekstrak aturan dari pohon keputusan yang dibuat oleh 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)
Fungsi ini dimulai dengan node (diidentifikasi oleh -1 pada array anak) dan kemudian secara rekursif menemukan orang tua. Saya menyebutnya 'garis silsilah' simpul. Sepanjang jalan, saya ambil nilai-nilai yang perlu saya buat jika / kemudian / logika SAS:
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
Kumpulan tupel di bawah ini berisi semua yang saya butuhkan untuk membuat SAS if / then / else statement. Saya tidak suka menggunakan do
blok di SAS yang mengapa saya membuat logika yang menggambarkan seluruh jalur node. Integer tunggal setelah tupel adalah ID dari simpul terminal di jalur. Semua tupel sebelumnya bergabung untuk membuat simpul itu.
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