連續值的CART(分類回歸樹)原理和實現

2022-07-08 20:54:15 字數 2907 閱讀 3422

思考連續值和離散值的不同之處:

二分子樹的時候不同:離散值需要求出最優的兩個組合,連續值需要找到乙個合適的分割點把特徵切分為前後兩塊

這裡不考慮特徵的減少問題

切分資料的不同:根據大於和小於等於切分資料集

def

splitdataset(dataset, axis, value,threshold):

retdataset =

if threshold == 'lt'

:

for featvec in

dataset:

if featvec[axis] <= value:

else

:

for featvec in

dataset:

if featvec[axis] > value:

return retdataset

選擇最好特徵的最好特徵值

def

choosebestfeaturetosplit(dataset):

numfeatures = len(dataset[0]) - 1bestginigain = 1.0; bestfeature = -1;bsetvalue=""

for i in range(numfeatures): #

遍歷特徵

featlist = [example[i] for example in dataset]#

得到特徵列

uniquevals = list(set(featlist)) #

從特徵列獲取該特徵的特徵值的set集合

uniquevals.sort()

for value in uniquevals:#

遍歷所有的特徵值

ginigain = 0.0

#左增益 left_subdataset = splitdataset(dataset, i, value,'lt'

) left_prob = len(left_subdataset)/float(len(dataset))

ginigain += left_prob *calgini(left_subdataset)

#print left_prob,calgini(left_subdataset),

#右增益

right_subdataset = splitdataset(dataset, i, value,'gt'

) right_prob = len(right_subdataset)/float(len(dataset))

ginigain += right_prob *calgini(right_subdataset)

#print right_prob,calgini(right_subdataset),

#print ginigain

if (ginigain < bestginigain): #

比較是否是最好的結果

bestginigain = ginigain #

記錄最好的結果和最好的特徵

bestfeature =i

bsetvalue=value

return bestfeature,bsetvalue

生成cart:總體上和離散值的差不多,主要差別在於分支的值要加上大於或者小於等於號

def

createtree(dataset,labels):

classlist = [example[-1] for example in

dataset]

#print dataset

if classlist.count(classlist[0]) ==len(classlist):

return classlist[0]#

所有的類別都一樣,就不用再劃分了

if len(dataset) == 1: #

如果沒有繼續可以劃分的特徵,就多數表決決定分支的類別

return

majoritycnt(classlist)

bestfeat,bsetvalue =choosebestfeaturetosplit(dataset)

#print bestfeat,bsetvalue,labels

bestfeatlabel =labels[bestfeat]

if bestfeat==-1:

return

majoritycnt(classlist)

mytree =}

featvalues = [example[bestfeat] for example in

dataset]

uniquevals =list(set(featvalues))

sublabels =labels[:]

#print bsetvalue

mytree[bestfeatlabel][bestfeatlabel+'

<=

'+str(round(float(bsetvalue),3))] = createtree(splitdataset(dataset, bestfeat, bsetvalue,'lt'

),sublabels)

mytree[bestfeatlabel][bestfeatlabel+'

>

'+str(round(float(bsetvalue),3))] = createtree(splitdataset(dataset, bestfeat, bsetvalue,'gt'

),sublabels)

return mytree

我們看下連續值的cart大概是什麼樣的(資料集是我們之前用的100個點的資料集)

CART分類回歸樹

cart分類回歸樹1984年提出,id3演算法1986年提出,c4.5演算法1993年提出 cart由特徵選擇 樹的生成及剪枝組成。cart假設決策樹是二叉樹,內部結點特徵取值為是和否 cart使用損失函式最小作為剪枝的標準。回歸樹的生成 使用平方誤差最小化準則。對於任意劃分特徵a,對應的任意劃分點...

CART分類和回歸樹

cart演算法根據類標號屬性的型別,當類標號屬性是連續型時,生成的模型是回歸樹 離散型則是分類樹。不同於id3演算法可以產生多個分支,cart每次 只能產生兩個分支,所以cart產生的決策樹是一棵二叉樹。雜度 不純度 gini t 1 各類數量在資料集中的概率 的平方和。標準問題集 所有候選分支方案...

CART分類與回歸樹

十大經典資料探勘演算法 系列 c4.5 k means svmapriori empagerank adaboost knnna ve bayes cart 分類與回歸樹 classification and regression trees,cart 是由四人幫leo breiman,jerome...