加載Iris數據集,對類別標簽進行編碼,劃分訓練集和測試集,并對特征進行歸一化處理,為接下來構建模型做準備
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
# 初始化并訓練決策樹模型
clf = DecisionTreeClassifier(random_state=42)
clf.fit(train_X, train_y)
# 預測
predictions = clf.predict(test_X)
# 輸出分類報告
report = classification_report(test_y, predictions, target_names=unique_classes)
print(report)
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
# 可視化決策樹
plt.figure(figsize=(20, 20), dpi=200)
plot_tree(
clf,
feature_names=df.columns[0:4], # 使用 df 的列名作為特征名稱
class_names=unique_classes,
filled=True
)
plt.savefig('決策樹.png')
plt.show()
這里針對鳶尾花分類任務訓練得到的決策樹,可視化展示了決策樹的“玻璃箱”結構,按照慣例,在一個節點中滿足條件的子節點位于左側分支
解釋:樹的根節點是通過對”sepal length “特征進行條件判定,如果其值小于等于0.233,則進入左子樹,否則進入右子樹,其它節點類似,最后的葉節點表示決策樹的最終分類結果,每個葉節點包含樣本的基尼不純度(gini)和樣本數量(samples),以及每個類別的樣本數量和類別(class)
from sklearn.ensemble import RandomForestClassifier
# 初始化并訓練隨機森林模型
rf_clf = RandomForestClassifier(random_state=42, n_estimators=20)
rf_clf.fit(train_X, train_y)
# 從隨機森林中提取一棵決策樹
estimator = rf_clf.estimators_[0] # 提取第一棵樹
# 預測
predictions = rf_clf.predict(test_X)
# 輸出分類報告
report = classification_report(test_y, predictions, target_names=unique_classes)
print(report)
在隨機森林中,n_estimators參數表示隨機森林中包含的決策樹的數量,這里為10表示存在10棵決策樹,增加其值通常可以提高模型的預測性能,因為更多的樹可以更好地捕捉數據的復雜模式,性能提升會逐漸減小,但是請提防模型過擬合
plt.figure(figsize=(20, 20), dpi=200)
plot_tree(
estimator,
feature_names=df.columns[0:4], # 使用 df 的列名作為特征名稱
class_names=unique_classes,
filled=True
)
plt.show()
這里的可視化為第一棵決策樹,接下來繪制隨機森林里面的所有決策樹
# 可視化所有提取的決策樹
fig, axes = plt.subplots(nrows=5, ncols=4, figsize=(40, 50), dpi=200)
for i in range(20):
ax = axes[i // 4, i % 4]
plot_tree(
rf_clf.estimators_[i],
feature_names=df.columns[0:7], # 使用 df 的列名作為特征名稱
class_names=unique_classes,
filled=True,
ax=ax
)
ax.set_title(f'Tree {i+1}')
plt.savefig('隨機森林.png')
plt.tight_layout()
plt.show()
這就是這個隨機森林存在的20棵決策樹的決策過程,每棵樹都會對輸入樣本進行預測,并根據多數投票的結果來確定最終樣本的分類