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