當前位置:首頁 » 編程語言 » 決策樹python實現

決策樹python實現

發布時間: 2023-03-12 12:16:19

Ⅰ 用python實現紅酒數據集的ID3,C4.5和CART演算法

ID3演算法介紹
ID3演算法全稱為迭代二叉樹3代演算法(Iterative Dichotomiser 3)
該演算法要先進行特徵選擇,再生成決策樹,其中特徵選擇是基於「信息增益」最大的原則進行的。
但由於決策樹完全基於訓練集生成的,有可能對訓練集過於「依賴」,即產生過擬合現象。因此在生成決策樹後,需要對決策樹進行剪枝。剪枝有兩種形式,分別為前剪枝(Pre-Pruning)和後剪枝(Post-Pruning),一般採用後剪枝。
信息熵、條件熵和信息增益
信息熵:來自於香農定理,表示信息集合所含信息的平均不確定性。信息熵越大,表示不確定性越大,所含的信息量也就越大。
設x 1 , x 2 , x 3 , . . . x n {x_1, x_2, x_3, ...x_n}x
1

,x
2

,x
3

,...x
n

為信息集合X的n個取值,則x i x_ix
i

的概率:
P ( X = i ) = p i , i = 1 , 2 , 3 , . . . , n P(X=i) = p_i, i=1,2,3,...,n
P(X=i)=p
i

,i=1,2,3,...,n

信息集合X的信息熵為:
H ( X ) = − ∑ i = 1 n p i log ⁡ p i H(X) =- \sum_{i=1}^{n}{p_i}\log{p_i}
H(X)=−
i=1

n

p
i

logp
i

條件熵:指已知某個隨機變數的情況下,信息集合的信息熵。
設信息集合X中有y 1 , y 2 , y 3 , . . . y m {y_1, y_2, y_3, ...y_m}y
1

,y
2

,y
3

,...y
m

組成的隨機變數集合Y,則隨機變數(X,Y)的聯合概率分布為
P ( x = i , y = j ) = p i j P(x=i,y=j) = p_{ij}
P(x=i,y=j)=p
ij

條件熵:
H ( X ∣ Y ) = ∑ j = 1 m p ( y j ) H ( X ∣ y j ) H(X|Y) = \sum_{j=1}^m{p(y_j)H(X|y_j)}
H(X∣Y)=
j=1

m

p(y
j

)H(X∣y
j

)

H ( X ∣ y j ) = − ∑ j = 1 m p ( y j ) ∑ i = 1 n p ( x i ∣ y j ) log ⁡ p ( x i ∣ y j ) H(X|y_j) = - \sum_{j=1}^m{p(y_j)}\sum_{i=1}^n{p(x_i|y_j)}\log{p(x_i|y_j)}
H(X∣y
j

)=−
j=1

m

p(y
j

)
i=1

n

p(x
i

∣y
j

)logp(x
i

∣y
j

)
和貝葉斯公式:
p ( x i y j ) = p ( x i ∣ y j ) p ( y j ) p(x_iy_j) = p(x_i|y_j)p(y_j)
p(x
i

y
j

)=p(x
i

∣y
j

)p(y
j

)
可以化簡條件熵的計算公式為:
H ( X ∣ Y ) = ∑ j = 1 m ∑ i = 1 n p ( x i , y j ) log ⁡ p ( x i ) p ( x i , y j ) H(X|Y) = \sum_{j=1}^m \sum_{i=1}^n{p(x_i, y_j)\log\frac{p(x_i)}{p(x_i, y_j)}}
H(X∣Y)=
j=1

m

i=1

n

p(x
i

,y
j

)log
p(x
i

,y
j

)
p(x
i

)

信息增益:信息熵-條件熵,用於衡量在知道已知隨機變數後,信息不確定性減小越大。
d ( X , Y ) = H ( X ) − H ( X ∣ Y ) d(X,Y) = H(X) - H(X|Y)
d(X,Y)=H(X)−H(X∣Y)

