摘要
機(jī)器學(xué)習(xí)算法是數(shù)據(jù)挖掘、數(shù)據(jù)能力分析和數(shù)學(xué)建模必不可少的一部分,而隨機(jī)森林算法和決策樹(shù)算法是其中較為常用的兩種算法,本文將會(huì)對(duì)隨機(jī)森林算法的Python實(shí)現(xiàn)進(jìn)行保姆級(jí)教學(xué)。
0 緒論
數(shù)據(jù)挖掘和數(shù)學(xué)建模等比賽中,除了算法的實(shí)現(xiàn),還需要對(duì)數(shù)據(jù)進(jìn)行較為合理的預(yù)處理,包括缺失值處理、異常值處理、特征值的特征編碼等等,本文默認(rèn)讀者的數(shù)據(jù)均已完成數(shù)據(jù)預(yù)處理,如有需要,后續(xù)會(huì)將數(shù)據(jù)預(yù)處理的方法也進(jìn)行發(fā)布。
一、材料準(zhǔn)備
Python編譯器:Pycharm社區(qū)版或個(gè)人版等
訓(xùn)練數(shù)據(jù)集:此處使用2022年數(shù)維杯國(guó)際大學(xué)生數(shù)學(xué)建模競(jìng)賽C題的附件數(shù)據(jù)為例。
數(shù)據(jù)處理:經(jīng)過(guò)初步數(shù)據(jù)清洗和相關(guān)性分析得到初步的特征,并利用決策樹(shù)進(jìn)行特征重要性分析,完成二次特征降維,得到'CDRSB_bl', 'PIB_bl', 'FBB_bl'三個(gè)自變量特征,DX_bl為分類特征。
二、算法原理
隨機(jī)森林算法是一種機(jī)器學(xué)習(xí)算法,它通過(guò)構(gòu)建多棵決策樹(shù)并將它們的預(yù)測(cè)結(jié)果結(jié)合起來(lái)來(lái)預(yù)測(cè)目標(biāo)變量。
隨機(jī)森林是一種典型的Bagging模型,是基于多種決策樹(shù)的分類智能算法。首先,在處理后的數(shù)據(jù)集中進(jìn)行隨機(jī)抽樣,形成n種不同的樣本數(shù)據(jù)集。
然后,根據(jù)數(shù)據(jù)集構(gòu)建不同的決策樹(shù)模型,再將測(cè)試集代入決策樹(shù)中,得到分類結(jié)果,最后通過(guò)投票進(jìn)行預(yù)測(cè)分類,具體的流程圖如下圖1所示:
Figure 1 隨機(jī)森林分類流程圖
三、算法Python實(shí)現(xiàn)
3.1 數(shù)據(jù)加載
import pandas as pd # 加載數(shù)據(jù) X = pd.DataFrame(pd.read_excel('DataX.xlsx')).values # 輸入特征 y = pd.DataFrame(pd.read_excel('DataY.xlsx')).values # 目標(biāo)變量
此處將自變量存放在DataX中,因變量存放在DataY中,如需進(jìn)行樣本預(yù)測(cè),可另存一個(gè)文件(格式與DataX一致),在后文predict中進(jìn)行替換。
3.2 創(chuàng)建隨機(jī)森林分類器
from sklearn.ensemble import RandomForestClassifier # 創(chuàng)建隨機(jī)森林分類器 clf = RandomForestClassifier(n_estimators=100)
本文將迭代次數(shù)設(shè)為100
3.3創(chuàng)建ShuffleSplit對(duì)象,用于執(zhí)行自動(dòng)洗牌
from sklearn.model_selection import ShuffleSplit # 創(chuàng)建ShuffleSplit對(duì)象,用于執(zhí)行自動(dòng)洗牌 ss = ShuffleSplit(n_splits=1, train_size=0.7, test_size=0.3, random_state=0)
此處使用70%的樣本數(shù)據(jù)作為訓(xùn)練集,30%的樣本數(shù)據(jù)作為測(cè)試集,如果在國(guó)際比賽中,可通過(guò)調(diào)整其測(cè)試訓(xùn)練比,來(lái)進(jìn)行模型的敏感性和穩(wěn)定性分析。
3.4循環(huán)遍歷每個(gè)拆分,并使用隨機(jī)森林分類器對(duì)每個(gè)拆分進(jìn)行訓(xùn)練和評(píng)估
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score # 循環(huán)遍歷每個(gè)拆分,并使用隨機(jī)森林分類器對(duì)每個(gè)拆分進(jìn)行訓(xùn)練和評(píng)估 for train_index, test_index in ss.split(X, y): X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print("Confusion Matrix:") print(confusion_matrix(y_test, y_pred)) # 輸出分類結(jié)果矩陣 print("Classification Report:") print(classification_report(y_test, y_pred)) # 輸出混淆矩陣 print("Accuracy:") print(accuracy_score(y_test, y_pred)) print(clf.predict(X_train)) # 此處用作預(yù)測(cè),預(yù)測(cè)數(shù)據(jù)可以用另一個(gè)文件導(dǎo)入,格式與DataX相同 print(clf.score(X_test, y_test))
一個(gè)分類器的好壞、是否適用,離不開(kāi)模型的評(píng)估,常用的方法就是混淆矩陣和F1-Score,博主建議直接使用F1-Score即可,如果時(shí)間充足,可以使用多種機(jī)器學(xué)習(xí)算法的對(duì)比,說(shuō)明你選擇隨機(jī)森林或者其他機(jī)器學(xué)習(xí)算法的原因,這是加分項(xiàng)。
此處將結(jié)果矩陣、分類的準(zhǔn)確性、F1-Score值均輸出,可適當(dāng)采用,建議弄成表格放進(jìn)論文里。
3.5 計(jì)算特征重要性
# 計(jì)算特征重要性 importances = clf.feature_importances_ print(importances)
如何判斷選擇的特征是否需要再次降維,得到的特征重要性非常低,即說(shuō)明這個(gè)指標(biāo)在該算法分類中不起明顯作用,可將該特征進(jìn)行刪除。
3.6 將特征重要性可視化
import matplotlib.pyplot as plt # 畫(huà)條形圖 plt.barh(range(len(importances)), importances) # 添加標(biāo)題 plt.title("Feature Importances") feature_names = ['CDRSB_bl', 'PIB_bl', 'FBB_bl'] # 添加特征名稱 plt.yticks(range(len(importances)), feature_names) # 顯示圖像 # plt.show() plt.savefig('feature_importance.png')
對(duì)特征重要性進(jìn)行可視化,可以提高論文的辨識(shí)度,也算是加分項(xiàng),比單純弄成表格的要好。
3.7生成決策樹(shù)可視化圖形
from sklearn.tree import export_graphviz import graphviz # 使用 export_graphviz 函數(shù)將決策樹(shù)保存為 dot 文件 dot_data = export_graphviz(clf.estimators_[0], out_file=None, feature_names=['CDRSB_bl', 'PIB_bl', 'FBB_bl']) # 使用 graphviz 庫(kù)讀取 dot 文件并生成決策樹(shù)可視化圖形 graph = graphviz.Source(dot_data) graph.render('decision_tree')
這里將隨機(jī)森林的算法過(guò)程進(jìn)行可視化,一般來(lái)說(shuō)很長(zhǎng),圖片不美觀,可以不放進(jìn)論文里,簡(jiǎn)單說(shuō)明即可。
3.8 完整實(shí)現(xiàn)代碼
from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import confusion_matrix, classification_report, accuracy_score from sklearn.model_selection import ShuffleSplit import pandas as pd from sklearn.tree import export_graphviz import graphviz import matplotlib.pyplot as plt # 加載數(shù)據(jù) X = pd.DataFrame(pd.read_excel('DataX.xlsx')).values # 輸入特征 y = pd.DataFrame(pd.read_excel('DataY.xlsx')).values # 目標(biāo)變量 # 創(chuàng)建隨機(jī)森林分類器 clf = RandomForestClassifier(n_estimators=100) # 創(chuàng)建ShuffleSplit對(duì)象,用于執(zhí)行自動(dòng)洗牌 ss = ShuffleSplit(n_splits=1, train_size=0.7, test_size=0.3, random_state=0) # 循環(huán)遍歷每個(gè)拆分,并使用隨機(jī)森林分類器對(duì)每個(gè)拆分進(jìn)行訓(xùn)練和評(píng)估 for train_index, test_index in ss.split(X, y): X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print("Confusion Matrix:") print(confusion_matrix(y_test, y_pred)) # 輸出分類結(jié)果矩陣 print("Classification Report:") print(classification_report(y_test, y_pred)) # 輸出混淆矩陣 print("Accuracy:") print(accuracy_score(y_test, y_pred)) print(clf.predict(X_train)) # 此處用作預(yù)測(cè),預(yù)測(cè)數(shù)據(jù)可以用另一個(gè)文件導(dǎo)入,格式與DataX相同 print(clf.score(X_test, y_test)) importances = clf.feature_importances_ # 計(jì)算特征重要性 print(importances) # 畫(huà)條形圖 plt.barh(range(len(importances)), importances) # 添加標(biāo)題 plt.title("Feature Importances") feature_names = ['CDRSB_bl', 'PIB_bl', 'FBB_bl'] # 添加特征名稱 plt.yticks(range(len(importances)), feature_names) # 顯示圖像 # plt.show() plt.savefig('feature_importance.png') # 使用 export_graphviz 函數(shù)將決策樹(shù)保存為 dot 文件 dot_data = export_graphviz(clf.estimators_[0], out_file=None, feature_names=['CDRSB_bl', 'PIB_bl', 'FBB_bl']) # 使用 graphviz 庫(kù)讀取 dot 文件并生成決策樹(shù)可視化圖形 graph = graphviz.Source(dot_data) graph.render('decision_tree')
四、 結(jié)論
對(duì)隨機(jī)森林進(jìn)行Python的實(shí)現(xiàn),并計(jì)算了結(jié)果矩陣、評(píng)估矩陣和準(zhǔn)確率,可支持對(duì)模型的準(zhǔn)確性、適用性、敏感性和穩(wěn)定性進(jìn)行分析。
并通過(guò)對(duì)特征重要性和隨機(jī)森林算法實(shí)現(xiàn)過(guò)程的可視化,很好地完成了一趟完整的隨機(jī)森林算法的演示。
來(lái)源:CSDN博主小皇的奶黃包
審核編輯:湯梓紅
-
算法
+關(guān)注
關(guān)注
23文章
4607瀏覽量
92839 -
編譯器
+關(guān)注
關(guān)注
1文章
1623瀏覽量
49108 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8406瀏覽量
132563 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627
原文標(biāo)題:保姆級(jí)隨機(jī)森林算法Python教學(xué)
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論