python實現決策樹

2021-08-24 23:31:10 字數 4793 閱讀 4470

決策樹是乙個**模型;他代表的是物件屬性與物件值之間的一種對映關係。樹中每個節點表示某個物件,而每個分叉路徑則代表某個可能的屬性值,而每個葉節點則對應從根節點到該葉節點所經歷的路徑所表示的物件的值。
詳細關於決策樹的討論,請自行google。

一、找到最優分割位置

1、針對樣本資料,需要在其不同的維度(d)上根據特定資料(v)進行分割

#x:樣本資料

#y:樣本屬性

#d:維度

#v:分割標準

defcut

(x , y , d , v):

ind_left = (x[:,d] <= v)

ind_right = (x[:,d] > v)

return (x[ind_left] , x[ind_right] , y[ind_left] , y[ind_right])

2、將樣本資料排序

sorted_index=np.argsort(x[:,d])
3、找出中間點

v =(x[sorted_index[i] , d ] + x[sorted_index[i+1] , d ]) / 2
4、按照中間點進行分割

x_left , x_right , y_left , y_right =cut(x , y , d , v)
5、計算基尼係數

gini_cur =gini(y_left , y_right )
6、找到基尼係數最小的分割位置(維度,分割值)

if gini_cur < gini_best :

best_g = gini_cur

best_d = d

best_v = v

二、建立決策樹

1、找到原始資料的最優分割點(對於第一次,找的結果是根節點的分割情況)

d , v , g  =try_split(x , y)
2、將找的結果儲存在結點node中

node =node(d,v,g)
3、根據最優點將資料分割

x_left , x_right , y_left , y_right =cut(x , y , d , v)
4、遞迴查詢下乙個結點

node.child_left  = create_tree(x , y)

node.child_right = create_tree(x , y)

最後對上述過程彙總:1、實現計算基尼係數

#y:樣本資料的標籤

defgini

(y):

counter = counter(y)

result = 0

for v in counter.values():

result += (v / len(y))**2

return (1 - result )

2、根據維度(d)和值(v)對資料進行分割

#x:樣本資料

#y:樣本資料的標籤

#d:維度

#v:分割資料

defcut

(x , y , d , v):

ind_left = (x[:,d] <= v)

ind_right = (x[:,d] > v)

return (x[ind_left] , x[ind_right] , y[ind_left] , y[ind_right])

3、查詢最優分割點

import numpy as np

#x:樣本資料

#y:樣本資料的標籤

deftry_split

(x , y):

best_g = 1

best_d = -1

best_v = -1

for d in range(x.shape[1]):

#將資料排序

sorted_index = np.argsort(x[:,d])

for i in range(len(x) - 1):

if (x[sorted_index[i],d] == x[sorted_index[i + 1],d]):

continue

#計算兩點之間的平均值

v = (x[sorted_index[i],d] + x[sorted_index[i + 1],d]) / 2

#根據d v將x y分割

x_left , x_right , y_left , y_right = cut(x , y , d , v)

#計算基尼係數

gini_cur = gini(y_left) + gini(y_right)

#計算最優分割點

if gini_cur < best_g:

best_g = gini_cur

best_v = v

best_d = d

return (best_d,best_v,best_g)

4、結點,儲存分割資訊

class

node

():def

__init__

(self,d=none,v=none,g=none,l=none):

self.dim = d

self.value = v

self.gini = g

self.label = l

self.child_left = none

self.child_rignt = none

def__repr__

(self):

return

'node(d={},v={},g={})'.format(self.dim,self.value,self.gini)

5、建立決策樹

def

create_tree

(x , y):

#查詢最優分割點

d,v,g = try_split(x , y)

#不用再分

if (d==-1) or (g==0):

return

none

#例項化結點

node = node(d,v,g)

#按照最優點把資料分割

x_left , x_right , y_left , y_right = cut(x , y , d , v)

#遞迴子結點(左)

node.child_left = create_tree(x_left , y_left)

#左邊分割完了,儲存label

if node.child_left is

none:

#label

label = counter(y_left).most_common(1)[0][0]

node.label = node(l = label)

#遞迴子結點(右)

node.child_right = create_tree(x_left , y_left)

#右邊分割完了,儲存label

if node.child_right is

none:

#label

label = counter(y_right).most_common(1)[0][0]

node.label = node(l = label)

return node

6、繪製決策樹

決策樹演算法 python實現

定義 資訊增益 再劃分資料之前之後資訊發生的變化。香濃熵 簡稱熵 集合資訊的度量方式,熵是資訊的期望值。其實決策樹主要就是選擇最優劃分屬性對給定集合進行劃分,隨著花粉的不斷進行,我們希望最終決策樹所包含的樣本盡量屬於同一類別,即結點的 純度 越來越高。資訊增益的計算 1.資訊熵的計算ent d 越小...

Python實現決策樹演算法

決策樹的一般流程 檢測資料集中的每個子項是否屬於同乙個分類 if so return 類標籤 else 尋找劃分資料集的最好特徵 劃分資料集 建立分支 節點 from math import log import operator 生成樣本資料集 defcreatedataset dataset 1...

CART決策樹python實現

from sklearn import tree import pydotplus defcart skl test df pd.read csv dataset liquefaction data mle.csv x df csr vs y df target clf tree.decisiont...