機器學(xué)習(xí):決策樹:決策樹剪枝技術(shù)教程_第1頁
機器學(xué)習(xí):決策樹:決策樹剪枝技術(shù)教程_第2頁
機器學(xué)習(xí):決策樹:決策樹剪枝技術(shù)教程_第3頁
機器學(xué)習(xí):決策樹:決策樹剪枝技術(shù)教程_第4頁
機器學(xué)習(xí):決策樹:決策樹剪枝技術(shù)教程_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

機器學(xué)習(xí):決策樹:決策樹剪枝技術(shù)教程1決策樹基礎(chǔ)1.1決策樹的構(gòu)建過程決策樹是一種監(jiān)督學(xué)習(xí)算法,用于分類和回歸任務(wù)。構(gòu)建決策樹的過程主要包括選擇最佳特征進行分裂、遞歸構(gòu)建子樹,直到滿足停止條件。下面通過一個簡單的數(shù)據(jù)集來說明決策樹的構(gòu)建過程。假設(shè)我們有以下數(shù)據(jù)集,用于預(yù)測一個人是否會購買電腦:年齡收入學(xué)生信用等級買電腦青年高否一般否青年高否好否青年中否一般否青年低否一般是青年低是一般是中年高否好是中年高否一般是中年中否好是中年低否一般否老年高否好是老年中否好是老年中是好是老年低否一般否老年低是好是1.1.1代碼示例使用Python的sklearn庫構(gòu)建決策樹:fromsklearn.treeimportDecisionTreeClassifier

fromsklearn.model_selectionimporttrain_test_split

importpandasaspd

#數(shù)據(jù)預(yù)處理

data={'年齡':['青年','青年','青年','青年','青年','中年','中年','中年','中年','老年','老年','老年','老年','老年'],

'收入':['高','高','中','低','低','高','高','中','低','高','中','中','低','低'],

'學(xué)生':['否','否','否','否','是','否','否','否','否','否','否','是','否','是'],

'信用等級':['一般','好','一般','一般','一般','好','一般','好','一般','好','好','好','一般','好'],

'買電腦':['否','否','否','是','是','是','是','是','否','是','是','是','否','是']}

df=pd.DataFrame(data)

#將分類特征轉(zhuǎn)換為數(shù)值特征

df['年齡']=df['年齡'].map({'青年':0,'中年':1,'老年':2})

df['收入']=df['收入'].map({'高':0,'中':1,'低':2})

df['學(xué)生']=df['學(xué)生'].map({'否':0,'是':1})

df['信用等級']=df['信用等級'].map({'一般':0,'好':1})

#分割數(shù)據(jù)集

X=df.drop('買電腦',axis=1)

y=df['買電腦'].map({'否':0,'是':1})

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)

#構(gòu)建決策樹

clf=DecisionTreeClassifier()

clf.fit(X_train,y_train)

#預(yù)測

predictions=clf.predict(X_test)1.2決策樹的分裂準(zhǔn)則決策樹在構(gòu)建過程中,需要選擇最佳特征進行分裂。分裂準(zhǔn)則的選擇對決策樹的性能有重要影響。常見的分裂準(zhǔn)則有:信息增益:基于信息論中的熵概念,選擇使信息增益最大的特征進行分裂。增益率:信息增益的變體,考慮了特征值的個數(shù),避免信息增益偏向于具有更多特征值的特征?;嶂笖?shù):用于度量數(shù)據(jù)集的不純度,選擇使基尼指數(shù)最小的特征進行分裂。1.2.1代碼示例使用不同的分裂準(zhǔn)則構(gòu)建決策樹:#使用信息增益作為分裂準(zhǔn)則

clf_entropy=DecisionTreeClassifier(criterion='entropy')

clf_entropy.fit(X_train,y_train)

#使用基尼指數(shù)作為分裂準(zhǔn)則

clf_gini=DecisionTreeClassifier(criterion='gini')

clf_gini.fit(X_train,y_train)

#比較不同分裂準(zhǔn)則的決策樹性能

predictions_entropy=clf_entropy.predict(X_test)

predictions_gini=clf_gini.predict(X_test)通過比較不同分裂準(zhǔn)則下的決策樹性能,可以理解分裂準(zhǔn)則對決策樹構(gòu)建的影響。在實際應(yīng)用中,選擇合適的分裂準(zhǔn)則可以提高決策樹的準(zhǔn)確性和泛化能力。2剪枝技術(shù)概覽決策樹剪枝技術(shù)是機器學(xué)習(xí)中用于優(yōu)化決策樹模型,防止過擬合的重要手段。通過剪枝,可以減少決策樹的復(fù)雜度,提高模型的泛化能力。剪枝技術(shù)主要分為兩大類:預(yù)剪枝(Pre-pruning)和后剪枝(Post-pruning)。2.1預(yù)剪枝技術(shù)介紹2.1.1原理預(yù)剪枝是在決策樹構(gòu)建過程中,提前停止樹的生長,防止過度細化數(shù)據(jù)。預(yù)剪枝的策略包括但不限于:最小樣本分割:設(shè)置一個節(jié)點分裂時所需的最小樣本數(shù),如果樣本數(shù)低于這個閾值,則停止分裂。最小樣本葉子:設(shè)置一個葉子節(jié)點所需的最小樣本數(shù),如果低于這個閾值,則該節(jié)點不會被進一步分裂。最大深度:限制決策樹的最大深度,超過這個深度則停止分裂。信息增益:如果一個節(jié)點分裂后信息增益低于某個閾值,則停止分裂。2.1.2示例代碼假設(shè)我們使用Python的sklearn庫來構(gòu)建一個決策樹,并應(yīng)用預(yù)剪枝技術(shù):fromsklearn.datasetsimportload_iris