python代碼實現
import numpy as np
import math

def calShannonEnt(dataSet):
""" 計算信息熵 """
labelCountDict = {}
for d in dataSet:
label = d[-1]
if label not in labelCountDict.keys():
labelCountDict[label] = 1
else:
labelCountDict[label] += 1
entropy = 0.0
for l, c in labelCountDict.items():
p = 1.0 * c / len(dataSet)
entropy -= p * math.log(p, 2)
return entropy

def filterSubDataSet(dataSet, colIndex, value):
"""返回colIndex特徵列label等於value,並且過濾掉改特徵列的數據集"""
subDataSetList = []
for r in dataSet:
if r[colIndex] == value:
newR = r[:colIndex]
newR = np.append(newR, (r[colIndex + 1:]))
subDataSetList.append(newR)
return np.array(subDataSetList)

def chooseFeature(dataSet):
""" 通過計算信息增益選擇最合適的特徵"""
featureNum = dataSet.shape[1] - 1
entropy = calShannonEnt(dataSet)
bestInfoGain = 0.0
bestFeatureIndex = -1
for i in range(featureNum):
uniqueValues = np.unique(dataSet[:, i])
condition_entropy = 0.0

for v in uniqueValues: #計算條件熵
subDataSet = filterSubDataSet(dataSet, i, v)
p = 1.0 * len(subDataSet) / len(dataSet)
condition_entropy += p * calShannonEnt(subDataSet)
infoGain = entropy - condition_entropy #計算信息增益

if infoGain >= bestInfoGain: #選擇最大信息增益
bestInfoGain = infoGain
bestFeatureIndex = i
return bestFeatureIndex

def creatDecisionTree(dataSet, featNames):
""" 通過訓練集生成決策樹 """
featureName = featNames[:] # 拷貝featNames,此處不能直接用賦值操作,否則新變數會指向舊變數的地址
classList = list(dataSet[:, -1])
if len(set(classList)) == 1: # 只有一個類別
return classList[0]
if dataSet.shape[1] == 1: #當所有特徵屬性都利用完仍然無法判斷樣本屬於哪一類,此時歸為該數據集中數量最多的那一類
return max(set(classList), key=classList.count)

bestFeatureIndex = chooseFeature(dataSet) #選擇特徵
bestFeatureName = featNames[bestFeatureIndex]
del featureName[bestFeatureIndex] #移除已選特徵列
decisionTree = {bestFeatureName: {}}

featureValueUnique = sorted(set(dataSet[:, bestFeatureIndex])) #已選特徵列所包含的類別, 通過遞歸生成決策樹
for v in featureValueUnique:
FeatureName = featureName[:]
subDataSet = filterSubDataSet(dataSet, bestFeatureIndex, v)
decisionTree[bestFeatureName][v] = creatDecisionTree(subDataSet, FeatureName)
return decisionTree

def classify(decisionTree, featnames, featList):
""" 使用訓練所得的決策樹進行分類 """
classLabel = None
root = decisionTree.keys()[0]
firstGenDict = decisionTree[root]
featIndex = featnames.index(root)
for k in firstGenDict.keys():
if featList[featIndex] == k:
if isinstance(firstGenDict[k], dict): #若子節點仍是樹,則遞歸查找
classLabel = classify(firstGenDict[k], featnames, featList)
else:
classLabel = firstGenDict[k]
return classLabel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
下面用鳶尾花數據集對該演算法進行測試。由於ID3演算法只能用於標稱型數據,因此用在對連續型的數值數據上時,還需要對數據進行離散化,離散化的方法稍後說明,此處為了簡化,先使用每一種特徵所有連續性數值的中值作為分界點,小於中值的標記為1,大於中值的標記為0。訓練1000次,統計准確率均值。

from sklearn import datasets
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
data = np.c_[iris.data, iris.target]

