Python實現決策樹演算法

2021-09-26 03:53:18 字數 4532 閱讀 3832

決策樹的一般流程

檢測資料集中的每個子項是否屬於同乙個分類

if so return 類標籤

else

尋找劃分資料集的最好特徵

劃分資料集

建立分支 節點

from math import log

import operator

#生成樣本資料集

defcreatedataset()

: dataset =[[

1,1,

'yes'],

[1,1

,'yes'],

[1,0

,'no'],

[0,1

,'no'],

[0,1

,'no']]

labels =

['no su***cing'

,'flipper'

]return dataset,labels

# 計算夏農熵 夏農 大神必須要膜拜啊,資訊界的根目錄人物啊

# no su***cing 指的是 不浮出水面能否生存 1 標識 是 0 指的是否

# flipper 指的是是否有腳

# yes no指的是否是魚類

defcalcshannonent

(dataset)

: numentries =

len(dataset)

# 用上面的createdataset dataset 這個值就是5

#定義標籤字典

labelcounts =

# 為所有可能的分類建立字典

for featvec in dataset:

currentlabel = featvec[-1

]#這個-1指的是去取最後乙個維度 對應資料dataset 這裡取的是yes和no

if currentlabel not

in labelcounts.keys():

# 如果當前分類標籤不在 標籤字典中

labelcounts[currentlabel]=0

# 其他情況 分類標籤分類加1

labelcounts[currentlabel]+=1

#定義夏農熵 以2為底數求對數

shannonent =

0.0for key in labelcounts:

#計算 yes 或者no 出現的概率

pro =

float

(labelcounts[key]

)/numentries

# 計算夏農熵

shannonent -= pro*log(pro,2)

return shannonent

#dataset是待劃分的資料集, 劃分資料集的特徵 axis 特徵的返回值value

#最後是建立了乙個新的列表物件

defsplitdataset

(dataset, axis , value)

:# 建立新list物件

retdataset =

for featvec in dataset:

if featvec[axis]

== value:

reducedfeatvec = featvec[

:axis]

reducedfeatvec.extend(featvec[axis+1:

])return retdataset

# 選擇最好的特徵值進行資料集劃分

defchoosebestfeaturetosplit

(dataset)

:# len(dataset[0])是計算這一行有多少列,即有多少個特徵值

numfeatures =

len(dataset[0]

)-1# -1 是最後乙個特徵值就不要記錄在內了,算baseentrop的時候已經算了最後乙個特徵值yes no

baseentropy = calcshannonent(dataset)

bestinfogain =

0.0 bestfeature =-1

for i in

range

(numfeatures)

:#建立唯一的分類標籤列表 也就是說提取dataset每一行第i個值 就提取dat

featlist =

[example[i]

for example in dataset]

# 取出有幾種特徵值

uniquevals =

set(featlist)

newentropy =

0.0for value in uniquevals:

#建立特徵值的子資料集

subdataset = splitdataset(dataset,i, value)

#計算該特徵值資料對總數在資料對總數出現的概率

pro =

len(subdataset)

/float

(len

(dataset)

)#計算分割出來的子集夏農熵

newentropy += pro*calcshannonent(subdataset)

#計算資訊增益 得到最好的特徵值 這個理論是這樣的g(d,a) = h(d)-h(d/a)

infogain = baseentropy-newentropy

#取出最大的資訊增益,此時特徵值最大

if(infogain >bestinfogain)

: bestinfogain = infogain

bestfeature = i

return bestfeature

'''#構建決策樹是根據特徵值的消耗來計算的,如果後面的特徵值已經全部用完了

但是還沒有分出結果,這個時候就需要使用多數表決方式計算節點分類

最後返回最大的分類

'''def

majoritycnt

(classlist)

:# 分類的字典

classcount =

for vote in

range

(classlist)

:#如果不在 分類字典中

if vote not

in classcount.keys(

): classcount[vote]=0

classcount[vote]+=1

# 根據出現的次數大到小排序

sortedclasscount =

sorted

(classcount.items(

),key=operator.itemgetter(1)

,reverse=

true

)return sortedclasscount[0]

[0]#建立決策樹

defcreatetree

(dataset, labels)

:# 獲取資料樣本每組最後一組的特徵值 這裡是yes,no

classlist =

[example[-1

]for example in dataset]

# 如果說這個classlist 全部都是 yes 或者全部是no 那肯定子返回yes 或者no

if(classlist.count(classlist[0]

)==len(classlist)):

return classlist[0]

#如果遍歷完所有的特徵返回出現次數最多的

#是用消耗特徵值的方式進行構造決策樹的,每次會消掉乙個特徵值

iflen

(dataset[0]

)==1:

return majoritycnt(classlist)

#選擇最好的特徵值

bestfeat = choosebestfeaturetosplit(dataset)

bestfeatlabel = labels[bestfeat]

mytree =

}# 刪除labels中的一特徵值

del(labels[bestfeat]

)#找到特徵值那一列

featvalues =

[example[bestfeat]

for example in dataset]

uniquevals =

set(featvalues)

for value in uniquevals:

# labels列表的賦值

sublabels = labels[:]

mytree[bestfeatlabel]

[value]

=createtree(splitdataset(dataset,bestfeat,value)

,sublabels)

return mytree

dataset,lables = createdataset(

)shannonent= calcshannonent(dataset)

my = createtree(dataset,lables)

print

(my)

決策樹演算法 python實現

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

決策樹演算法 Python實現

import matplotlib.pyplot as plt import pandas as pd from sklearn.datasets import fetch california housing housing fetch california housing print housi...

Python 決策樹演算法的實現

完整的程式如下 from sklearn.feature extraction import dictvectorizer import csv from sklearn import tree from sklearn import preprocessing from sklearn.exter...