fromsklearn.treeimportDecisionTreeClassifier

fromsklearn.model_selectionimporttrain_test_split

#加載數(shù)據(jù)

data=load_iris()

X=data.data

y=data.target

#劃分訓(xùn)練集和測試集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)

#創(chuàng)建決策樹分類器,設(shè)置預(yù)剪枝參數(shù)

clf=DecisionTreeClassifier(min_samples_split=20,max_depth=3)

#訓(xùn)練模型

clf.fit(X_train,y_train)

#預(yù)測

predictions=clf.predict(X_test)在這個例子中,我們設(shè)置了min_samples_split和max_depth參數(shù)來限制決策樹的生長。min_samples_split參數(shù)確保每個節(jié)點分裂時至少有20個樣本,而max_depth參數(shù)限制了樹的最大深度為3。2.2后剪枝技術(shù)介紹2.2.1原理后剪枝是在決策樹構(gòu)建完成后,從底部開始移除那些對模型泛化能力提升不大的子樹。后剪枝的策略通?;诔杀緩?fù)雜度剪枝(CostComplexityPruning),通過引入一個復(fù)雜度參數(shù)來平衡模型的復(fù)雜度和誤差。2.2.2示例代碼在sklearn中,后剪枝可以通過cost_complexity_pruning_path函數(shù)和DecisionTreeClassifier的ccp_alpha參數(shù)來實現(xiàn):fromsklearn.datasetsimportload_iris

fromsklearn.treeimportDecisionTreeClassifier,plot_tree

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.treeimportcost_complexity_pruning_path

#加載數(shù)據(jù)

data=load_iris()

X=data.data

y=data.target

#劃分訓(xùn)練集和測試集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)

#構(gòu)建決策樹

clf=DecisionTreeClassifier(random_state=0)

path=cost_complexity_pruning_path(clf,X_train,y_train)

#選擇一個ccp_alpha值進行剪枝

ccp_alphas,impurities=path.ccp_alphas,path.impurities

clf=DecisionTreeClassifier(random_state=0,ccp_alpha=0.01)

clf.fit(X_train,y_train)

#可視化決策樹

plot_tree(clf,filled=True)在這個例子中,我們首先構(gòu)建了一個完整的決策樹,然后通過cost_complexity_pruning_path函數(shù)找到一系列的ccp_alpha值。選擇一個合適的ccp_alpha值(例如0.01),然后重新訓(xùn)練模型,實現(xiàn)后剪枝。通過預(yù)剪枝和后剪枝技術(shù),我們可以有效地控制決策樹的復(fù)雜度,避免過擬合,從而提高模型在未知數(shù)據(jù)上的表現(xiàn)。3機器學(xué)習(xí):決策樹:預(yù)剪枝技術(shù)決策樹是一種常用的監(jiān)督學(xué)習(xí)算法,用于分類和回歸任務(wù)。預(yù)剪枝技術(shù)是決策樹構(gòu)建過程中的一種策略,旨在防止過擬合,通過在樹的構(gòu)建過程中限制樹的復(fù)雜度,從而提高模型的泛化能力。3.1設(shè)置節(jié)點分裂的最小樣本數(shù)3.1.1原理在決策樹的構(gòu)建過程中,每個節(jié)點的分裂都是基于節(jié)點中樣本的統(tǒng)計信息進行的。如果一個節(jié)點包含的樣本數(shù)過少,那么基于這些樣本做出的分裂決策可能會過于特定,導(dǎo)致模型在新數(shù)據(jù)上的表現(xiàn)不佳。因此,設(shè)置節(jié)點分裂的最小樣本數(shù)是一種有效的預(yù)剪枝策略,它限制了樹的深度和復(fù)雜度,避免了過擬合。3.1.2內(nèi)容在決策樹算法中,可以設(shè)置一個參數(shù)min_samples_split,表示一個內(nèi)部節(jié)點可以被進一步分裂所需的最小樣本數(shù)。如果一個節(jié)點的樣本數(shù)小于這個閾值,那么該節(jié)點將不再被分裂,成為葉節(jié)點。3.1.2.1示例代碼fromsklearn.datasetsimportload_iris

fromsklearn.treeimportDecisionTreeClassifier

#加載數(shù)據(jù)集

iris=load_iris()

X=iris.data

y=iris.target

#創(chuàng)建決策樹分類器,設(shè)置預(yù)剪枝參數(shù)

clf=DecisionTreeClassifier(min_samples_split=20)

#訓(xùn)練模型

clf.fit(X,y)

#輸出模型的深度,以驗證預(yù)剪枝的效果

