24.12.06
實(shí)驗(yàn)三:C4.5(帶有預(yù)剪枝和后剪枝)算法實(shí)現(xiàn)與測試
一、實(shí)驗(yàn)?zāi)康?/p>
深入理解決策樹、預(yù)剪枝和后剪枝的算法原理,能夠使用Python語言實(shí)現(xiàn)帶有預(yù)剪枝 和后剪枝的決策樹算法C4.5算法的訓(xùn)練與測試,并且使用五折交叉驗(yàn)證算法進(jìn)行模型訓(xùn)練 與評估。
二、實(shí)驗(yàn)內(nèi)容
(1)從scikit-learn 庫中加載 iris 數(shù)據(jù)集,使用留出法留出 1/3 的樣本作為測試集(注 意同分布取樣);
(2)使用訓(xùn)練集訓(xùn)練分類帶有預(yù)剪枝和后剪枝的C4.5算法;
(3)使用五折交叉驗(yàn)證對模型性能(準(zhǔn)確度、精度、召回率和 F1 值)進(jìn)行評估和選 擇;
(4)使用測試集,測試模型的性能,對測試結(jié)果進(jìn)行分析,完成實(shí)驗(yàn)報(bào)告中實(shí)驗(yàn)三的 部分。
三、算法步驟、代碼、及結(jié)果
1. 算法偽代碼
1. 導(dǎo)入必要的庫
- 從 sklearn.datasets 導(dǎo)入 load_iris
- 從 sklearn.model_selection 導(dǎo)入 train_test_split 和 cross_val_score
- 從 sklearn.tree 導(dǎo)入 DecisionTreeClassifier
- 從 sklearn.metrics 導(dǎo)入 accuracy_score, precision_score, recall_score, f1_score
2. 加載數(shù)據(jù)集并拆分
- 加載 iris 數(shù)據(jù)集 (X, y)
- 使用 train_test_split 將數(shù)據(jù)集按 2:1 比例分為訓(xùn)練集 (X_train, y_train) 和測試集 (X_test, y_test),確保 stratify=y 以保證標(biāo)簽分布一致
3. 定義 C4.5 決策樹模型(模擬預(yù)剪枝)
- 初始化 DecisionTreeClassifier
- max_depth: 設(shè)置決策樹的最大深度
- min_samples_split: 設(shè)置內(nèi)部節(jié)點(diǎn)劃分所需的最小樣本數(shù)
- min_samples_leaf: 設(shè)置葉節(jié)點(diǎn)的最小樣本數(shù)
4. 使用訓(xùn)練集訓(xùn)練模型
- 使用 X_train 和 y_train 擬合模型
5. 五折交叉驗(yàn)證
- 使用 cross_val_score 對模型進(jìn)行五折交叉驗(yàn)證,分別計(jì)算
- 準(zhǔn)確度
- 精度
- 召回率
- F1 值
- 記錄每個(gè)指標(biāo)的平均值
6. 在測試集上評估模型性能
- 使用 X_test 進(jìn)行預(yù)測,得到預(yù)測值 y_pred
- 計(jì)算以下評估指標(biāo):
- 準(zhǔn)確度 (accuracy_score)
- 精度 (precision_score)
- 召回率 (recall_score)
- F1 值 (f1_score)
7. 分析模型在五折交叉驗(yàn)證和測試集上的性能差異
2. 算法主要代碼
完整源代碼\調(diào)用庫方法(函數(shù)參數(shù)說明)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 1. 加載數(shù)據(jù)集
iris = load_iris()
X = iris.data
y = iris.target
# 2. 數(shù)據(jù)集拆分:訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, stratify=y, random_state=42)
# 3. 初始化決策樹模型,模擬 C4.5 預(yù)剪枝
model = DecisionTreeClassifier(
criterion='entropy', # 使用信息增益率,模擬 C4.5
max_depth=5, # 限制最大深度
min_samples_split=4, # 每個(gè)節(jié)點(diǎn)最少樣本數(shù)
min_samples_leaf=2 # 葉子節(jié)點(diǎn)最少樣本數(shù)
)
# 4. 訓(xùn)練模型
model.fit(X_train, y_train)
# 5. 五折交叉驗(yàn)證
accuracy_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
precision_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='precision_macro')
recall_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='recall_macro')
f1_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='f1_macro')
print(f"五折交叉驗(yàn)證結(jié)果:")
print(f"準(zhǔn)確度:{accuracy_scores.mean():.4f}")
print(f"精度:{precision_scores.mean():.4f}")
print(f"召回率:{recall_scores.mean():.4f}")
print(f"F1值:{f1_scores.mean():.4f}")
# 6. 在測試集上評估
y_pred = model.predict(X_test)
test_accuracy = accuracy_score(y_test, y_pred)
test_precision = precision_score(y_test, y_pred, average='macro')
test_recall = recall_score(y_test, y_pred, average='macro')
test_f1 = f1_score(y_test, y_pred, average='macro')
print(f"測試集性能:")
print(f"準(zhǔn)確度:{test_accuracy:.4f}")
print(f"精度:{test_precision:.4f}")
print(f"召回率:{test_recall:.4f}")
1. criterion
- 作用:指定用于劃分的評價(jià)準(zhǔn)則。
- 取值:
'gini':使用基尼系數(shù)(Gini impurity)作為劃分標(biāo)準(zhǔn)。'entropy':使用信息增益(entropy)作為劃分標(biāo)準(zhǔn),類似于 C4.5。- 默認(rèn)值:
'gini' - 作用:指定節(jié)點(diǎn)劃分策略。
- 取值:
'best':在所有特征中選擇最優(yōu)劃分。'random':在隨機(jī)特征子集中選擇最優(yōu)劃分。- 默認(rèn)值:
'best' - 作用:控制樹的最大深度,用于預(yù)剪枝,防止過擬合。
- 取值:正整數(shù)或
None。 None表示樹的深度不限制。- 默認(rèn)值:
None - 作用:控制一個(gè)節(jié)點(diǎn)分裂所需的最小樣本數(shù),用于預(yù)剪枝。
- 取值:整數(shù)或浮點(diǎn)數(shù)。
- 如果是整數(shù),表示最小樣本數(shù)。
- 如果是浮點(diǎn)數(shù),表示總樣本數(shù)的某一比例。
- 默認(rèn)值:
2 - 作用:葉節(jié)點(diǎn)上最少樣本數(shù),用于預(yù)剪枝。
- 取值:整數(shù)或浮點(diǎn)數(shù)。
- 如果是整數(shù),表示葉節(jié)點(diǎn)最小樣本數(shù)。
- 如果是浮點(diǎn)數(shù),表示葉節(jié)點(diǎn)中樣本占總樣本數(shù)的比例。
- 默認(rèn)值:
1 - 作用:葉節(jié)點(diǎn)中樣本權(quán)重的最小占比,用于預(yù)剪枝。
- 取值:浮點(diǎn)數(shù),范圍
[0, 0.5]。 - 默認(rèn)值:
0.0 - 作用:用于分裂的最大特征數(shù)。
- 取值:
- 整數(shù):指定的特征數(shù)。
- 浮點(diǎn)數(shù):特征占總特征數(shù)的比例。
'auto':選擇所有特征。'sqrt':選擇sqrt(n_features)個(gè)特征。'log2':選擇log2(n_features)個(gè)特征。None:使用所有特征。- 默認(rèn)值:
None - 作用:控制隨機(jī)數(shù)生成,以保證結(jié)果的可重復(fù)性。
- 取值:整數(shù)或
None。 - 默認(rèn)值:
None - 作用:限制最大葉節(jié)點(diǎn)數(shù),用于預(yù)剪枝。
- 取值:正整數(shù)或
None。 None表示不限制葉節(jié)點(diǎn)數(shù)。- 默認(rèn)值:
None - 作用:控制分裂節(jié)點(diǎn)時(shí)的最小不純度下降。
- 取值:浮點(diǎn)數(shù),范圍
>=0。 - 默認(rèn)值:
0.0 - 作用:指定類別權(quán)重,用于處理類別不平衡問題。
- 取值:
None:不調(diào)整類別權(quán)重。'balanced':根據(jù)樣本數(shù)自動(dòng)調(diào)整權(quán)重,使每個(gè)類別的權(quán)重與其樣本數(shù)成反比。- 字典形式:自定義類別權(quán)重。
- 默認(rèn)值:
None - 作用:用于后剪枝(代價(jià)復(fù)雜度剪枝)。
- 取值:非負(fù)浮點(diǎn)數(shù)。
- 默認(rèn)值:
0.0
2. splitter
3. max_depth
4. min_samples_split
5. min_samples_leaf
6. min_weight_fraction_leaf
7. max_features
8. random_state
9. max_leaf_nodes
10. min_impurity_decrease
11. class_weight
12. ccp_alpha (剪枝參數(shù))
3. 訓(xùn)練結(jié)果截圖(包括:準(zhǔn)確率、精度(查準(zhǔn)率)、召回率(查全率)、F1)