scoreL = []
for i in range(1000): #對該過程進行10000次
trainData, testData = train_test_split(data) #區分測試集和訓練集

featNames = iris.feature_names[:]
for i in range(trainData.shape[1] - 1): #對訓練集每個特徵,以中值為分界點進行離散化
splitPoint = np.mean(trainData[:, i])
featNames[i] = featNames[i]+'<='+'{:.3f}'.format(splitPoint)
trainData[:, i] = [1 if x <= splitPoint else 0 for x in trainData[:, i]]
testData[:, i] = [1 if x <= splitPoint else 0 for x in testData[:, i]]

decisionTree = creatDecisionTree(trainData, featNames)
classifyLable = [classify(decisionTree, featNames, td) for td in testData]
scoreL.append(1.0 * sum(classifyLable == testData[:, -1]) / len(classifyLable))
print 'score: ', np.mean(scoreL)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
輸出結果為:score: 0.7335,即准確率有73%。每次訓練和預測的准確率分布如下:

數據離散化
然而,在上例中對特徵值離散化的劃分點實際上過於「野蠻」,此處介紹一種通過信息增益最大的標准來對數據進行離散化。原理很簡單,當信息增益最大時,說明用該點劃分能最大程度降低數據集的不確定性。
具體步驟如下:

對每個特徵所包含的數值型特徵值排序
對相鄰兩個特徵值取均值,這些均值就是待選的劃分點
用每一個待選點把該特徵的特徵值劃分成兩類,小於該特徵點置為1, 大於該特徵點置為0,計算此時的條件熵,並計算出信息增益
選擇信息使信息增益最大的劃分點進行特徵離散化
實現代碼如下:

def filterRawData(dataSet, colIndex, value, tag):
""" 用於把每個特徵的連續值按照區分點分成兩類,加入tag參數,可用於標記篩選的是哪一部分數據"""
filterDataList = []
for r in dataSet:
if (tag and r[colIndex] <= value) or ((not tag) and r[colIndex] > value):
newR = r[:colIndex]
newR = np.append(newR, (r[colIndex + 1:]))
filterDataList.append(newR)
return np.array(filterDataList)

def dataDiscretization(dataSet, featName):
""" 對數據每個特徵的數值型特徵值進行離散化 """
featureNum = dataSet.shape[1] - 1
entropy = calShannonEnt(dataSet)

for featIndex in range(featureNum): #對於每一個特徵
uniqueValues = sorted(np.unique(dataSet[:, featIndex]))
meanPoint = []

for i in range(len(uniqueValues) - 1): # 求出相鄰兩個值的平均值
meanPoint.append(float(uniqueValues[i+1] + uniqueValues[i]) / 2.0)
bestInfoGain = 0.0
bestMeanPoint = -1
for mp in meanPoint: #對於每個劃分點
subEntropy = 0.0 #計算該劃分點的信息熵
for tag in range(2): #分別劃分為兩類
subDataSet = filterRawData(dataSet, featIndex, mp, tag)
p = 1.0 * len(subDataSet) / len(dataSet)
subEntropy += p * calShannonEnt(subDataSet)

## 計算信息增益
infoGain = entropy - subEntropy
## 選擇最大信息增益
if infoGain >= bestInfoGain:
bestInfoGain = infoGain
bestMeanPoint = mp
featName[featIndex] = featName[featIndex] + "<=" + "{:.3f}".format(bestMeanPoint)
dataSet[:, featIndex] = [1 if x <= bestMeanPoint else 0 for x in dataSet[:, featIndex]]
return dataSet, featName
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
重新對數據進行離散化,並重復該步驟1000次,同時用sklearn中的DecisionTreeClassifier對相同數據進行分類,分別統計平均准確率。運行代碼如下:

