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

# 使用 pandas 的 factorize 方法進(jìn)行編碼
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 進(jìn)行歸一化處理
train_X = scaler.fit_transform(train_X)

# 使用 train_X 的歸一化統(tǒng)計(jì)量對 test_X 進(jìn)行歸一化
test_X = scaler.transform(test_X)

加載Iris數(shù)據(jù)集,對類別標(biāo)簽進(jìn)行編碼,劃分訓(xùn)練集和測試集,并對特征進(jìn)行歸一化處理,為接下來構(gòu)建模型做準(zhǔn)備

決策樹模型

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report

# 初始化并訓(xùn)練決策樹模型
clf = DecisionTreeClassifier(random_state=42)
clf.fit(train_X, train_y)

# 預(yù)測
predictions = clf.predict(test_X)

# 輸出分類報(bào)告
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()

這里針對鳶尾花分類任務(wù)訓(xùn)練得到的決策樹,可視化展示了決策樹的“玻璃箱”結(jié)構(gòu),按照慣例,在一個(gè)節(jié)點(diǎn)中滿足條件的子節(jié)點(diǎn)位于左側(cè)分支

解釋:樹的根節(jié)點(diǎn)是通過對”sepal length “特征進(jìn)行條件判定,如果其值小于等于0.233,則進(jìn)入左子樹,否則進(jìn)入右子樹,其它節(jié)點(diǎn)類似,最后的葉節(jié)點(diǎn)表示決策樹的最終分類結(jié)果,每個(gè)葉節(jié)點(diǎn)包含樣本的基尼不純度(gini)和樣本數(shù)量(samples),以及每個(gè)類別的樣本數(shù)量和類別(class)

隨機(jī)森林模型

from sklearn.ensemble import RandomForestClassifier

# 初始化并訓(xùn)練隨機(jī)森林模型
rf_clf = RandomForestClassifier(random_state=42, n_estimators=20)
rf_clf.fit(train_X, train_y)

# 從隨機(jī)森林中提取一棵決策樹
estimator = rf_clf.estimators_[0] # 提取第一棵樹

# 預(yù)測
predictions = rf_clf.predict(test_X)

# 輸出分類報(bào)告
report = classification_report(test_y, predictions, target_names=unique_classes)
print(report)

在隨機(jī)森林中,n_estimators參數(shù)表示隨機(jī)森林中包含的決策樹的數(shù)量,這里為10表示存在10棵決策樹,增加其值通常可以提高模型的預(yù)測性能,因?yàn)楦嗟臉淇梢愿玫夭蹲綌?shù)據(jù)的復(fù)雜模式,性能提升會逐漸減小,但是請?zhí)岱滥P瓦^擬合

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()

這里的可視化為第一棵決策樹,接下來繪制隨機(jī)森林里面的所有決策樹

# 可視化所有提取的決策樹
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('隨機(jī)森林.png')
plt.tight_layout()
plt.show()

這就是這個(gè)隨機(jī)森林存在的20棵決策樹的決策過程,每棵樹都會對輸入樣本進(jìn)行預(yù)測,并根據(jù)多數(shù)投票的結(jié)果來確定最終樣本的分類

文章轉(zhuǎn)自微信公眾號@Python機(jī)器學(xué)習(xí)AI

上一篇:

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

下一篇:

ARIMA與Prophet的完美結(jié)合:AutoARIMAProphet時(shí)序模型

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

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

10個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)