摘要
機器學(xué)習算法是數(shù)據(jù)挖掘、數(shù)據(jù)能力分析和數(shù)學(xué)建模必不可少的一部分,而隨機森林算法和決策樹算法是其中較為常用的兩種算法,本文將會對隨機森林算法的Python實現(xiàn)進行保姆級教學(xué)。
0 緒論
數(shù)據(jù)挖掘和數(shù)學(xué)建模等比賽中,除了算法的實現(xiàn),還需要對數(shù)據(jù)進行較為合理的預(yù)處理,包括缺失值處理、異常值處理、特征值的特征編碼等等,本文默認讀者的數(shù)據(jù)均已完成數(shù)據(jù)預(yù)處理,如有需要,后續(xù)會將數(shù)據(jù)預(yù)處理的方法也進行發(fā)布。
一、材料準備
Python編譯器:Pycharm社區(qū)版或個人版等
訓(xùn)練數(shù)據(jù)集:此處使用2022年數(shù)維杯國際大學(xué)生數(shù)學(xué)建模競賽C題的附件數(shù)據(jù)為例。
數(shù)據(jù)處理:經(jīng)過初步數(shù)據(jù)清洗和相關(guān)性分析得到初步的特征,并利用決策樹進行特征重要性分析,完成二次特征降維,得到'CDRSB_bl', 'PIB_bl', 'FBB_bl'三個自變量特征,DX_bl為分類特征。
二、算法原理
隨機森林算法是一種機器學(xué)習算法,它通過構(gòu)建多棵決策樹并將它們的預(yù)測結(jié)果結(jié)合起來來預(yù)測目標變量。
隨機森林是一種典型的Bagging模型,是基于多種決策樹的分類智能算法。首先,在處理后的數(shù)據(jù)集中進行隨機抽樣,形成n種不同的樣本數(shù)據(jù)集。
然后,根據(jù)數(shù)據(jù)集構(gòu)建不同的決策樹模型,再將測試集代入決策樹中,得到分類結(jié)果,最后通過投票進行預(yù)測分類,具體的流程圖如下圖1所示:
Figure 1 隨機森林分類流程圖
三、算法Python實現(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 # 目標變量
此處將自變量存放在DataX中,因變量存放在DataY中,如需進行樣本預(yù)測,可另存一個文件(格式與DataX一致),在后文predict中進行替換。
3.2 創(chuàng)建隨機森林分類器
from sklearn.ensemble import RandomForestClassifier # 創(chuàng)建隨機森林分類器 clf = RandomForestClassifier(n_estimators=100)
本文將迭代次數(shù)設(shè)為100
3.3創(chuàng)建ShuffleSplit對象,用于執(zhí)行自動洗牌
from sklearn.model_selection import ShuffleSplit # 創(chuàng)建ShuffleSplit對象,用于執(zhí)行自動洗牌 ss = ShuffleSplit(n_splits=1, train_size=0.7, test_size=0.3, random_state=0)
此處使用70%的樣本數(shù)據(jù)作為訓(xùn)練集,30%的樣本數(shù)據(jù)作為測試集,如果在國際比賽中,可通過調(diào)整其測試訓(xùn)練比,來進行模型的敏感性和穩(wěn)定性分析。
3.4循環(huán)遍歷每個拆分,并使用隨機森林分類器對每個拆分進行訓(xùn)練和評估
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score # 循環(huán)遍歷每個拆分,并使用隨機森林分類器對每個拆分進行訓(xùn)練和評估 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ù)測,預(yù)測數(shù)據(jù)可以用另一個文件導(dǎo)入,格式與DataX相同 print(clf.score(X_test, y_test))
一個分類器的好壞、是否適用,離不開模型的評估,常用的方法就是混淆矩陣和F1-Score,博主建議直接使用F1-Score即可,如果時間充足,可以使用多種機器學(xué)習算法的對比,說明你選擇隨機森林或者其他機器學(xué)習算法的原因,這是加分項。
此處將結(jié)果矩陣、分類的準確性、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 函數(shù)將決策樹保存為 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 完整實現(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 # 目標變量 # 創(chuàng)建隨機森林分類器 clf = RandomForestClassifier(n_estimators=100) # 創(chuàng)建ShuffleSplit對象,用于執(zhí)行自動洗牌 ss = ShuffleSplit(n_splits=1, train_size=0.7, test_size=0.3, random_state=0) # 循環(huán)遍歷每個拆分,并使用隨機森林分類器對每個拆分進行訓(xùn)練和評估 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ù)測,預(yù)測數(shù)據(jù)可以用另一個文件導(dǎo)入,格式與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 函數(shù)將決策樹保存為 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')
四、 結(jié)論
對隨機森林進行Python的實現(xiàn),并計算了結(jié)果矩陣、評估矩陣和準確率,可支持對模型的準確性、適用性、敏感性和穩(wěn)定性進行分析。
并通過對特征重要性和隨機森林算法實現(xiàn)過程的可視化,很好地完成了一趟完整的隨機森林算法的演示。
來源:CSDN博主小皇的奶黃包
審核編輯:湯梓紅
-
算法
+關(guān)注
關(guān)注
23文章
4607瀏覽量
92828 -
編譯器
+關(guān)注
關(guān)注
1文章
1623瀏覽量
49108 -
機器學(xué)習
+關(guān)注
關(guān)注
66文章
8406瀏覽量
132558 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627
原文標題:保姆級隨機森林算法Python教學(xué)
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論