from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
scoreL = []
scoreL_sk = []
for i in range(1000): #對該過程進行1000次
featNames = iris.feature_names[:]
trainData, testData = train_test_split(data) #區分測試集和訓練集
trainData_tmp = .(trainData)
testData_tmp = .(testData)
discritizationData, discritizationFeatName= dataDiscretization(trainData, featNames) #根據信息增益離散化
for i in range(testData.shape[1]-1): #根據測試集的區分點離散化訓練集
splitPoint = float(discritizationFeatName[i].split('<=')[-1])
testData[:, i] = [1 if x<=splitPoint else 0 for x in testData[:, i]]
decisionTree = creatDecisionTree(trainData, featNames)
classifyLable = [classify(decisionTree, featNames, td) for td in testData]
scoreL.append(1.0 * sum(classifyLable == testData[:, -1]) / len(classifyLable))

clf = DecisionTreeClassifier('entropy')
clf.fit(trainData[:, :-1], trainData[:, -1])
clf.predict(testData[:, :-1])
scoreL_sk.append(clf.score(testData[:, :-1], testData[:, -1]))

print 'score: ', np.mean(scoreL)
print 'score-sk: ', np.mean(scoreL_sk)
fig = plt.figure(figsize=(10, 4))
plt.subplot(1,2,1)
pd.Series(scoreL).hist(grid=False, bins=10)
plt.subplot(1,2,2)
pd.Series(scoreL_sk).hist(grid=False, bins=10)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
兩者准確率分別為:
score: 0.7037894736842105
score-sk: 0.7044736842105263

准確率分布如下:

兩者的結果非常一樣。
(但是。。為什麼根據信息熵離散化得到的准確率比直接用均值離散化的准確率還要低啊??哇的哭出聲。。)

最後一次決策樹圖形如下:

決策樹剪枝
由於決策樹是完全依照訓練集生成的,有可能會有過擬合現象,因此一般會對生成的決策樹進行剪枝。常用的是通過決策樹損失函數剪枝,決策樹損失函數表示為:
C a ( T ) = ∑ t = 1 T N t H t ( T ) + α ∣ T ∣ C_a(T) = \sum_{t=1}^TN_tH_t(T) +\alpha|T|
C
a

(T)=
t=1

T

N
t

H
t

(T)+α∣T∣

其中,H t ( T ) H_t(T)H
t

(T)表示葉子節點t的熵值,T表示決策樹的深度。前項∑ t = 1 T N t H t ( T ) \sum_{t=1}^TN_tH_t(T)∑
t=1
T

N
t

H
t

(T)是決策樹的經驗損失函數當隨著T的增加,該節點被不停的劃分的時候,熵值可以達到最小,然而T的增加會使後項的值增大。決策樹損失函數要做的就是在兩者之間進行平衡,使得該值最小。
對於決策樹損失函數的理解,如何理解決策樹的損失函數? - 陶輕松的回答 - 知乎這個回答寫得挺好,可以按照答主的思路理解一下

C4.5演算法
ID3演算法通過信息增益來進行特徵選擇會有一個比較明顯的缺點:即在選擇的過程中該演算法會優先選擇類別較多的屬性(這些屬性的不確定性小,條件熵小,因此信息增益會大),另外,ID3演算法無法解決當每個特徵屬性中每個分類都只有一個樣本的情況(此時每個屬性的條件熵都為0)。
C4.5演算法ID3演算法的改進,它不是依據信息增益進行特徵選擇,而是依據信息增益率,它添加了特徵分裂信息作為懲罰項。定義分裂信息:
S p l i t I n f o ( X , Y ) = − ∑ i n ∣ X i ∣ ∣ X ∣ log ⁡ ∣ X i ∣ ∣ X ∣ SplitInfo(X, Y) =-\sum_i^n\frac{|X_i|}{|X|}\log\frac{|X_i|}{|X|}
SplitInfo(X,Y)=−
i

n

∣X∣
∣X
i



log
∣X∣
∣X
i



