版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
機(jī)器學(xué)習(xí):決策樹(shù):決策樹(shù)的構(gòu)建過(guò)程1決策樹(shù)簡(jiǎn)介1.1決策樹(shù)的基本概念決策樹(shù)是一種監(jiān)督學(xué)習(xí)算法,用于分類(lèi)和回歸任務(wù)。它通過(guò)樹(shù)狀結(jié)構(gòu)來(lái)表示決策規(guī)則,其中每個(gè)內(nèi)部節(jié)點(diǎn)表示一個(gè)特征上的測(cè)試,每個(gè)分支代表一個(gè)測(cè)試結(jié)果,而每個(gè)葉節(jié)點(diǎn)代表一個(gè)類(lèi)別(對(duì)于分類(lèi)任務(wù))或一個(gè)值(對(duì)于回歸任務(wù))。決策樹(shù)的構(gòu)建過(guò)程涉及從根節(jié)點(diǎn)開(kāi)始,通過(guò)遞歸地選擇最優(yōu)特征進(jìn)行分割,直到滿(mǎn)足停止條件,形成一個(gè)樹(shù)模型。1.1.1特征選擇特征選擇是決策樹(shù)構(gòu)建的關(guān)鍵步驟,它決定了樹(shù)的結(jié)構(gòu)和預(yù)測(cè)能力。常用的特征選擇方法有信息增益、信息增益比、基尼指數(shù)等。以信息增益為例,它衡量了特征對(duì)數(shù)據(jù)集分類(lèi)的貢獻(xiàn)度,選擇信息增益最大的特征作為分割特征。1.1.2示例:使用信息增益選擇特征假設(shè)我們有以下數(shù)據(jù)集,用于預(yù)測(cè)是否在戶(hù)外活動(dòng):天氣溫度濕度風(fēng)力是否活動(dòng)晴熱高弱否晴熱高強(qiáng)否陰熱高弱是雨溫高弱是雨冷正常弱是雨冷正常強(qiáng)否陰冷正常弱是晴溫高弱否晴冷正常弱是雨溫正常弱是晴溫正常強(qiáng)是陰溫高強(qiáng)是陰熱正常弱是雨熱正常強(qiáng)否我們可以使用Python的scikit-learn庫(kù)來(lái)計(jì)算信息增益:fromsklearn.datasetsimportload_iris
fromsklearn.treeimportDecisionTreeClassifier
fromsklearn.metricsimportmutual_info_score
#加載數(shù)據(jù)集
data=[
['晴','熱','高','弱','否'],
['晴','熱','高','強(qiáng)','否'],
['陰','熱','高','弱','是'],
['雨','溫','高','弱','是'],
['雨','冷','正常','弱','是'],
['雨','冷','正常','強(qiáng)','否'],
['陰','冷','正常','弱','是'],
['晴','溫','高','弱','否'],
['晴','冷','正常','弱','是'],
['雨','溫','正常','弱','是'],
['晴','溫','正常','強(qiáng)','是'],
['陰','溫','高','強(qiáng)','是'],
['陰','熱','正常','弱','是'],
['雨','熱','正常','強(qiáng)','否'],
]
#將分類(lèi)標(biāo)簽轉(zhuǎn)換為數(shù)字
labels=['否','是']
label_map={label:ifori,labelinenumerate(labels)}
data[-1][-1]=label_map[data[-1][-1]]
#將特征轉(zhuǎn)換為數(shù)字
features=['天氣','溫度','濕度','風(fēng)力']
feature_map={
'天氣':{'晴':0,'陰':1,'雨':2},
'溫度':{'熱':0,'溫':1,'冷':2},
'濕度':{'高':0,'正常':1},
'風(fēng)力':{'弱':0,'強(qiáng)':1},
}
#轉(zhuǎn)換數(shù)據(jù)集
X=[[feature_map[feature][value]forfeature,valueinzip(features,row[:-1])]forrowindata]
y=[label_map[row[-1]]forrowindata]
#計(jì)算信息增益
clf=DecisionTreeClassifier(criterion='entropy')
clf.fit(X,y)
forfeatureinfeatures:
feature_index=features.index(feature)
info_gain=mutual_info_score([row[feature_index]forrowinX],y)
print(f"{feature}的信息增益為:{info_gain}")1.2決策樹(shù)的應(yīng)用場(chǎng)景決策樹(shù)廣泛應(yīng)用于各種領(lǐng)域,包括但不限于:金融領(lǐng)域:信用評(píng)分、欺詐檢測(cè)。醫(yī)療領(lǐng)域:疾病診斷、藥物反應(yīng)預(yù)測(cè)。市場(chǎng)營(yíng)銷(xiāo):客戶(hù)細(xì)分、購(gòu)買(mǎi)預(yù)測(cè)。教育領(lǐng)域:學(xué)生表現(xiàn)預(yù)測(cè)、課程推薦。自然語(yǔ)言處理:文本分類(lèi)、情感分析。決策樹(shù)的優(yōu)點(diǎn)在于模型的可解釋性高,易于理解和實(shí)現(xiàn)。缺點(diǎn)是容易過(guò)擬合,特別是在樹(shù)深度較大時(shí)。為了解決過(guò)擬合問(wèn)題,通常會(huì)采用剪枝技術(shù),包括預(yù)剪枝和后剪枝。1.2.1示例:決策樹(shù)在信用評(píng)分中的應(yīng)用假設(shè)我們有一個(gè)簡(jiǎn)單的信用評(píng)分?jǐn)?shù)據(jù)集,包含年齡、收入、信用歷史和是否違約的信息:年齡收入信用歷史是否違約小低正常否小低正常否小高正常是小高正常是小高正常否中低正常否中高正常否中高正常否中高正常否大低正常否大低正常否大高正常否大高正常否大高正常否我們可以使用決策樹(shù)來(lái)預(yù)測(cè)一個(gè)人是否會(huì)違約:fromsklearn.treeimportDecisionTreeClassifier
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.preprocessingimportLabelEncoder
#數(shù)據(jù)集
data=[
['小','低','正常','否'],
['小','低','正常','否'],
['小','高','正常','是'],
['小','高','正常','是'],
['小','高','正常','否'],
['中','低','正常','否'],
['中','高','正常','否'],
['中','高','正常','否'],
['中','高','正常','否'],
['大','低','正常','否'],
['大','低','正常','否'],
['大','高','正常','否'],
['大','高','正常','否'],
['大','高','正常','否'],
]
#將分類(lèi)標(biāo)簽轉(zhuǎn)換為數(shù)字
labels=['否','是']
label_map={label:ifori,labelinenumerate(labels)}
data[-1][-1]=label_map[data[-1][-1]]
#將特征轉(zhuǎn)換為數(shù)字
features=['年齡','收入','信用歷史']
feature_map={
'年齡':{'小':0,'中':1,'大':2},
'收入':{'低':0,'高':1},
'信用歷史':{'正常':0},
}
#轉(zhuǎn)換數(shù)據(jù)集
X=[[feature_map[feature][value]forfeature,valueinzip(features,row[:-1])]forrowindata]
y=[label_map[row[-1]]forrowindata]
#劃分訓(xùn)練集和測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)
#構(gòu)建決策樹(shù)模型
clf=DecisionTreeClassifier()
clf.fit(X_train,y_train)
#預(yù)測(cè)
predictions=clf.predict(X_test)
print("預(yù)測(cè)結(jié)果:",predictions)通過(guò)上述代碼,我們可以構(gòu)建一個(gè)決策樹(shù)模型來(lái)預(yù)測(cè)信用評(píng)分?jǐn)?shù)據(jù)集中的違約情況,從而幫助金融機(jī)構(gòu)做出更準(zhǔn)確的信貸決策。2構(gòu)建決策樹(shù)的基礎(chǔ)2.1特征選擇的重要性在構(gòu)建決策樹(shù)時(shí),特征選擇是一個(gè)關(guān)鍵步驟,它決定了樹(shù)的結(jié)構(gòu)和預(yù)測(cè)能力。特征選擇的目標(biāo)是找到最能區(qū)分不同類(lèi)別的特征,從而構(gòu)建出一個(gè)高效且準(zhǔn)確的決策樹(shù)模型。不恰當(dāng)?shù)奶卣鬟x擇會(huì)導(dǎo)致模型過(guò)擬合或欠擬合,影響模型的泛化能力。因此,理解如何選擇特征對(duì)于構(gòu)建決策樹(shù)至關(guān)重要。2.1.1信息增益信息增益是基于信息論中的熵概念來(lái)衡量特征選擇的標(biāo)準(zhǔn)。熵是衡量數(shù)據(jù)集純度的指標(biāo),信息增益則是通過(guò)計(jì)算特征劃分前后數(shù)據(jù)集熵的變化來(lái)評(píng)估特征的重要性。信息增益越大,表示該特征對(duì)數(shù)據(jù)集的分類(lèi)貢獻(xiàn)越大。假設(shè)我們有一個(gè)數(shù)據(jù)集,其中包含兩類(lèi)樣本:是和否。我們使用信息增益來(lái)選擇最佳的特征進(jìn)行劃分。importnumpyasnp
fromsklearn.datasetsimportload_iris
fromsklearn.treeimportDecisionTreeClassifier
#加載數(shù)據(jù)集
data=load_iris()
X=data.data
y=data.target
#定義決策樹(shù)模型
clf=DecisionTreeClassifier(criterion='entropy')
#計(jì)算信息增益
defcalculate_information_gain(X,y,feature):
#計(jì)算數(shù)據(jù)集的熵
entropy_before=entropy(y)
#計(jì)算特征劃分后的熵
entropy_after=0
values=np.unique(X[:,feature])
forvalueinvalues:
subset_y=y[X[:,feature]==value]
probability=len(subset_y)/len(y)
entropy_after+=probability*entropy(subset_y)
#計(jì)算信息增益
information_gain=entropy_before-entropy_after
returninformation_gain
#定義熵函數(shù)
defentropy(y):
_,counts=np.unique(y,return_counts=True)
probabilities=counts/len(y)
entropy=-np.sum([p*np.log2(p)forpinprobabilitiesifp>0])
returnentropy
#計(jì)算每個(gè)特征的信息增益
information_gains=[]
forfeatureinrange(X.shape[1]):
information_gains.append(calculate_information_gain(X,y,feature))
#打印信息增益
print("信息增益:",information_gains)2.1.2信息增益比信息增益比是信息增益的改進(jìn)版本,它考慮了特征值的分布情況,避免了信息增益偏向于具有更多特征值的特征。信息增益比定義為信息增益除以特征的固有值(固有熵),固有值衡量了特征值的不確定性。#定義固有值函數(shù)
defintrinsic_value(X,feature):
values=np.unique(X[:,feature])
probabilities=np.array([len(X[X[:,feature]==value])/len(X)forvalueinvalues])
intrinsic_value=-np.sum(probabilities*np.log2(probabilities))
returnintrinsic_value
#計(jì)算每個(gè)特征的信息增益比
information_gain_ratios=[]
forfeatureinrange(X.shape[1]):
gain=calculate_information_gain(X,y,feature)
iv=intrinsic_value(X,feature)
ifiv==0:
information_gain_ratios.append(0)
else:
information_gain_ratios.append(gain/iv)
#打印信息增益比
print("信息增益比:",information_gain_ratios)2.2特征選擇的策略在決策樹(shù)構(gòu)建中,特征選擇策略可以是基于信息增益、信息增益比或其他標(biāo)準(zhǔn),如基尼不純度。選擇策略時(shí),應(yīng)考慮數(shù)據(jù)集的特性以及模型的最終目標(biāo)。例如,如果數(shù)據(jù)集中的特征具有大量類(lèi)別,使用信息增益比可能更為合適,因?yàn)樗紤]了特征值的分布。2.2.1示例:基于信息增益比的特征選擇在這個(gè)示例中,我們將使用信息增益比作為特征選擇的標(biāo)準(zhǔn),構(gòu)建一個(gè)決策樹(shù)模型。#選擇信息增益比最大的特征進(jìn)行劃分
best_feature=np.argmax(information_gain_ratios)
#使用最佳特征構(gòu)建決策樹(shù)
clf.fit(X[:,best_feature].reshape(-1,1),y)
#打印決策樹(shù)的結(jié)構(gòu)
print("決策樹(shù)結(jié)構(gòu):",clf.tree_)通過(guò)上述代碼,我們首先計(jì)算了每個(gè)特征的信息增益比,然后選擇了信息增益比最大的特征作為最佳特征。最后,我們使用這個(gè)最佳特征構(gòu)建了一個(gè)決策樹(shù)模型,并打印了模型的結(jié)構(gòu)。2.3總結(jié)在構(gòu)建決策樹(shù)時(shí),特征選擇是通過(guò)評(píng)估特征對(duì)數(shù)據(jù)集分類(lèi)的貢獻(xiàn)來(lái)實(shí)現(xiàn)的。信息增益和信息增益比是兩種常用的評(píng)估標(biāo)準(zhǔn),它們基于熵的概念來(lái)衡量特征的重要性。通過(guò)計(jì)算信息增益或信息增益比,我們可以選擇最合適的特征進(jìn)行數(shù)據(jù)集的劃分,從而構(gòu)建出一個(gè)高效且準(zhǔn)確的決策樹(shù)模型。在實(shí)際應(yīng)用中,應(yīng)根據(jù)數(shù)據(jù)集的特性和模型的目標(biāo)選擇合適的特征選擇策略。3決策樹(shù)的遞歸構(gòu)建3.1遞歸劃分?jǐn)?shù)據(jù)集決策樹(shù)的構(gòu)建過(guò)程主要依賴(lài)于遞歸地劃分?jǐn)?shù)據(jù)集,以找到最佳的特征和特征值來(lái)分裂數(shù)據(jù),從而形成樹(shù)的結(jié)構(gòu)。這一過(guò)程從根節(jié)點(diǎn)開(kāi)始,通過(guò)計(jì)算不同特征的信息增益或基尼不純度,選擇最優(yōu)特征進(jìn)行分裂,然后對(duì)分裂后的子數(shù)據(jù)集重復(fù)這一過(guò)程,直到滿(mǎn)足停止條件。3.1.1信息增益信息增益是基于熵的概念,用來(lái)衡量特征對(duì)數(shù)據(jù)集分類(lèi)的貢獻(xiàn)。熵是數(shù)據(jù)集混亂程度的度量,信息增益則是熵的減少量,表示通過(guò)特征分裂后數(shù)據(jù)集的純度提升。假設(shè)我們有一個(gè)數(shù)據(jù)集D,其中包含m個(gè)樣本,每個(gè)樣本屬于k個(gè)類(lèi)別之一。數(shù)據(jù)集D的熵Entropy(D)可以這樣計(jì)算:importmath
defentropy(data):
"""
計(jì)算數(shù)據(jù)集的熵
:paramdata:數(shù)據(jù)集,每個(gè)樣本的最后一列是類(lèi)別標(biāo)簽
:return:數(shù)據(jù)集的熵
"""
num_entries=len(data)
label_counts={}
forfeat_vecindata:
current_label=feat_vec[-1]
ifcurrent_labelnotinlabel_counts.keys():
label_counts[current_label]=0
label_counts[current_label]+=1
entropy=0.0
forkeyinlabel_counts:
prob=float(label_counts[key])/num_entries
entropy-=prob*math.log(prob,2)
returnentropy3.1.2信息增益計(jì)算信息增益計(jì)算涉及到特征A對(duì)數(shù)據(jù)集D的分裂,形成子集D1,D2,...,Dn。信息增益Gain(D,A)可以這樣計(jì)算:defgain(data,feature):
"""
計(jì)算給定特征下的信息增益
:paramdata:數(shù)據(jù)集
:paramfeature:特征列索引
:return:信息增益
"""
feat_list=[example[feature]forexampleindata]
unique_vals=set(feat_list)
new_entropy=0.0
forvalueinunique_vals:
sub_data=split_data(data,feature,value)
prob=len(sub_data)/float(len(data))
new_entropy+=prob*entropy(sub_data)
info_gain=entropy(data)-new_entropy
returninfo_gain其中,split_data函數(shù)用于根據(jù)特征值將數(shù)據(jù)集分裂成子集:defsplit_data(data,feature,value):
"""
根據(jù)給定特征和特征值,將數(shù)據(jù)集分裂
:paramdata:數(shù)據(jù)集
:paramfeature:特征列索引
:paramvalue:特征值
:return:分裂后的子數(shù)據(jù)集
"""
ret_data=[]
forfeat_vecindata:
iffeat_vec[feature]==value:
reduced_feat_vec=feat_vec[:feature]+feat_vec[feature+1:]
ret_data.append(reduced_feat_vec)
returnret_data3.1.3示例數(shù)據(jù)集考慮一個(gè)簡(jiǎn)單的數(shù)據(jù)集,其中包含天氣狀況和是否進(jìn)行戶(hù)外活動(dòng)的決策:天氣溫度濕度風(fēng)力是否活動(dòng)晴熱高弱否晴熱高強(qiáng)否陰熱高弱是雨溫高弱是雨冷正常弱是雨冷正常強(qiáng)否陰冷正常弱是晴溫高弱否晴冷正常弱是雨溫正常弱是晴溫正常強(qiáng)是陰溫高強(qiáng)是陰熱正常弱是雨熱正常強(qiáng)否將數(shù)據(jù)集轉(zhuǎn)換為Python列表:data=[['晴','熱','高','弱','否'],
['晴','熱','高','強(qiáng)','否'],
['陰','熱','高','弱','是'],
['雨','溫','高','弱','是'],
['雨','冷','正常','弱','是'],
['雨','冷','正常','強(qiáng)','否'],
['陰','冷','正常','弱','是'],
['晴','溫','高','弱','否'],
['晴','冷','正常','弱','是'],
['雨','溫','正常','弱','是'],
['晴','溫','正常','強(qiáng)','是'],
['陰','溫','高','強(qiáng)','是'],
['陰','熱','正常','弱','是'],
['雨','熱','正常','強(qiáng)','否']]3.1.4遞歸構(gòu)建決策樹(shù)遞歸構(gòu)建決策樹(shù)的過(guò)程如下:計(jì)算數(shù)據(jù)集的熵。對(duì)于每個(gè)特征,計(jì)算信息增益。選擇信息增益最大的特征作為分裂特征。根據(jù)分裂特征的值,將數(shù)據(jù)集分裂成子集。對(duì)每個(gè)子集重復(fù)步驟1-4,直到滿(mǎn)足停止條件。3.2停止條件與剪枝決策樹(shù)的構(gòu)建需要設(shè)定停止條件,以避免過(guò)擬合。常見(jiàn)的停止條件包括:子集中的所有樣本屬于同一類(lèi)別。子集中的樣本數(shù)低于設(shè)定的閾值。決策樹(shù)達(dá)到最大深度。3.2.1剪枝剪枝是決策樹(shù)構(gòu)建中的一個(gè)重要步驟,用于減少?zèng)Q策樹(shù)的復(fù)雜度,提高泛化能力。剪枝可以分為預(yù)剪枝和后剪枝:預(yù)剪枝:在構(gòu)建決策樹(shù)的過(guò)程中,提前停止分裂,避免過(guò)度細(xì)化。后剪枝:先構(gòu)建完整的決策樹(shù),然后從葉節(jié)點(diǎn)開(kāi)始,逐步將子樹(shù)替換為葉節(jié)點(diǎn),如果替換后驗(yàn)證集上的性能沒(méi)有下降,則進(jìn)行替換。3.2.2示例:停止條件假設(shè)我們?cè)O(shè)定的停止條件是子集中的樣本數(shù)低于3個(gè),或者子集中的所有樣本屬于同一類(lèi)別。在上述數(shù)據(jù)集中,當(dāng)分裂到某個(gè)子集只有3個(gè)樣本,且這些樣本的類(lèi)別相同,我們就可以停止分裂,將該子集標(biāo)記為葉節(jié)點(diǎn)。3.2.3示例:剪枝考慮一個(gè)過(guò)擬合的決策樹(shù),其中包含許多細(xì)分的規(guī)則,但這些規(guī)則在訓(xùn)練集之外的數(shù)據(jù)上表現(xiàn)不佳。通過(guò)后剪枝,我們可以檢查每個(gè)葉節(jié)點(diǎn)的父節(jié)點(diǎn),如果將父節(jié)點(diǎn)替換為葉節(jié)點(diǎn)后,驗(yàn)證集上的性能沒(méi)有下降,我們就可以進(jìn)行剪枝。defprune(tree,validation_data):
"""
后剪枝決策樹(shù)
:paramtree:決策樹(shù)
:paramvalidation_data:驗(yàn)證數(shù)據(jù)集
:return:剪枝后的決策樹(shù)
"""
ifnotisinstance(tree,dict):
returntree
ifvalidation_dataisNone:
returntree
feature=list(tree.keys())[0]
sub_trees=tree[feature]
forvalueinsub_trees:
sub_trees[value]=prune(sub_trees[value],split_data(validation_data,feature,value))
ifall([notisinstance(sub_trees[value],dict)forvalueinsub_trees]):
#如果所有子節(jié)點(diǎn)都是葉節(jié)點(diǎn),嘗試剪枝
best_prediction=max([(value,count)forvalue,countinCounter([example[-1]forexampleinvalidation_data])],key=lambdax:x[1])[0]
ifaccuracy(validation_data,sub_trees)<=accuracy(validation_data,best_prediction):
#如果剪枝后的準(zhǔn)確率不低于原樹(shù),進(jìn)行剪枝
returnbest_prediction
returntree其中,accuracy函數(shù)用于計(jì)算決策樹(shù)在數(shù)據(jù)集上的準(zhǔn)確率:defaccuracy(data,tree):
"""
計(jì)算決策樹(shù)在數(shù)據(jù)集上的準(zhǔn)確率
:paramdata:數(shù)據(jù)集
:paramtree:決策樹(shù)
:return:準(zhǔn)確率
"""
correct=0
forexampleindata:
prediction=classify(example,tree)
ifprediction==example[-1]:
correct+=1
returncorrect/len(data)classify函數(shù)用于根據(jù)決策樹(shù)對(duì)單個(gè)樣本進(jìn)行分類(lèi):defclassify(example,tree):
"""
根據(jù)決策樹(shù)對(duì)單個(gè)樣本進(jìn)行分類(lèi)
:paramexample:單個(gè)樣本
:paramtree:決策樹(shù)
:return:分類(lèi)結(jié)果
"""
ifnotisinstance(tree,dict):
returntree
feature=list(tree.keys())[0]
value=example[feature]
ifvaluenotintree[feature]:
returnNone
sub_tree=tree[feature][value]
returnclassify(example,sub_tree)通過(guò)遞歸構(gòu)建和剪枝,我們可以得到一個(gè)既能夠準(zhǔn)確分類(lèi)訓(xùn)練數(shù)據(jù),又具有較好泛化能力的決策樹(shù)模型。4決策樹(shù)的分裂準(zhǔn)則決策樹(shù)是一種監(jiān)督學(xué)習(xí)算法,用于分類(lèi)和回歸任務(wù)。其構(gòu)建過(guò)程涉及從根節(jié)點(diǎn)開(kāi)始,通過(guò)遞歸地選擇最佳特征進(jìn)行分裂,直到達(dá)到葉子節(jié)點(diǎn)。選擇最佳特征進(jìn)行分裂的依據(jù)是不同的分裂準(zhǔn)則,本教程將詳細(xì)介紹ID3、C4.5和CART三種算法的分裂準(zhǔn)則。4.1ID3算法詳解4.1.1原理ID3算法使用信息增益作為分裂準(zhǔn)則。信息增益基于信息論中的熵概念,衡量特征對(duì)數(shù)據(jù)集分類(lèi)的貢獻(xiàn)度。熵是數(shù)據(jù)集混亂程度的度量,信息增益則是數(shù)據(jù)集的熵減去特征給定條件下數(shù)據(jù)集的條件熵。4.1.2計(jì)算公式信息增益計(jì)算公式如下:G其中,D是數(shù)據(jù)集,A是特征,ValuesA是特征A的所有可能值,4.1.3示例代碼假設(shè)我們有以下數(shù)據(jù)集:天氣溫度濕度風(fēng)力是否打網(wǎng)球晴熱高弱否晴熱高強(qiáng)否陰熱高弱是雨溫高弱是雨冷正常弱是雨冷正常強(qiáng)否陰冷正常弱是晴溫高弱否晴冷正常弱是雨溫正常弱是晴溫正常強(qiáng)是陰溫高強(qiáng)是陰熱正常弱是雨熱正常強(qiáng)否使用Python計(jì)算天氣特征的信息增益:importnumpyasnp
fromcollectionsimportCounter
#計(jì)算熵
defentropy(y):
hist=np.bincount(y)
ps=hist/len(y)
return-np.sum([p*np.log2(p)forpinpsifp>0])
#計(jì)算信息增益
definformation_gain(X_column,y,bins):
#創(chuàng)建分割點(diǎn)
parent_entropy=entropy(y)
values,counts=np.unique(X_column,return_counts=True)
weighted_entropy=np.sum([(counts[i]/np.sum(counts))*entropy(y[X_column==values[i]])foriinrange(len(values))])
returnparent_entropy-weighted_entropy
#數(shù)據(jù)集
X=np.array([
['晴','熱','高','弱'],
['晴','熱','高','強(qiáng)'],
['陰','熱','高','弱'],
['雨','溫','高','弱'],
['雨','冷','正常','弱'],
['雨','冷','正常','強(qiáng)'],
['陰','冷','正常','弱'],
['晴','溫','高','弱'],
['晴','冷','正常','弱'],
['雨','溫','正常','弱'],
['晴','溫','正常','強(qiáng)'],
['陰','溫','高','強(qiáng)'],
['陰','熱','正常','弱'],
['雨','熱','正常','強(qiáng)']
])
y=np.array(['否','否','是','是','是','否','是','否','是','是','是','是','是','否'])
#計(jì)算天氣特征的信息增益
weather=np.array(['晴','晴','陰','雨','雨','雨','陰','晴','晴','雨','晴','陰','陰','雨'])
gain_weather=information_gain(weather,y,bins=3)
print("天氣特征的信息增益:",gain_weather)4.2C4.5算法詳解4.2.1原理C4.5算法改進(jìn)了ID3算法,使用信息增益比作為分裂準(zhǔn)則。信息增益比是信息增益與特征固有值的比值,特征固有值是特征本身的信息熵,用于懲罰具有較多可能值的特征。4.2.2計(jì)算公式信息增益比計(jì)算公式如下:G其中,SpliS4.2.3示例代碼使用Python計(jì)算天氣特征的信息增益比:#計(jì)算固有值
defsplit_info(X_column):
values,counts=np.unique(X_column,return_counts=True)
total=np.sum(counts)
return-np.sum([(counts[i]/total)*np.log2(counts[i]/total)foriinrange(len(values))])
#計(jì)算信息增益比
defgain_ratio(X_column,y):
gain=information_gain(X_column,y,bins=3)
split_info_val=split_info(X_column)
returngain/split_info_valifsplit_info_val>0else0
#計(jì)算天氣特征的信息增益比
gain_ratio_weather=gain_ratio(weather,y)
print("天氣特征的信息增益比:",gain_ratio_weather)4.3CART算法詳解4.3.1原理CART算法使用基尼指數(shù)作為分裂準(zhǔn)則。基尼指數(shù)衡量數(shù)據(jù)集的純度,值越小表示數(shù)據(jù)集越純。CART算法適用于分類(lèi)和回歸任務(wù),分類(lèi)任務(wù)中使用基尼指數(shù),回歸任務(wù)中使用均方誤差。4.3.2計(jì)算公式基尼指數(shù)計(jì)算公式如下:G其中,K是類(lèi)別數(shù),pk是第k類(lèi)在數(shù)據(jù)集D4.3.3示例代碼使用Python計(jì)算天氣特征的基尼指數(shù):#計(jì)算基尼指數(shù)
defgini(y):
hist=np.bincount(y)
ps=hist/len(y)
return1-np.sum(ps**2)
#計(jì)算基尼指數(shù)的減少量
defgini_decrease(X_column,y):
parent_gini=gini(y)
values,counts=np.unique(X_column,return_counts=True)
weighted_gini=np.sum([(counts[i]/np.sum(counts))*gini(y[X_column==values[i]])foriinrange(len(values))])
returnparent_gini-weighted_gini
#計(jì)算天氣特征的基尼指數(shù)減少量
gini_decrease_weather=gini_decrease(weather,y)
print("天氣特征的基尼指數(shù)減少量:",gini_decrease_weather)通過(guò)上述示例代碼,我們可以計(jì)算出不同特征的信息增益、信息增益比和基尼指數(shù)減少量,從而選擇最佳特征進(jìn)行決策樹(shù)的分裂。5決策樹(shù)的優(yōu)化技術(shù)決策樹(shù)是一種基本的分類(lèi)與回歸方法,其構(gòu)建過(guò)程可以通過(guò)優(yōu)化技術(shù)來(lái)提高模型的準(zhǔn)確性和效率。本教程將深入探討決策樹(shù)的兩種優(yōu)化技術(shù):預(yù)剪枝與后剪枝,以及如何處理連續(xù)特征。5.1預(yù)剪枝與后剪枝5.1.1預(yù)剪枝(PruningBeforeSplitting)預(yù)剪枝是在決策樹(shù)構(gòu)建過(guò)程中,提前停止樹(shù)的生長(zhǎng),防止過(guò)擬合。預(yù)剪枝的策略包括:最小樣本分割:設(shè)置一個(gè)節(jié)點(diǎn)上最小的樣本數(shù)量,如果低于這個(gè)數(shù)量,則不再進(jìn)行分割。最小樣本葉子:設(shè)置一個(gè)葉子節(jié)點(diǎn)上最小的樣本數(shù)量,如果低于這個(gè)數(shù)量,則將該節(jié)點(diǎn)轉(zhuǎn)換為葉子節(jié)點(diǎn)。最小增益:設(shè)置一個(gè)最小的信息增益或基尼不純度下降值,如果分割后這個(gè)值低于設(shè)定值,則不再進(jìn)行分割。5.1.1.1示例代碼假設(shè)使用Python的sklearn庫(kù)構(gòu)建決策樹(shù),我們可以設(shè)置預(yù)剪枝參數(shù):fromsklearn.treeimportDecisionTreeClassifier
fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimporttrain_test_split
#加載數(shù)據(jù)
iris=load_iris()
X=iris.data
y=iris.target
#劃分訓(xùn)練集和測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)
#設(shè)置預(yù)剪枝參數(shù)
dt=DecisionTreeClassifier(min_samples_split=20,min_samples_leaf=5,min_impurity_decrease=0.01)
#訓(xùn)練模型
dt.fit(X_train,y_train)
#預(yù)測(cè)
predictions=dt.predict(X_test)5.1.2后剪枝(PruningAfterSplitting)后剪枝是在決策樹(shù)構(gòu)建完成后,通過(guò)刪除一些子節(jié)點(diǎn)來(lái)簡(jiǎn)化樹(shù)的結(jié)構(gòu),減少過(guò)擬合。后剪枝的策略包括:成本復(fù)雜度剪枝:通過(guò)成本復(fù)雜度參數(shù)(如alpha)來(lái)控制剪枝的程度,刪除那些增加復(fù)雜度但對(duì)準(zhǔn)確率提升不大的節(jié)點(diǎn)。5.1.2.1示例代碼在sklearn中,可以使用cost_complexity_pruning_path和prune方法進(jìn)行后剪枝:fromsklearn.treeimportDecisionTreeClassifier,plot_tree
fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimporttrain_test_split
importmatplotlib.pyplotasplt
#加載數(shù)據(jù)
iris=load_iris()
X=iris.data
y=iris.target
#劃分訓(xùn)練集和測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)
#構(gòu)建決策樹(shù)
dt=DecisionTreeClassifier(random_state=42)
path=dt.cost_complexity_pruning_path(X_train,y_train)
ccp_alphas,impurities=path.ccp_alphas,path.impurities
#選擇alpha值進(jìn)行剪枝
dt_pruned=DecisionTreeClassifier(random_state=42,ccp_alpha=0.01)
dt_pruned.fit(X_train,y_train)
#可視化決策樹(shù)
plt.figure(figsize=(20,10))
plot_tree(dt_pruned,filled=True,feature_names=iris.feature_names,class_names=iris.target_names)
plt.show()5.2處理連續(xù)特征決策樹(shù)通??梢蕴幚磉B續(xù)特征,但在分割時(shí)需要確定一個(gè)閾值。常見(jiàn)的方法是:二分法:將連續(xù)特征的值域分為兩部分,選擇最佳分割點(diǎn)。多分法:將連續(xù)特征的值域分為多個(gè)部分,選擇多個(gè)分割點(diǎn)。5.2.1示例代碼使用sklearn庫(kù)處理連續(xù)特征的決策樹(shù):fromsklearn.treeimportDecisionTreeRegressor
fromsklearn.datasetsimportmake_regression
fromsklearn.model_selectionimporttrain_test_split
#生成回歸數(shù)據(jù)
X,y=make_regression(n_samples=1000,n_features=1,noise=0.1,random_state=42)
#劃分訓(xùn)練集和測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)
#構(gòu)建決策樹(shù)回歸模型
dt=DecisionTreeRegressor(random_state=42)
#訓(xùn)練模型
dt.fit(X_train,y_train)
#預(yù)測(cè)
predictions=dt.predict(X_test)在處理連續(xù)特征時(shí),決策樹(shù)會(huì)自動(dòng)尋找最佳的分割點(diǎn),無(wú)需手動(dòng)進(jìn)行離散化處理。5.3總結(jié)通過(guò)預(yù)剪枝和后剪枝技術(shù),可以有效控制決策樹(shù)的復(fù)雜度,避免過(guò)擬合。同時(shí),決策樹(shù)能夠自然地處理連續(xù)特征,通過(guò)自動(dòng)尋找分割點(diǎn)來(lái)構(gòu)建模型。這些優(yōu)化技術(shù)對(duì)于提高決策樹(shù)模型的泛化能力和預(yù)測(cè)準(zhǔn)確性至關(guān)重要。6機(jī)器學(xué)習(xí):決策樹(shù):決策樹(shù)的構(gòu)建過(guò)程實(shí)戰(zhàn)案例分析6.1手寫(xiě)決策樹(shù)構(gòu)建過(guò)程決策樹(shù)是一種監(jiān)督學(xué)習(xí)算法,用于分類(lèi)和回歸任務(wù)。它通過(guò)遞歸地分割數(shù)據(jù)集,基于特征值來(lái)創(chuàng)建一個(gè)樹(shù)結(jié)構(gòu),其中每個(gè)內(nèi)部節(jié)點(diǎn)表示一個(gè)特征上的測(cè)試,每個(gè)分支代表一個(gè)測(cè)試結(jié)果,每個(gè)葉節(jié)點(diǎn)代表一個(gè)類(lèi)別(對(duì)于分類(lèi)任務(wù))或一個(gè)值(對(duì)于回歸任務(wù))。決策樹(shù)的構(gòu)建過(guò)程主要包括特征選擇、樹(shù)的生成和剪枝。6.1.1特征選擇特征選擇是決策樹(shù)構(gòu)建的第一步,其目標(biāo)是找到一個(gè)最佳特征來(lái)分割數(shù)據(jù)集,以最大化信息增益或最小化基尼不純度。信息增益是基于熵的概念,熵衡量數(shù)據(jù)集的不確定性。信息增益越大,特征的區(qū)分能力越強(qiáng)。6.1.1.1示例數(shù)據(jù)假設(shè)我們有以下數(shù)據(jù)集,用于預(yù)測(cè)一個(gè)人是否會(huì)購(gòu)買(mǎi)電腦:年齡收入學(xué)生信用等級(jí)買(mǎi)電腦青年高否一般否青年高否好否青年中否一般否青年低否一般是青年低是一般是中年高否好是中年高否一般否中年中否好是中年低否一般否老年高否好是老年中否好是老年中是好是老年低否一般否6.1.1.2計(jì)算信息增益我們首先計(jì)算數(shù)據(jù)集的熵:importmath
defentropy(data):
#計(jì)算數(shù)據(jù)集的熵
label_counts={}
foritemindata:
label=item[-1]
iflabelnotinlabel_counts:
label_counts[label]=0
label_counts[label]+=1
entropy=0.0
forkeyinlabel_counts:
prob=float(label_counts[key])/len(data)
entropy-=prob*math.log(prob,2)
returnentropy
data=[
['青年','高','否','一般','否'],
['青年','高','否','好','否'],
['青年','中','否','一般','否'],
['青年','低','否','一般','是'],
['青年','低','是','一般','是'],
['中年','高','否','好','是'],
['中年','高','否','一般','否'],
['中年','中','否','好','是'],
['中年','低','否','一般','否'],
['老年','高','否','
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 八年級(jí)歷史下冊(cè) 第二學(xué)習(xí)主題 社會(huì)主義道路的探索 第5課 艱苦創(chuàng)業(yè)的民族脊梁教案 川教版
- 2024學(xué)年九年級(jí)英語(yǔ)上冊(cè) Unit 2 Great People Lesson 7 What Is the Meaning of Life教案(新版)冀教版
- 2024年春八年級(jí)生物下冊(cè) 第7單元 第1章 第1節(jié) 植物的生殖教案 (新版)新人教版
- 2024年五年級(jí)數(shù)學(xué)下冊(cè) 五 分?jǐn)?shù)除法第1課時(shí) 分?jǐn)?shù)除法(一)教案 北師大版
- 八年級(jí)生物上冊(cè) 第四單元 第一章 第一節(jié)花的結(jié)構(gòu)和類(lèi)型教案 (新版)濟(jì)南版
- 2024-2025學(xué)年高中歷史 第三單元 第二次世界大戰(zhàn) 探究活動(dòng)課一 世界大戰(zhàn)的啟示-戰(zhàn)爭(zhēng)給人類(lèi)帶來(lái)了什么(2)教學(xué)教案 新人教版選修3
- 總經(jīng)理聘用合同(2篇)
- 銀行免還款合同(2篇)
- 麻雀人教版課件
- 第13課《唐詩(shī)五首·黃鶴樓》八年級(jí)語(yǔ)文上冊(cè)精講同步課堂(統(tǒng)編版)
- 金融求職自我介紹
- 標(biāo)志設(shè)計(jì)(全套課件88P)
- 2023年高考物理一輪復(fù)習(xí)練習(xí)題:靜電場(chǎng)及其應(yīng)用(含基礎(chǔ)、提升兩套)
- 鋰離子電池行業(yè)發(fā)展趨勢(shì)
- 第十八章 正比例函數(shù)和反比例函數(shù)(5類(lèi)壓軸題專(zhuān)練)
- 單項(xiàng)式乘多項(xiàng)式教案
- 遼寧省大連市中山區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期中化學(xué)試題
- 天津市天津市紅橋區(qū)2024-2025學(xué)年八年級(jí)上學(xué)期10月期中英語(yǔ)試題
- 老舊房子改造合同模板
- 幼兒園實(shí)習(xí)生總結(jié)會(huì)方案
- 2024新人教版七年級(jí)上冊(cè)英語(yǔ)期中作文預(yù)測(cè)及范文
評(píng)論
0/150
提交評(píng)論