print("決策樹深度:",clf.get_depth())3.1.2.2數(shù)據(jù)樣例在上述代碼中,我們使用了sklearn庫中的iris數(shù)據(jù)集,這是一個包含150個樣本,每個樣本有4個特征(萼片長度、萼片寬度、花瓣長度、花瓣寬度)和3個類別(山鳶尾、變色鳶尾、維吉尼亞鳶尾)的多分類數(shù)據(jù)集。3.1.2.3代碼講解加載數(shù)據(jù)集:使用load_iris函數(shù)加載iris數(shù)據(jù)集。創(chuàng)建分類器:實例化DecisionTreeClassifier,并設(shè)置min_samples_split參數(shù)為20,意味著一個節(jié)點至少需要有20個樣本才能被進一步分裂。訓(xùn)練模型:使用fit方法訓(xùn)練模型。輸出樹的深度:使用get_depth方法輸出決策樹的深度,以驗證預(yù)剪枝的效果。3.2限制樹的最大深度3.2.1原理決策樹的深度決定了模型的復(fù)雜度。深度越大,模型越復(fù)雜,但也更容易過擬合。限制樹的最大深度是一種預(yù)剪枝策略,它直接控制了樹的復(fù)雜度,避免了模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)過于完美,而在新數(shù)據(jù)上表現(xiàn)不佳的情況。3.2.2內(nèi)容在決策樹算法中,可以設(shè)置一個參數(shù)max_depth,表示決策樹的最大深度。當(dāng)樹的深度達到這個閾值時,即使節(jié)點的樣本數(shù)足夠,該節(jié)點也不會再被分裂,從而成為葉節(jié)點。3.2.2.1示例代碼fromsklearn.datasetsimportload_iris

fromsklearn.treeimportDecisionTreeClassifier

#加載數(shù)據(jù)集

iris=load_iris()

X=iris.data

y=iris.target

#創(chuàng)建決策樹分類器,設(shè)置預(yù)剪枝參數(shù)

clf=DecisionTreeClassifier(max_depth=3)

#訓(xùn)練模型

clf.fit(X,y)

#輸出模型的深度,以驗證預(yù)剪枝的效果

print("決策樹深度:",clf.get_depth())3.2.2.2數(shù)據(jù)樣例與上一個示例相同,我們使用iris數(shù)據(jù)集作為樣例數(shù)據(jù)。3.2.2.3代碼講解加載數(shù)據(jù)集:使用load_iris函數(shù)加載iris數(shù)據(jù)集。創(chuàng)建分類器:實例化DecisionTreeClassifier,并設(shè)置max_depth參數(shù)為3,意味著決策樹的最大深度為3。訓(xùn)練模型:使用fit方法訓(xùn)練模型。輸出樹的深度:使用get_depth方法輸出決策樹的深度,驗證預(yù)剪枝的效果。通過設(shè)置min_samples_split和max_depth參數(shù),我們可以有效地控制決策樹的復(fù)雜度,避免過擬合,提高模型的泛化能力。這些參數(shù)的選擇通常需要通過交叉驗證等方法進行調(diào)優(yōu),以找到最佳的模型復(fù)雜度。4機器學(xué)習(xí):決策樹:后剪枝技術(shù)4.1基于驗證集的剪枝在構(gòu)建決策樹時,過度復(fù)雜化模型可能會導(dǎo)致過擬合,即模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)極好,但在未見過的數(shù)據(jù)上表現(xiàn)不佳?;隍炞C集的剪枝技術(shù)是一種后剪枝方法,旨在通過評估決策樹在驗證集上的表現(xiàn)來減少過擬合。該方法的基本步驟如下:構(gòu)建完整樹:首先,使用訓(xùn)練數(shù)據(jù)集構(gòu)建一個完全生長的決策樹,不考慮過擬合問題。剪枝:從樹的底部開始,逐個考慮每個非葉節(jié)點。對于每個節(jié)點,評估如果將其轉(zhuǎn)換為葉節(jié)點,決策樹在驗證集上的性能是否提高。如果性能提高或下降不明顯,該節(jié)點將被剪枝,即轉(zhuǎn)換為葉節(jié)點。重復(fù)評估:重復(fù)上述過程,直到樹的頂部,或直到進一步剪枝不再提高驗證集上的性能。4.1.1示例代碼假設(shè)我們使用Python的sklearn庫來實現(xiàn)基于驗證集的剪枝。以下是一個示例代碼,展示了如何使用交叉驗證來評估剪枝的效果:fromsklearn.datasetsimportload_iris

fromsklearn.treeimportDecisionTreeClassifier

fromsklearn.model_selectionimporttrain_test_split,cross_val_score

fromsklearn.metricsimportaccuracy_score

#加載數(shù)據(jù)

data=load_iris()

X=data.data

y=data.target

#劃分?jǐn)?shù)據(jù)集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#構(gòu)建決策樹

clf=DecisionTreeClassifier(max_depth=None)

clf.fit(X_train,y_train)

#使用交叉驗證評估原始樹的性能

original_scores=cross_val_score(clf,X_test,y_test,cv=5)

original_accuracy=original_scores.mean()

print(f"原始樹的平均準(zhǔn)確率:{original_accuracy}")

#剪枝過程(簡化示例,實際中需要更復(fù)雜的邏輯)

#這里我們通過設(shè)置max_depth參數(shù)來模擬剪枝效果