則信息增益率為:
G a i n R a t i o ( X , Y ) = d ( X , Y ) S p l i t I n f o ( X , Y ) GainRatio(X,Y)=\frac{d(X,Y)}{SplitInfo(X, Y)}
GainRatio(X,Y)=
SplitInfo(X,Y)
d(X,Y)

關於ID3和C4.5演算法
在學習分類回歸決策樹演算法時,看了不少的資料和博客。關於這兩個演算法,ID3演算法是最早的分類演算法,這個演算法剛出生的時候其實帶有很多缺陷:

無法處理連續性特徵數據
特徵選取會傾向於分類較多的特徵
沒有解決過擬合的問題
沒有解決缺失值的問題
即該演算法出生時是沒有帶有連續特徵離散化、剪枝等步驟的。C4.5作為ID3的改進版本彌補列ID3演算法不少的缺陷:

通過信息最大增益的標准離散化連續的特徵數據
在選擇特徵是標准從「最大信息增益」改為「最大信息增益率」
通過加入正則項系數對決策樹進行剪枝
對缺失值的處理體現在兩個方面:特徵選擇和生成決策樹。初始條件下對每個樣本的權重置為1。
特徵選擇:在選取最優特徵時,計算出每個特徵的信息增益後,需要乘以一個**「非缺失值樣本權重占總樣本權重的比例」**作為系數來對比每個特徵信息增益的大小
生成決策樹:在生成決策樹時,對於缺失的樣本我們按照一定比例把它歸屬到每個特徵值中,比例為該特徵每一個特徵值占非缺失數據的比重
關於C4.5和CART回歸樹
作為ID3的改進版本,C4.5克服了許多缺陷,但是它自身還是存在不少問題:

C4.5的熵運算中涉及了對數運算,在數據量大的時候效率非常低。
C4.5的剪枝過於簡單
C4.5隻能用於分類運算不能用於回歸
當特徵有多個特徵值是C4.5生成多叉樹會使樹的深度加深
————————————————
版權聲明:本文為CSDN博主「Sarah Huang」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_44794704/article/details/89406612

Ⅱ python構造決策樹要調用什麼包

調用這個包:

sklearn.tree


sklearn(scikit-learn)可以去http://www.lfd.uci.e/~gohlke/pythonlibs/#scikit-learn下載,解壓後放入C:Python27Libsite-packages直接使用。需要用同樣的方法額外下載numpy和scipy包,不然會報錯。


例子:

fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimportcross_val_score
fromsklearn.
clf=DecisionTreeClassifier(random_state=0)
iris=load_iris()
cross_val_score(clf,iris.data,iris.target,cv=10)

Ⅲ python中的sklearn中決策樹使用的是哪一種演算法

要弄清楚這個問題,首先要弄懂決策樹三大流行演算法ID3、C4.5和CART的原理,以及sklearn框架下DecisionTreeClassifier的幫助文檔。
3個演算法的主要區別在於度量信息方法、選擇節點特徵還有分支數量的不同。
ID3,採用熵(entropy)來度量信息不確定度,選擇「信息增益」最大的作為節點特徵,它是多叉樹,即一個節點可以有多個分支。
C4.5,同樣採用熵(entropy)來度量信息不確定度,選擇「信息增益比」最大的作為節點特徵,同樣是多叉樹,即一個節點可以有多個分支。
CART,採用基尼指數(Gini index)來度量信息不純度,選擇基尼指數最小的作為節點特徵,它是二叉樹,即一個節點只分兩支。
然後你認真閱讀sklearn的DecisionTreeClassifier的幫助文檔,可以發現,度量信息的方法默認是Gini,但可以改成entropy,請按需選擇;構建的樹是二叉樹;可以通過設置max_deepth、max_leaf等來實現「剪枝」,這是根據CART的損失函數減少的理論進行的。
所以總結說,如果信息度量方法按照默認的設置,那麼sklearn所用的決策樹分類器就是CART,如果改成了entropy,那麼只是使用了別的度量方法而已。其實兩者差不多。

Ⅳ 基於python的決策樹能進行多分類嗎

