將sklearn的決策樹規則輸出成sql主要使用
sklearn.tree._tree
讀取決策樹的資訊
import numpy as np
from sklearn.tree import decisiontreeclassifier
from sklearn.tree import _tree
deftree_to_code
(tree, feature_names)
: tree_ = tree.tree_ # 得到tree
feature_name =
[## 找出葉節點結果
feature_names[i]
if i != _tree.tree_undefined else
"undefined!"
## 如果是葉 (沒有判斷條件 tree_undefined)
for i in tree_.feature # array([ 3, -2, 3, 2, -2, -2, 2, -2, -2], dtype=int64)
]# 遞迴列印
case_list =
defto_sql
(node, depth)
:"""
遞迴列印
tree_ 外函式引數
case_list 外函式引數
feature_name 外函式引數
"""tp = np.array([0
,1,2
])indent =
" "
* depth
if tree_.feature[node]
!= _tree.tree_undefined:
## 如果是節點 (有判斷條件)
name = feature_name[node]
threshold = tree_.threshold[node]
## 節點閾值
## 左子節點
message_left =
"{}case when {} <= {} then"
.format
(indent, name, threshold)
to_sql(tree_.children_left[node]
, depth +1)
## 右子節點
message_right =
"{}else -- if {} > {}"
.format
(indent, name, threshold)
to_sql(tree_.children_right[node]
, depth +1)
else
:## 如果是葉 (沒有判斷條件 tree_undefined)
# 直接讀取葉的種類
tp_i = tp[tree_.value[node][0
]== tree_.value[node][0
].max()]
[0] message_left =
"{}'class_{}'"
.format
(indent, tp_i)
to_sql(0,
1)return case_list
deffind_end
(sql_list)
:"""
找到需要補充end 的 行
"""need_end =
# 記錄需要加end的index
n =len(sql_list)
for idx in
range
(n):
if(idx +
1< n):if
('else'
in sql_list[idx]
)and
('class_'
in sql_list[idx +1]
):1)
return need_end
defadd_end
(sql_list, need_end)
:"""
填上 end
"""n =
len(sql_list)
for i in
range
(n):
if i in need_end:
sql_list[i]
= sql_list[i]
+' end'
## 填補末尾的end
n_c =
0for i in sql_list:
if'case'
in i:
n_c +=
1' end '
*(n_c -
len(need_end)))
return sql_list
from sklearn.datasets import load_iris
iris = load_iris(
)dtree = decisiontreeclassifier(max_depth=3)
dtree.fit(iris.data, iris.target)
dtree.feature_importances_
if __name__ ==
"__main__"
:
feature_names =
['sepal_length'
,'sepal_width'
,'petal_length'
,'petal_width'
] case_list = tree_to_code(dtree, feature_names)
need_end = find_end(case_list)
case_list = add_end(case_list, need_end)
from six.moves import
reduce
sql_final =
reduce
(lambda a, b:
str(a)
+"\n"
+str
(b), case_list)
print
(sql_final)
case
when petal_width <=
0.800000011920929
then
'class_0'
else
-- if petal_width > 0.800000011920929
case
when petal_width <=
1.75
then
case
when petal_length <=
4.950000047683716
then
'class_1'
else
-- if petal_length > 4.950000047683716
'class_2'
endelse
-- if petal_width > 1.75
case
when petal_length <=
4.8500001430511475
then
'class_2'
else
-- if petal_length > 4.8500001430511475
'class_2'
endend
end
資料庫結果
機器學習 決策樹
一 基本概念 決策樹 decision tree 是一種基本的分類與回歸方法。決策樹模型呈樹形結構,在分類問題中,表示屬於特徵對例項進行分類的過程,它可以認為是if then規則的集合,也可以認為是電議在特徵空間與類空空上的條件概率分布,其主要優點是模型具有可讀性,分類速度快。決策樹的學習通常包括3...
機器學習 決策樹
我覺得決策樹是機器學習所有演算法中最可愛的了 沒有那麼多複雜的數學公式哈哈 下圖是一棵決策樹,用來判斷西瓜是好瓜還是壞瓜 決策過程中提出的每個判定問題都是都對某個屬性的測試,每個測試結果要麼推導出最終結論,要麼匯出進一步判斷的問題,在上次決策結果限定的範圍內做進一步判斷。從上圖可以看出,葉節點對應決...
機器學習 決策樹
一 演算法簡介 決策樹一般都是自上而下來生成的,每個決策後事件 即自然狀態 都可能引出兩個或多個事件,導致結果的不同,把這種結構分支畫成形狀很像一棵樹的枝幹,故稱為決策樹。決策樹能夠讀取資料集合,並且決策樹很多任務都是為了資料中所蘊含的知識資訊,因此決策樹可以使用不熟悉的資料集合,並從中提取一系列規...