fordepthinrange(1,clf.tree_.max_depth):

clf_pruned=DecisionTreeClassifier(max_depth=depth)

clf_pruned.fit(X_train,y_train)

pruned_scores=cross_val_score(clf_pruned,X_test,y_test,cv=5)

pruned_accuracy=pruned_scores.mean()

print(f"剪枝后樹(深度={depth})的平均準(zhǔn)確率:{pruned_accuracy}")

#選擇最佳剪枝深度

best_depth=max(range(1,clf.tree_.max_depth),key=lambdad:cross_val_score(DecisionTreeClassifier(max_depth=d),X_test,y_test,cv=5).mean())

print(f"最佳剪枝深度:{best_depth}")4.1.2解釋在上述代碼中,我們首先加載了鳶尾花數(shù)據(jù)集并將其劃分為訓(xùn)練集和測試集。然后,我們構(gòu)建了一個沒有深度限制的決策樹,并使用交叉驗證來評估其在測試集上的性能。接下來,我們通過限制樹的最大深度來模擬剪枝過程,再次使用交叉驗證評估每個剪枝版本的性能。最后,我們選擇了在驗證集上表現(xiàn)最佳的樹深度作為剪枝后的決策樹。4.2基于代價復(fù)雜度的剪枝基于代價復(fù)雜度的剪枝(CostComplexityPruning,CCP)是一種更精細的剪枝方法,它通過引入一個代價復(fù)雜度參數(shù)(alpha)來控制決策樹的復(fù)雜度。該參數(shù)決定了樹的復(fù)雜度和模型性能之間的權(quán)衡。當(dāng)alpha值增加時,決策樹的復(fù)雜度降低,從而減少過擬合的風(fēng)險。4.2.1實現(xiàn)原理CCP通過計算每個子樹的代價復(fù)雜度來決定是否剪枝。代價復(fù)雜度由以下公式定義:C其中,CT是子樹T的代價復(fù)雜度,RT是子樹T的誤差(如分類錯誤或回歸誤差),α是代價復(fù)雜度參數(shù),T是子樹4.2.2示例代碼以下是一個使用sklearn庫中的DecisionTreeClassifier實現(xiàn)基于代價復(fù)雜度剪枝的示例代碼:fromsklearn.datasetsimportload_iris

fromsklearn.treeimportDecisionTreeClassifier

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.metricsimportaccuracy_score

#加載數(shù)據(jù)

data=load_iris()

X=data.data

y=data.target

#劃分?jǐn)?shù)據(jù)集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#構(gòu)建決策樹

clf=DecisionTreeClassifier(random_state=42)

path=clf.cost_complexity_pruning_path(X_train,y_train)

ccp_alphas,impurities=path.ccp_alphas,path.impurities

#找到最佳alpha值

clfs=[]

forccp_alphainccp_alphas:

clf=DecisionTreeClassifier(random_state=42,ccp_alpha=ccp_alpha)

clf.fit(X_train,y_train)

clfs.append(clf)

print("Numberofnodesinthelasttreeis:{}withccp_alpha:{}".format(

clfs[-1].tree_.node_count,ccp_alphas[-1]))

#評估不同alpha值下的模型性能

clfs=clfs[:-1]

ccp_alphas=ccp_alphas[:-1]

#記錄準(zhǔn)確率和alpha值

accuracies=[]

forclf,ccp_alphainzip(clfs,ccp_alphas):

y_pred=clf.predict(X_test)

accuracy=accuracy_score(y_test,y_pred)

accuracies.append(accuracy)

print(f"Alpha:{ccp_alpha},Accuracy:{accuracy}")

#選擇最佳alpha值

best_alpha=ccp_alphas[accuracies.index(max(accuracies))]

