簡單決策樹程式設計

2021-09-29 14:42:27 字數 4431 閱讀 4364

設定好屬性字典

d_keys =

dict

(色澤=

['青綠'

,'烏黑'

,'淺白'

], 根蒂=

['蜷縮'

,'硬挺'

,'稍蜷'

], 敲聲=

['清脆'

,'沉悶'

,'濁響'

], 紋理=

['稍糊'

,'模糊'

,'清晰'],

臍部=['凹陷'

,'稍凹'

,'平坦'

], 觸感=

['軟粘'

,'硬滑'

])

讀取資料:

x =

f =open

(r'c:\users\dell\desktop\xiguaji3.0.txt'

,'r'

)lines = f.readlines(

)for line in lines:

line = line.replace(

'\n',''

)","))

f.close(

)x = np.array(x)

# print(x)

titles =

list

(x[0,1

:-3]

)# 表頭

y = x[:,

-1]# 標記

x = np.delete(x,

0, axis=0)

# 刪除第一行,表頭

x = np.delete(x,[0

,7,8

], axis=1)

# 刪除第一

計算資料中的熵

# 重新定義log函式,針對底為0的情況

deflog

(x):

if x !=0:

return math.log(x,2)

else

:return

0# 計算titles中屬性的熵

defculent

(x,title)

: indexnumber =

for m, n in

enumerate

(title)

: indexnumber[n]

=for k in title[n]

: indexnumber[n]

[k]=

for index, row in

enumerate

(x):

if row[m]

== k:

indexnumber[n]

[k] ent =

for key1 in indexnumber:

a =0.0for key2 in indexnumber[key1]

: yes =

0 no =0if

len(indexnumber[key1]

[key2])!=

0:for i in indexnumber[key1]

[key2]

:if x[i][-

1]=='好瓜'

: yes +=

1else

: no +=

1 p1 =

float

(yes /

(yes + no)

) p2 =

float

((yes + no)

/(x.shape[0]

))a += p2 *

(p1 * log(p1)+(

1- p1)

* log((1

- p1)))

# 防止對0取對數,重新定義log函式

else

: a +=

0 ent[key1]=-a

return indexnumber, ent

輸出的indexnumber包含title中每個屬性取值的樣本編號;ent包含每個屬性的熵大小

輸出結果如下:

,『根蒂』: ,

『敲聲』: ,

『紋理』: ,

#『臍部』: ,

#『觸感』: }

下面進行決策樹遞迴程式設計,按照書上的演算法:

def

calculateshannonent

(x, title, table)

: yes =

0# 儲存正例樣本個數

for row in x:

if row[-1

]=="好瓜"

: yes +=

1 p_yes =

float

(yes/x.shape[0]

)if p_yes ==1:

print

("leaf節點:好瓜"

)return

# 結束遞迴

if p_yes ==0:

print

("leaf節點:壞瓜"

)return

judge =

true

for i in

range

(x.shape[1]

):# 列數,等於屬性集

iflen

(set

(x[:

, i]))

!=1:# 如果某一屬性各樣本取值存在不等的情況,則說明在屬性集上不全相等

judge =

false

break

iflen

(title)==0

| judge:

#len(title) == 0意味著屬性集為空

print

("leaf節點:好瓜"

)if p_yes >=

0.5else

print

("leaf節點:壞瓜"

)return

indexnumber, ent = culent(x, title)

# indexnumber:每個屬性包含的樣本情況,ent:每個屬性的資訊增益

# print(indexnumber)

key_name =

min(ent, key=ent.get)

# 最優劃分屬性

print

("節點::分支"

.format

(key_name, indexnumber[key_name]))

for key in indexnumber[key_name]:if

len(indexnumber[key_name]

[key])==

0:print

("leaf節點:好瓜"

)if p_yes >=

0.5else

print

("leaf節點:壞瓜"

)return

else

:print

("分支:"

, key)

m =#儲存去除最優屬性後的新的屬性

for i in table:

if i != key_name:

n =#儲存去除最優屬性後的新的屬性字典

for i in title:

if i != key_name:

n[i]

= title[i]

a = np.array(x[indexnumber[key_name]

[key]])

a=np.delete(a, table.index(key_name)

, axis=1)

#劃分後的樣本

calculateshannonent(a, n, m)

最後輸出結果與書上一致

節點:紋理:分支

分支: 稍糊

節點:觸感:分支

分支: 軟粘

leaf節點:好瓜

分支: 硬滑

leaf節點:壞瓜

分支: 模糊

leaf節點:壞瓜

分支: 清晰

節點:根蒂:分支

分支: 蜷縮

leaf節點:好瓜

分支: 硬挺

leaf節點:壞瓜

分支: 稍蜷

節點:色澤:分支

分支: 青綠

leaf節點:好瓜

分支: 烏黑

節點:觸感:分支

分支: 軟粘

leaf節點:壞瓜

分支: 硬滑

leaf節點:好瓜

leaf節點:好瓜 淺白

決策樹和CART決策樹

首先簡單介紹下決策樹 說到決策樹肯定離不開資訊熵 什麼是資訊熵 不要被這名字唬住,其實很簡單 乙個不太可能的時間居然發生了,要比乙個非常可能的時間發生提供更多的資訊。訊息說 今天早上太陽公升起 資訊量是很少的,以至於沒有必要傳送。但另一條訊息說 今天早上日食 資訊量就很豐富。概率越大資訊量就越少,與...

決策樹(二)決策樹回歸

回歸 決策樹也可以用於執行回歸任務。我們首先用sk learn的decisiontreeregressor類構造一顆回歸決策樹,並在乙個帶雜訊的二次方資料集上進行訓練,指定max depth 2 import numpy as np quadratic training set noise np.r...

決策樹演算法簡單應用

coding utf 8 from sklearn import tree visualize code from sklearn.externals.six import stringio import pydotplus 決策樹演算法 初步的兩個特性的判斷,重量,表皮光滑度 對於水果,可以是 1...