決策樹主文件 tree.py

[python] view plain

  • #coding:utf-8

  • frommathimportlog

  • importjson

  • fromplotimportcreatePlot

  • classDecisionTree():

  • def__init__(self,criterion="entropy"):

  • self.tree=None

  • self.criterion=criterion

  • def_is_continuous_value(self,a):

  • #判斷一個值是否是連續型變數

  • iftype(a).__name__.lower().find('float')>-1or

  • type(a).__name__.lower().find('int')>-1:

  • returnTrue

  • else:

  • returnFalse

  • def_calc_entropy(self,dataset):

  • #計算數據集的香農熵

  • classes=dataset.ix[:,-1]

  • total=len(classes)

  • cls_count={}

  • forclsinclasses:

  • ifclsnotincls_count.keys():

  • cls_count[cls]=0

  • cls_count[cls]+=1

  • entropy=1.0

  • forkeyincls_count:

  • prob=float(cls_count[key])/total

  • entropy-=prob*log(prob,2)

  • returnentropy

  • def_calc_gini(self,dataset):

  • #計算數據集的Gini指數

  • classes=dataset.ix[:,-1]

  • total=len(classes)

  • cls_count={}

  • forclsinclasses:

  • ifclsnotincls_count.keys():

  • cls_count[cls]=0

  • cls_count[cls]+=1

  • gini=1.0

  • forkeyincls_count:

  • prob=float(cls_count[key])/total

  • gini-=prob**2

  • returngini

  • def_split_data_category(self,dataset,feature,value):

  • #對分類變數進行拆分

  • #將feature列的值為value的記錄抽取出來,同時刪除feature列

Ⅳ 決策樹之ID3演算法及其Python實現

決策樹之ID3演算法及其Python實現