print(f"最佳alpha值:{best_alpha}")4.2.3解釋在代碼中,我們首先加載了鳶尾花數(shù)據(jù)集并將其劃分為訓(xùn)練集和測試集。然后,我們使用cost_complexity_pruning_path方法來計算一系列可能的alpha值。對于每個alpha值,我們構(gòu)建并訓(xùn)練一個決策樹,然后在測試集上評估其性能。最后,我們選擇了在測試集上表現(xiàn)最佳的alpha值,即產(chǎn)生了最高準(zhǔn)確率的alpha值。通過上述示例,我們可以看到基于驗證集的剪枝和基于代價復(fù)雜度的剪枝如何幫助我們避免決策樹的過擬合,從而提高模型在未見過數(shù)據(jù)上的泛化能力。5決策樹剪枝策略比較5.1預(yù)剪枝與后剪枝的優(yōu)缺點5.1.1預(yù)剪枝預(yù)剪枝(Pre-pruning)是在決策樹構(gòu)建過程中,提前停止樹的生長,防止過擬合。預(yù)剪枝的策略包括但不限于設(shè)置樹的最大深度、節(jié)點的最小樣本數(shù)、信息增益閾值等。5.1.1.1優(yōu)點減少過擬合:通過限制樹的復(fù)雜度,預(yù)剪枝可以有效避免模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)過于優(yōu)秀,而在新數(shù)據(jù)上泛化能力差的問題。提高效率:預(yù)剪枝可以減少決策樹的構(gòu)建時間,因為不需要構(gòu)建完整的樹再進行剪枝,同時也減少了模型的預(yù)測時間。5.1.1.2缺點可能錯過重要特征:預(yù)剪枝策略如果設(shè)置得過于嚴(yán)格,可能會在樹的生長過程中過早地剪掉一些重要的分支,從而影響模型的準(zhǔn)確性。剪枝參數(shù)選擇困難:預(yù)剪枝需要提前設(shè)定剪枝參數(shù),而這些參數(shù)的選擇往往依賴于經(jīng)驗,選擇不當(dāng)可能會導(dǎo)致模型性能不佳。5.1.2后剪枝后剪枝(Post-pruning)是在決策樹構(gòu)建完成后,從葉節(jié)點開始,逐步向上剪掉那些對模型泛化能力提升不大的節(jié)點。后剪枝的策略包括但不限于成本復(fù)雜度剪枝、最小誤差剪枝等。5.1.2.1優(yōu)點更靈活的剪枝:后剪枝允許決策樹先充分生長,再進行剪枝,這樣可以更靈活地決定哪些節(jié)點應(yīng)該被剪掉,哪些應(yīng)該保留。避免過早剪枝:與預(yù)剪枝相比,后剪枝可以避免在樹生長過程中過早地剪掉重要分支,從而可能獲得更準(zhǔn)確的模型。5.1.2.2缺點計算成本高:后剪枝需要構(gòu)建完整的決策樹,然后再進行剪枝,這會增加模型的構(gòu)建時間和計算成本。剪枝過程復(fù)雜:后剪枝的策略往往比預(yù)剪枝更復(fù)雜,需要通過交叉驗證等方法來確定哪些節(jié)點應(yīng)該被剪掉,這增加了模型的調(diào)整難度。5.2剪枝策略的選擇依據(jù)選擇預(yù)剪枝還是后剪枝,主要依據(jù)以下幾點:數(shù)據(jù)集大小:對于較小的數(shù)據(jù)集,預(yù)剪枝可能更合適,因為它可以避免模型過于復(fù)雜。對于較大的數(shù)據(jù)集,后剪枝可能更有效,因為它允許模型先充分學(xué)習(xí)數(shù)據(jù)的復(fù)雜性,再進行剪枝。計算資源:如果計算資源有限,預(yù)剪枝可能更合適,因為它可以減少模型的構(gòu)建時間。如果計算資源充足,后剪枝可以考慮,因為它雖然計算成本高,但可能獲得更好的模型性能。模型復(fù)雜度與泛化能力的權(quán)衡:預(yù)剪枝傾向于構(gòu)建較簡單的模型,這可能有助于提高模型的泛化能力。后剪枝則傾向于構(gòu)建更復(fù)雜的模型,然后再通過剪枝來提高泛化能力。選擇哪種策略,需要根據(jù)具體問題來權(quán)衡模型的復(fù)雜度與泛化能力。5.2.1示例:決策樹預(yù)剪枝與后剪枝的實現(xiàn)5.2.1.1預(yù)剪枝示例fromsklearn.datasetsimportload_iris

fromsklearn.treeimportDecisionTreeClassifier

fromsklearn.model_selectionimporttrain_test_split

#加載數(shù)據(jù)

iris=load_iris()

X=iris.data

y=iris.target

#劃分訓(xùn)練集和測試集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)

#創(chuàng)建決策樹分類器,設(shè)置預(yù)剪枝參數(shù)

clf=DecisionTreeClassifier(max_depth=3,min_samples_split=20)

#訓(xùn)練模型

clf.fit(X_train,y_train)

#預(yù)測并評估模型

score=clf.score(X_test,y_test)

print(f"預(yù)剪枝模型的準(zhǔn)確率:{score}")5.2.1.2后剪枝示例fromsklearn.datasetsimportload_iris

fromsklearn.treeimportDecisionTreeClassifier

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.treeimportexport_text

#加載數(shù)據(jù)

iris=load_iris()

X=iris.data

y=iris.target

#劃分訓(xùn)練集和測試集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)

#創(chuàng)建決策樹分類器,允許樹充分生長

clf=DecisionTreeClassifier(max_depth=None,min_samples_split=2)

#訓(xùn)練模型

clf.fit(X_train,y_train)

#輸出未剪枝的決策樹

print("未剪枝的決策樹:")

print(export_text(clf,feature_names=iris.feature_names))

#進行后剪枝

#注意:sklearn的DecisionTreeClassifier不直接支持后剪枝,這里僅示例未剪枝的決策樹輸出

#后剪枝通常需要自定義實現(xiàn)或使用其他庫如xgboost

#預(yù)測并評估模型

score=clf.score(X_test,y_test)