四、實(shí)驗(yàn)結(jié)果分析
1. 測試結(jié)果截圖(包括:準(zhǔn)確率、精度(查準(zhǔn)率)、召回率(查全率)、F1)

2. 對比分析
1. 準(zhǔn)確度 (Accuracy)
五折交叉驗(yàn)證:0.9300
測試集:0.8600
分析:準(zhǔn)確度從五折交叉驗(yàn)證的 93% 下降到測試集的 86%,這是一個(gè)顯著的差距。五折交叉驗(yàn)證是在訓(xùn)練集上進(jìn)行的,而測試集是新的數(shù)據(jù)集,因此測試集的表現(xiàn)下降說明模型可能存在一定的過擬合。雖然模型在訓(xùn)練集上表現(xiàn)較好,但在測試集上預(yù)測效果有所下降。
2. 精度 (Precision)
五折交叉驗(yàn)證:0.9384
測試集:0.8690
分析:精度從 93.84% 下降到 86.90%。精度度量的是模型預(yù)測的正類中有多少是真正的正類,精度下降表明在測試集中,模型的錯(cuò)誤正類預(yù)測數(shù)量有所增加。該結(jié)果進(jìn)一步支持了模型在新數(shù)據(jù)上的泛化性能不如訓(xùn)練集的結(jié)論。
3. 召回率 (Recall)
五折交叉驗(yàn)證:0.9302
測試集:0.8627
分析:召回率從 93.02% 降低到 86.27%。召回率表示在所有正類中,模型識(shí)別了多少個(gè)正類。召回率下降意味著在測試集上,模型對正類的識(shí)別率有所下降。這表明模型在測試集上的泛化性能有一定的不足,導(dǎo)致其無法捕獲盡可能多的正類樣本。
4. F1 值
五折交叉驗(yàn)證:0.9384
測試集:0.8617
分析:F1 值從 93.84% 下降到 86.17%,表明模型在測試集上整體的分類能力有所減弱。F1 值結(jié)合了精度和召回率,下降幅度與精度和召回率的下降幅度一致,進(jìn)一步驗(yàn)證了測試集上表現(xiàn)的下降。
總結(jié)
泛化能力不足:模型在五折交叉驗(yàn)證中的表現(xiàn)優(yōu)于在測試集上的表現(xiàn),這表明模型在訓(xùn)練集上可能出現(xiàn)了過擬合,導(dǎo)致泛化到新數(shù)據(jù)的能力不強(qiáng)。
posted on 2024-12-06 18:18 Daniel350 閱讀(25) 評論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)