1. 決策樹背景知識
??決策樹是數據挖掘中最重要且最常用的方法之一,主要應用於數據挖掘中的分類和預測。決策樹是知識的一種呈現方式,決策樹中從頂點到每個結點的路徑都是一條分類規則。決策樹演算法最先基於資訊理論發展起來,經過幾十年發展,目前常用的演算法有:ID3、C4.5、CART演算法等。
2. 決策樹一般構建過程
??構建決策樹是一個自頂向下的過程。樹的生長過程是一個不斷把數據進行切分細分的過程,每一次切分都會產生一個數據子集對應的節點。從包含所有數據的根節點開始,根據選取分裂屬性的屬性值把訓練集劃分成不同的數據子集,生成由每個訓練數據子集對應新的非葉子節點。對生成的非葉子節點再重復以上過程,直到滿足特定的終止條件,停止對數據子集劃分,生成數據子集對應的葉子節點,即所需類別。測試集在決策樹構建完成後檢驗其性能。如果性能不達標,我們需要對決策樹演算法進行改善,直到達到預期的性能指標。
??註:分裂屬性的選取是決策樹生產過程中的關鍵,它決定了生成的決策樹的性能、結構。分裂屬性選擇的評判標準是決策樹演算法之間的根本區別。
3. ID3演算法分裂屬性的選擇——信息增益
??屬性的選擇是決策樹演算法中的核心。是對決策樹的結構、性能起到決定性的作用。ID3演算法基於信息增益的分裂屬性選擇。基於信息增益的屬性選擇是指以信息熵的下降速度作為選擇屬性的方法。它以的資訊理論為基礎,選擇具有最高信息增益的屬性作為當前節點的分裂屬性。選擇該屬性作為分裂屬性後,使得分裂後的樣本的信息量最大,不確定性最小,即熵最小。
??信息增益的定義為變化前後熵的差值,而熵的定義為信息的期望值,因此在了解熵和信息增益之前,我們需要了解信息的定義。
??信息:分類標簽xi 在樣本集 S 中出現的頻率記為 p(xi),則 xi 的信息定義為:?log2p(xi) 。
??分裂之前樣本集的熵:E(S)=?∑Ni=1p(xi)log2p(xi),其中 N 為分類標簽的個數。
??通過屬性A分裂之後樣本集的熵:EA(S)=?∑mj=1|Sj||S|E(Sj),其中 m 代表原始樣本集通過屬性A的屬性值劃分為 m 個子樣本集,|Sj| 表示第j個子樣本集中樣本數量,|S| 表示分裂之前數據集中樣本總數量。
??通過屬性A分裂之後樣本集的信息增益:InfoGain(S,A)=E(S)?EA(S)
??註:分裂屬性的選擇標准為:分裂前後信息增益越大越好,即分裂後的熵越小越好。
4. ID3演算法
??ID3演算法是一種基於信息增益屬性選擇的決策樹學習方法。核心思想是:通過計算屬性的信息增益來選擇決策樹各級節點上的分裂屬性,使得在每一個非葉子節點進行測試時,獲得關於被測試樣本最大的類別信息。基本方法是:計算所有的屬性,選擇信息增益最大的屬性分裂產生決策樹節點,基於該屬性的不同屬性值建立各分支,再對各分支的子集遞歸調用該方法建立子節點的分支,直到所有子集僅包括同一類別或沒有可分裂的屬性為止。由此得到一棵決策樹,可用來對新樣本數據進行分類。
ID3演算法流程:
(1) 創建一個初始節點。如果該節點中的樣本都在同一類別,則演算法終止,把該節點標記為葉節點,並用該類別標記。
(2) 否則,依據演算法選取信息增益最大的屬性,該屬性作為該節點的分裂屬性。
(3) 對該分裂屬性中的每一個值,延伸相應的一個分支,並依據屬性值劃分樣本。
(4) 使用同樣的過程,自頂向下的遞歸,直到滿足下面三個條件中的一個時就停止遞歸。
??A、待分裂節點的所有樣本同屬於一類。
??B、訓練樣本集中所有樣本均完成分類。
??C、所有屬性均被作為分裂屬性執行一次。若此時,葉子結點中仍有屬於不同類別的樣本時,選取葉子結點中包含樣本最多的類別,作為該葉子結點的分類。
ID3演算法優缺點分析
優點:構建決策樹的速度比較快,演算法實現簡單,生成的規則容易理解。
缺點:在屬性選擇時,傾向於選擇那些擁有多個屬性值的屬性作為分裂屬性,而這些屬性不一定是最佳分裂屬性;不能處理屬性值連續的屬性;無修剪過程,無法對決策樹進行優化,生成的決策樹可能存在過度擬合的情況。

Ⅵ python中的sklearn中決策樹使用的是哪一種演算法

sklearn中決策樹分為DecisionTreeClassifier和DecisionTreeRegressor,所以用的演算法是CART演算法,也就是分類與回歸樹演算法(classification and regression tree,CART),劃分標准默認使用的也是Gini,ID3和C4.5用的是信息熵,為何要設置成ID3或者C4.5呢

熱點內容
動態規劃01背包演算法 發布:2024-11-05 22:17:40 瀏覽:849
nasm編譯器如何安裝 發布:2024-11-05 22:01:13 瀏覽:181
登錄密碼在微信的哪裡 發布:2024-11-05 22:00:29 瀏覽:739
c防止反編譯工具 發布:2024-11-05 21:56:14 瀏覽:247
安卓虛擬機怎麼用 發布:2024-11-05 21:52:48 瀏覽:344
php時間搜索 發布:2024-11-05 20:58:36 瀏覽:479
燕山大學編譯原理期末考試題 發布:2024-11-05 20:13:54 瀏覽:528
華為電腦出現臨時伺服器 發布:2024-11-05 20:05:08 瀏覽:408
斗戰神免費挖礦腳本 發布:2024-11-05 19:53:25 瀏覽:665
網吧伺服器分別是什麼 發布:2024-11-05 19:45:32 瀏覽:392