print(f"未剪枝模型的準(zhǔn)確率:{score}")在上述示例中,我們使用了sklearn庫中的DecisionTreeClassifier來構(gòu)建決策樹模型。預(yù)剪枝示例中,我們通過設(shè)置max_depth和min_samples_split參數(shù)來限制樹的生長。后剪枝示例中,我們允許樹充分生長,然后輸出了決策樹的結(jié)構(gòu)。需要注意的是,sklearn的決策樹分類器不直接支持后剪枝,后剪枝通常需要自定義實現(xiàn)或使用其他庫如xgboost。通過比較預(yù)剪枝和后剪枝模型的準(zhǔn)確率,我們可以根據(jù)具體問題和數(shù)據(jù)集的特性,選擇最適合的剪枝策略。6剪枝在實際應(yīng)用中的案例6.1信用評分系統(tǒng)中的決策樹剪枝在信用評分系統(tǒng)中,決策樹是一種常用模型,用于預(yù)測貸款申請人的信用風(fēng)險。決策樹剪枝技術(shù)可以防止模型過擬合,提高預(yù)測的準(zhǔn)確性和模型的泛化能力。下面,我們將通過一個示例來展示如何在信用評分系統(tǒng)中應(yīng)用決策樹剪枝。6.1.1數(shù)據(jù)樣例假設(shè)我們有以下貸款申請人的數(shù)據(jù):年齡收入婚姻狀況信用評分25低單身030中已婚135高已婚140高單身145中單身0其中,年齡、收入和婚姻狀況是特征,信用評分是目標(biāo)變量,0表示信用風(fēng)險高,1表示信用風(fēng)險低。6.1.2代碼示例我們將使用Python的sklearn庫來構(gòu)建和剪枝決策樹模型。importpandasaspd

fromsklearn.treeimportDecisionTreeClassifier

fromsklearn.model_selectionimporttrain_test_split

fromsklearnimporttree

importmatplotlib.pyplotasplt

#創(chuàng)建數(shù)據(jù)集

data={'年齡':[25,30,35,40,45],

'收入':['低','中','高','高','中'],

'婚姻狀況':['單身','已婚','已婚','單身','單身'],

'信用評分':[0,1,1,1,0]}

df=pd.DataFrame(data)

#將分類特征轉(zhuǎn)換為數(shù)值

df['收入']=df['收入'].map({'低':0,'中':1,'高':2})

df['婚姻狀況']=df['婚姻狀況'].map({'單身':0,'已婚':1})

#分割數(shù)據(jù)集

X=df.drop('信用評分',axis=1)

y=df['信用評分']

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=1)

#構(gòu)建決策樹模型

clf=DecisionTreeClassifier(criterion="entropy",max_depth=3)

clf=clf.fit(X_train,y_train)

#可視化決策樹

fig,ax=plt.subplots(figsize=(12,12))

tree.plot_tree(clf,filled=True,feature_names=X.columns,class_names=['高風(fēng)險','低風(fēng)險'])

plt.show()

#應(yīng)用剪枝

path=clf.cost_complexity_pruning_path(X_train,y_train)

ccp_alphas,impurities=path.ccp_alphas,path.impurities

clfs=[]

forccp_alphainccp_alphas:

clf=DecisionTreeClassifier(random_state=0,ccp_alpha=ccp_alpha)

clf.fit(X_train,y_train)

clfs.append(clf)

print("Numberofnodesinthelasttreeis:{}withccp_alpha:{}".format(

clfs[-1].tree_.node_count,ccp_alphas[-1]))

#選擇最佳剪枝參數(shù)

clfs=clfs[:-1]

ccp_alphas=ccp_alphas[:-1]

train_scores=[clf.score(X_train,y_train)forclfinclfs]

test_scores=[clf.score(X_test,y_test)forclfinclfs]

fig,ax=plt.subplots()

ax.set_xlabel("alpha")

ax.set_ylabel("accuracy")

ax.set_title("Accuracyvsalphafortrainingandtestingsets")

ax.plot(ccp_alphas,train_scores,marker='o',label="train",drawstyle="steps-post")

ax.plot(ccp_alphas,test_scores,marker='o',label="test",drawstyle="steps-post")

ax.legend()

plt.show()

#使用最佳剪枝參數(shù)構(gòu)建模型

best_alpha=ccp_alphas[test_scores.index(max(test_scores))]

clf_pruned=DecisionTreeClassifier(criterion="entropy",ccp_alpha=best_alpha)

clf_pruned.fit(X_train,y_train)

#可視化剪枝后的決策樹

fig,ax=plt.subplots(figsize=(12,12))

tree.plot_tree(clf_pruned,filled=True,feature_names=X.columns,class_names=['高風(fēng)險','低風(fēng)險'])

plt.show()6.1.3解釋數(shù)據(jù)預(yù)處理:將分類特征轉(zhuǎn)換為數(shù)值,以便模型可以處理。模型構(gòu)建:使用DecisionTreeClassifier構(gòu)建決策樹,max_depth參數(shù)限制樹的最大深度,防止過擬合。決策樹可視化:使用tree.plot_tree函數(shù)可視化決策樹,幫助理解模型的決策過程。剪枝過程:通過cost_complexity_pruning_path函數(shù)找到一系列的剪枝參數(shù)ccp_alpha,然后構(gòu)建一系列剪枝后的決策樹。選擇最佳剪枝參數(shù):通過比較訓(xùn)練集和測試集的準(zhǔn)確率,選擇最佳的ccp_alpha值,以達到最佳的泛化能力。模型評估:使用最佳剪枝參數(shù)構(gòu)建的模型進行預(yù)測,并評估模型的性能。6.2醫(yī)療診斷系統(tǒng)中的決策樹剪枝在醫(yī)療診斷系統(tǒng)中,決策樹可以用于預(yù)測疾病的可能性。剪枝技術(shù)可以簡化模型,使其更易于理解和解釋,同時保持良好的預(yù)測性能。6.2.1數(shù)據(jù)樣例假設(shè)我們有以下病人的數(shù)據(jù):年齡性別血壓疾病45男高150女正常055男低060女高165男正常0其中,年齡、性別和血壓是特征,疾病是目標(biāo)變量,1表示有疾病,0表示無疾病。6.2.2代碼示例我們將使用Python的sklearn庫來構(gòu)建和剪枝決策樹模型。importpandasaspd

