<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          保姆級(jí)隨機(jī)森林算法Python教學(xué)

          共 8738字,需瀏覽 18分鐘

           ·

          2023-09-21 21:44

          點(diǎn)擊下方卡片,關(guān)注“新機(jī)器視覺”公眾號(hào)

          視覺/圖像重磅干貨,第一時(shí)間送達(dá)

          摘要


          機(jī)器學(xué)習(xí)算法是數(shù)據(jù)挖掘、數(shù)據(jù)能力分析和數(shù)學(xué)建模必不可少的一部分,而隨機(jī)森林算法和決策樹算法是其中較為常用的兩種算法,本文將會(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)過初步數(shù)據(jù)清洗和相關(guān)性分析得到初步的特征,并利用決策樹進(jìn)行特征重要性分析,完成二次特征降維,得到'CDRSB_bl', 'PIB_bl', 'FBB_bl'三個(gè)自變量特征,DX_bl為分類特征。



          二、算法原理


          隨機(jī)森林算法是一種機(jī)器學(xué)習(xí)算法,它通過構(gòu)建多棵決策樹并將它們的預(yù)測(cè)結(jié)果結(jié)合起來來預(yù)測(cè)目標(biāo)變量。


          隨機(jī)森林是一種典型的Bagging模型,是基于多種決策樹的分類智能算法。首先,在處理后的數(shù)據(jù)集中進(jìn)行隨機(jī)抽樣,形成n種不同的樣本數(shù)據(jù)集。


          然后,根據(jù)數(shù)據(jù)集構(gòu)建不同的決策樹模型,再將測(cè)試集代入決策樹中,得到分類結(jié)果,最后通過投票進(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ó)際比賽中,可通過調(diào)整其測(cè)試訓(xùn)練比,來進(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è)分類器的好壞、是否適用,離不開模型的評(píng)估,常用的方法就是混淆矩陣和F1-Score,博主建議直接使用F1-Score即可,如果時(shí)間充足,可以使用多種機(jī)器學(xué)習(xí)算法的對(duì)比,說明你選擇隨機(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)


          如何判斷選擇的特征是否需要再次降維,得到的特征重要性非常低,即說明這個(gè)指標(biāo)在該算法分類中不起明顯作用,可將該特征進(jìn)行刪除。


          3.6 將特征重要性可視化


          import matplotlib.pyplot as plt# 畫條形圖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 生成決策樹可視化圖形


          from sklearn.tree import export_graphvizimport 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')


          這里將隨機(jī)森林的算法過程進(jìn)行可視化,一般來說很長(zhǎng),圖片不美觀,可以不放進(jìn)論文里,簡(jiǎn)單說明即可。


          3.8 完整實(shí)現(xiàn)代碼


          from sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import confusion_matrix, classification_report, accuracy_scorefrom sklearn.model_selection import ShuffleSplitimport pandas as pdfrom sklearn.tree import export_graphvizimport graphvizimport 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)# 畫條形圖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ù)將決策樹保存為 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é)論


          對(duì)隨機(jī)森林進(jìn)行Python的實(shí)現(xiàn),并計(jì)算了結(jié)果矩陣、評(píng)估矩陣和準(zhǔn)確率,可支持對(duì)模型的準(zhǔn)確性、適用性、敏感性和穩(wěn)定性進(jìn)行分析。


          并通過對(duì)特征重要性和隨機(jī)森林算法實(shí)現(xiàn)過程的可視化,很好地完成了一趟完整的隨機(jī)森林算法的演示。


          版權(quán)聲明:本文為CSDN博主「小皇的奶黃包」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

          原文鏈接:

          https://blog.csdn.net/m0_61399808/article/details/128251196

          聲明:部分內(nèi)容來源于網(wǎng)絡(luò),僅供讀者學(xué)習(xí)、交流之目的文章版權(quán)歸原作者所有。如有不妥,請(qǐng)聯(lián)系刪除。


          —THE END—

          瀏覽 345
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91嫩草私人成人亚洲影院 | 亚洲精品一区二区无码日本蜜桃 | 男人操女人网站 | 激情电影午夜色导航 | 亚洲欧美日韩高清 |