df = pd.read_excel('iris.xlsx')

# 使用 pandas 的 factorize 方法進行編碼
encoded_values, unique_classes = pd.factorize(df['class'])
# 將編碼值加入到 DataFrame 中
df['Class_encoded'] = encoded_values

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
train_X, test_X, train_y, test_y = train_test_split(df.iloc[:, 0:4], df['Class_encoded'],
test_size=0.2, random_state=42, stratify=df['Class_encoded'])
# 初始化 MinMaxScaler
scaler = MinMaxScaler()

# 對 train_X 進行歸一化處理
train_X = scaler.fit_transform(train_X)

# 使用 train_X 的歸一化統計量對 test_X 進行歸一化
test_X = scaler.transform(test_X)

加載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棵決策樹的決策過程,每棵樹都會對輸入樣本進行預測,并根據多數投票的結果來確定最終樣本的分類

文章轉自微信公眾號@Python機器學習AI

上一篇:

綜合多種梯度提升模型:LightGBM、XGBoost、CatBoost與NGBoost的集成預測

下一篇:

ARIMA與Prophet的完美結合:AutoARIMAProphet時序模型

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費