fromsklearn.treeimportDecisionTreeClassifier

fromsklearn.model_selectionimporttrain_test_split

fromsklearnimporttree

importmatplotlib.pyplotasplt

#創(chuàng)建數(shù)據(jù)集

data={'年齡':[45,50,55,60,65],

'性別':['男','女','男','女','男'],

'血壓':['高','正常','低','高','正常'],

'疾病':[1,0,0,1,0]}

df=pd.DataFrame(data)

#將分類特征轉(zhuǎn)換為數(shù)值

df['性別']=df['性別'].map({'男':0,'女':1})

df['血壓']=df['血壓'].map({'低':0,'正常':1,'高':2})

#分割數(shù)據(jù)集

X=df.drop('疾病',axis=1)

y=df['疾病']

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=1)

#構(gòu)建決策樹模型

clf=DecisionTreeClassifier(criterion="gini",max_depth=3)

clf=clf.fit(X_train,y_train)

#可視化決策樹

fig,ax=plt.subplots(figsize=(12,12))

tree.plot_tree(clf,filled=True,feature_names=X.columns,class_names=['無疾病','有疾病'])

plt.show()

#應(yīng)用剪枝

path=clf.cost_complexity_pruning_path(X_train,y_train)

ccp_alphas,impurities=path.ccp_alphas,path.impurities

clfs=[]

forccp_alphainccp_alphas:

clf=DecisionTreeClassifier(random_state=0,ccp_alpha=ccp_alpha)

clf.fit(X_train,y_train)

clfs.append(clf)

print("Numberofnodesinthelasttreeis:{}withccp_alpha:{}".format(

clfs[-1].tree_.node_count,ccp_alphas[-1]))

#選擇最佳剪枝參數(shù)

clfs=clfs[:-1]

ccp_alphas=ccp_alphas[:-1]

train_scores=[clf.score(X_train,y_train)forclfinclfs]

test_scores=[clf.score(X_test,y_test)forclfinclfs]

fig,ax=plt.subplots()

ax.set_xlabel("alpha")

ax.set_ylabel("accuracy")

ax.set_title("Accuracyvsalphafortrainingandtestingsets")

ax.plot(ccp_alphas,train_scores,marker='o',label="train",drawstyle="steps-post")

ax.plot(ccp_alphas,test_scores,marker='o',label="test",drawstyle="steps-post")

ax.legend()

plt.show()

#使用最佳剪枝參數(shù)構(gòu)建模型

best_alpha=ccp_alphas[test_scores.index(max(test_scores))]

clf_pruned=DecisionTreeClassifier(criterion="gini",ccp_alpha=best_alpha)

clf_pruned.fit(X_train,y_train)

#可視化剪枝后的決策樹

fig,ax=plt.subplots(figsize=(12,12))

tree.plot_tree(clf_pruned,filled=True,feature_names=X.columns,class_names=['無疾病','有疾病'])

plt.show()6.2.3解釋數(shù)據(jù)預(yù)處理:將分類特征轉(zhuǎn)換為數(shù)值,以便模型可以處理。模型構(gòu)建:使用DecisionTreeClassifier構(gòu)建決策樹,max_depth參數(shù)限制樹的最大深度,防止過擬合。決策樹可視化:使用tree.plot_tree函數(shù)可視化決策樹,幫助理解模型的決策過程。剪枝過程:通過cost_complexity_pruning_path函數(shù)找到一系列的剪枝參數(shù)ccp_alpha,然后構(gòu)建一系列剪枝后的決策樹。選擇最佳剪枝參數(shù):通過比較訓(xùn)練集和測試集的準(zhǔn)確率,選擇最佳的ccp_alpha值,以達到最佳的泛化能力。模型評估:使用最佳剪枝參數(shù)構(gòu)建的模型進行預(yù)測,并評估模型的性能。通過這兩個案例,我們可以看到?jīng)Q策樹剪枝技術(shù)在實際應(yīng)用中的重要性,它不僅可以防止模型過擬合,還可以簡化模型,提高模型的解釋性和泛化能力。7決策樹剪枝的高級主題7.1集成學(xué)習(xí)中的決策樹剪枝在集成學(xué)習(xí)中,決策樹剪枝技術(shù)被用來減少單個決策樹的復(fù)雜度,從而降低過擬合的風(fēng)險。集成學(xué)習(xí)通過組合多個學(xué)習(xí)器的預(yù)測來提高模型的準(zhǔn)確性和穩(wěn)定性,其中決策樹是常用的基學(xué)習(xí)器之一。剪枝在集成學(xué)習(xí)中的應(yīng)用,尤其是隨機森林和梯度提升樹中,可以顯著提高模型的泛化能力。7.1.1隨機森林中的剪枝隨機森林由多個決策樹組成,每個樹在訓(xùn)練時使用數(shù)據(jù)集的子集和特征的子集。剪枝在隨機森林中的應(yīng)用通常是在樹的生長過程中進行的,以防止樹過于復(fù)雜。例如,可以設(shè)置樹的最大深度或最小葉節(jié)點樣本數(shù)來控制樹的生長。7.1.1.1示例代碼fromsklearn.ensembleimportRandomForestClassifier

