機器學習技巧 決策樹規則輸出成SQL

2021-09-25 11:07:08 字數 3880 閱讀 9981

將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...

機器學習 決策樹

我覺得決策樹是機器學習所有演算法中最可愛的了 沒有那麼多複雜的數學公式哈哈 下圖是一棵決策樹,用來判斷西瓜是好瓜還是壞瓜 決策過程中提出的每個判定問題都是都對某個屬性的測試,每個測試結果要麼推導出最終結論,要麼匯出進一步判斷的問題,在上次決策結果限定的範圍內做進一步判斷。從上圖可以看出,葉節點對應決...

機器學習 決策樹

一 演算法簡介 決策樹一般都是自上而下來生成的,每個決策後事件 即自然狀態 都可能引出兩個或多個事件,導致結果的不同,把這種結構分支畫成形狀很像一棵樹的枝幹,故稱為決策樹。決策樹能夠讀取資料集合,並且決策樹很多任務都是為了資料中所蘊含的知識資訊,因此決策樹可以使用不熟悉的資料集合,並從中提取一系列規...