fromsklearn.datasetsimportmake_classification

#生成分類數(shù)據(jù)集

X,y=make_classification(n_samples=1000,n_features=10,n_informative=5,n_redundant=0,random_state=42)

#創(chuàng)建隨機森林分類器,設(shè)置樹的最大深度為5

rf=RandomForestClassifier(max_depth=5,random_state=42)

#訓(xùn)練模型

rf.fit(X,y)

#輸出模型的特征重要性

print(rf.feature_importances_)7.1.2梯度提升樹中的剪枝梯度提升樹(GradientBoostingTrees)通過逐步添加決策樹來構(gòu)建模型,每棵樹專注于糾正前一棵樹的錯誤。剪枝在梯度提升樹中可以通過限制樹的深度、葉子節(jié)點數(shù)或設(shè)置學(xué)習(xí)率來實現(xiàn)。學(xué)習(xí)率控制每棵樹對最終預(yù)測的貢獻,較小的學(xué)習(xí)率可以減少過擬合。7.1.2.1示例代碼fromsklearn.ensembleimportGradientBoostingClassifier

fromsklearn.datasetsimportmake_classification

#生成分類數(shù)據(jù)集

X,y=make_classification(n_samples=1000,n_features=10,n_informative=5,n_redundant=0,random_state=42)

#創(chuàng)建梯度提升樹分類器,設(shè)置樹的最大深度為3,學(xué)習(xí)率為0.1

gb=GradientBoostingClassifier(max_depth=3,learning_rate=0.1,random_state=42)

#訓(xùn)練模型

gb.fit(X,y)

#輸出模型的特征重要性

print(gb.feature_importances_)7.2自適應(yīng)剪枝策略自適應(yīng)剪枝策略是一種動態(tài)調(diào)整決策樹剪枝程度的方法,它根據(jù)樹的性能和數(shù)據(jù)的特性來決定剪枝的強度。這種策略可以更有效地平衡模型的復(fù)雜度和泛化能力,避免一刀切的剪枝方法可能帶來的問題。7.2.1自適應(yīng)預(yù)剪枝預(yù)剪枝是在樹的生長過程中進行的,自適應(yīng)預(yù)剪枝通過監(jiān)測樹的性能指標(biāo)(如準(zhǔn)確率或AUC值)來決定是否繼續(xù)生長某個節(jié)點。如果繼續(xù)生長不會顯著提高模型性能,該節(jié)點將被剪枝。7.2.2自適應(yīng)后剪枝后剪枝是在樹完全生長后進行的,自適應(yīng)后剪枝通過交叉驗證來評估剪枝的效果。它會嘗試剪枝不同的節(jié)點,然后評估剪枝后模型的性能,選擇最佳的剪枝方案。7.2.2.1示例代碼自適應(yīng)剪枝策略通常在模型庫中沒有直接的參數(shù)控制,需要通過自定義函數(shù)或調(diào)整模型參數(shù)來實現(xiàn)。以下是一個使用交叉驗證進行自適應(yīng)后剪枝的簡化示例:fromsklearn.treeimportDecisionTreeClassifier

fromsklearn.model_selectionimportcross_val_score

fromsklearn.datasetsimportload_iris

#加載鳶尾花數(shù)據(jù)集

iris=load_iris()

X,y=iris.data,iris.target

#創(chuàng)建決策樹分類器

dt=DecisionTreeClassifier(random_state=42)

#使用交叉驗證評估模型性能

scores=cross_val_score(dt,X,y,cv=5)

#輸出交叉驗證的平均準(zhǔn)確率

print("Cross-validatedaccuracy:",scores.mean())

#假設(shè)我們有一個自定義的剪枝函數(shù),根據(jù)交叉驗證結(jié)果調(diào)整樹的復(fù)雜度

defadaptive_prune(tree,X,y,cv=5):

#訓(xùn)練模型

tree.fit(X,y)

#初始準(zhǔn)確率

initial_score=cross_val_score(tree,X,y,cv=cv).mean()

#嘗試剪枝不同的節(jié)點

#這里簡化為嘗試不同的最大深度

fordepthinrange(1,tree.get_depth()):

tree.set_params(max_depth=depth)

score=cross_val_score(tree,X,y,cv=cv).mean()

#如果剪枝后的準(zhǔn)確率沒有顯著下降,更新模型

ifscore>=initial_score-0.01:

initial_score=score

tree.set_params(max_depth=depth)

else:

break

#創(chuàng)建一個決策樹分類器實例

dt=DecisionTreeClassifier(random_state=42)

#應(yīng)用自適應(yīng)剪枝

adaptive_prune(dt,X,y)

#輸出剪枝后的模型性能

print("Prunedtreeaccuracy:",cross_val_score(dt,X,y

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論