森林算法詳解——基于垃圾郵件分類案例)
一、從決策樹到隨機(jī)森林在前面的決策樹學(xué)習(xí)中我們了解到?jīng)Q策樹是一種比較直觀的分類算法。它通過(guò)不斷尋找合適的特征對(duì)數(shù)據(jù)進(jìn)行劃分最終得到分類結(jié)果。例如垃圾郵件識(shí)別問(wèn)題一封郵件可能包含單詞出現(xiàn)次數(shù)特殊字符比例大寫字母數(shù)量鏈接數(shù)量決策樹會(huì)根據(jù)這些特征建立判斷規(guī)則。但是在實(shí)際使用過(guò)程中單棵決策樹也存在一些問(wèn)題。例如如果樹的深度過(guò)大模型可能會(huì)把訓(xùn)練數(shù)據(jù)中的一些特殊情況也學(xué)習(xí)進(jìn)去。訓(xùn)練集效果很好準(zhǔn)確率98%但是換一批新數(shù)據(jù)準(zhǔn)確率75%這種情況就是過(guò)擬合。為了提高模型穩(wěn)定性機(jī)器學(xué)習(xí)中提出了一種思想不使用一棵樹進(jìn)行判斷而是訓(xùn)練多棵樹讓它們共同決定結(jié)果。這就是隨機(jī)森林。二、隨機(jī)森林基本思想隨機(jī)森林Random Forest是一種集成學(xué)習(xí)方法。簡(jiǎn)單來(lái)說(shuō)它由很多棵決策樹組成。每棵樹都會(huì)獨(dú)立進(jìn)行訓(xùn)練最后通過(guò)投票方式確定分類結(jié)果。例如預(yù)測(cè)一封郵件是否為垃圾郵件決策樹預(yù)測(cè)結(jié)果樹1垃圾郵件樹2垃圾郵件樹3正常郵件樹4垃圾郵件樹5正常郵件其中3棵樹認(rèn)為是垃圾郵件。最終結(jié)果垃圾郵件相比單棵樹多個(gè)模型共同判斷可以減少偶然因素帶來(lái)的影響。三、隨機(jī)森林為什么叫“隨機(jī)”隨機(jī)森林中的隨機(jī)主要體現(xiàn)在兩個(gè)方面1. 數(shù)據(jù)隨機(jī)訓(xùn)練每棵樹時(shí)并不是直接使用全部數(shù)據(jù)。而是通過(guò)Bootstrap方法隨機(jī)抽取數(shù)據(jù)。例如原始數(shù)據(jù)4600封郵件生成數(shù)據(jù)集1 → 訓(xùn)練樹1 數(shù)據(jù)集2 → 訓(xùn)練樹2 數(shù)據(jù)集3 → 訓(xùn)練樹3由于每棵樹看到的數(shù)據(jù)不同所以最終形成的樹結(jié)構(gòu)也不同。2. 特征隨機(jī)除了數(shù)據(jù)不同之外每棵樹使用的特征也不是完全一樣。例如郵件數(shù)據(jù)共有100個(gè)特征。訓(xùn)練第一棵樹隨機(jī)選擇50個(gè)特征。訓(xùn)練第二棵樹重新選擇另外50個(gè)特征。這樣可以避免所有樹都關(guān)注相同特征提高模型差異性。四、隨機(jī)森林訓(xùn)練過(guò)程隨機(jī)森林訓(xùn)練主要分為以下幾個(gè)步驟。第一步隨機(jī)抽取訓(xùn)練數(shù)據(jù)通過(guò)Bootstrap采樣生成多個(gè)訓(xùn)練集。例如原始數(shù)據(jù) | 數(shù)據(jù)集A 數(shù)據(jù)集B 數(shù)據(jù)集C第二步訓(xùn)練決策樹每個(gè)數(shù)據(jù)集訓(xùn)練一棵決策樹。例如數(shù)據(jù)集A → 決策樹1 數(shù)據(jù)集B → 決策樹2 數(shù)據(jù)集C → 決策樹3第三步隨機(jī)選擇特征每棵樹訓(xùn)練過(guò)程中只使用部分特征。這樣可以增加不同樹之間的差異。第四步綜合預(yù)測(cè)結(jié)果分類任務(wù)采用多數(shù)投票。回歸任務(wù)采用平均值。五、垃圾郵件分類案例介紹本實(shí)驗(yàn)使用spambase.csv數(shù)據(jù)集完成垃圾郵件分類。目標(biāo)根據(jù)郵件特征判斷0正常郵件 1垃圾郵件郵件特征包括單詞出現(xiàn)頻率字符出現(xiàn)頻率大寫字母長(zhǎng)度特殊符號(hào)比例例如垃圾郵件通常包含大量促銷詞大量鏈接特殊字符這些特征可以幫助模型進(jìn)行判斷。六、數(shù)據(jù)讀取與劃分讀取數(shù)據(jù)df pd.read_csv(spambase.csv)劃分特征x df.iloc[:, :-1] y df.iloc[:, -1]其中x表示郵件特征。例如單詞頻率 字符比例 數(shù)字?jǐn)?shù)量y表示類別標(biāo)簽是否垃圾郵件劃分訓(xùn)練集和測(cè)試集x_train, x_test, y_train, y_test train_test_split( x, y, test_size0.2, random_state100 )數(shù)據(jù)比例訓(xùn)練集80% 測(cè)試集20%訓(xùn)練集用于學(xué)習(xí)規(guī)律。測(cè)試集用于驗(yàn)證模型效果。七、隨機(jī)森林模型建立代碼from sklearn.ensemble import RandomForestClassifier rf RandomForestClassifier( n_estimators150, max_features0.5, random_state0 )創(chuàng)建隨機(jī)森林分類模型。八、隨機(jī)森林參數(shù)分析1.n_estimators表示森林中決策樹數(shù)量。代碼n_estimators150表示建立150棵決策樹。樹數(shù)量增加優(yōu)點(diǎn)模型更加穩(wěn)定預(yù)測(cè)結(jié)果波動(dòng)降低缺點(diǎn)訓(xùn)練時(shí)間增加內(nèi)存占用提高實(shí)際應(yīng)用中需要根據(jù)數(shù)據(jù)規(guī)模調(diào)整。2.max_features表示每棵樹隨機(jī)選擇的特征比例。代碼max_features0.5表示每棵樹使用50%的特征。例如100個(gè)特征每棵樹隨機(jī)選擇50個(gè)。這樣可以提高樹之間的差異。3.max_depth控制樹的最大深度。如果不限制樹可能不斷分裂。導(dǎo)致模型復(fù)雜度過(guò)高容易過(guò)擬合。因此需要合理設(shè)置深度。九、交叉驗(yàn)證評(píng)價(jià)模型單次訓(xùn)練測(cè)試可能存在偶然性。例如一次劃分準(zhǔn)確率90%換一次劃分準(zhǔn)確率85%因此采用交叉驗(yàn)證提高評(píng)價(jià)可靠性。代碼StratifiedKFold( n_splits5 )五折交叉驗(yàn)證過(guò)程第一次 第1份測(cè)試其余訓(xùn)練 第二次 第2份測(cè)試其余訓(xùn)練 ... 第五次 第5份測(cè)試其余訓(xùn)練最后計(jì)算平均準(zhǔn)確率。十、隨機(jī)森林參數(shù)優(yōu)化隨機(jī)森林默認(rèn)參數(shù)通常效果不錯(cuò)但是不同數(shù)據(jù)集適合的參數(shù)不同。因此使用GridSearchCV()自動(dòng)搜索最佳參數(shù)。搜索參數(shù)n_estimators max_features max_depth例如嘗試50棵樹 100棵樹 150棵樹 200棵樹然后比較模型效果。最終選擇表現(xiàn)最好的組合。十一、模型評(píng)價(jià)訓(xùn)練完成后使用classification_report()評(píng)價(jià)模型。主要指標(biāo)Accuracy表示整體預(yù)測(cè)正確比例。Precision表示預(yù)測(cè)為垃圾郵件的郵件中真正垃圾郵件的比例。Recall表示所有垃圾郵件中模型成功檢測(cè)出來(lái)的比例。F1-score綜合考慮Precision和Recall。十二、混淆矩陣分析代碼cm_plot()混淆矩陣預(yù)測(cè)正常預(yù)測(cè)垃圾真實(shí)正常TNFP真實(shí)垃圾FNTP其中TP正確識(shí)別垃圾郵件。TN正確識(shí)別正常郵件。FP正常郵件被誤判為垃圾郵件。FN垃圾郵件沒有檢測(cè)出來(lái)。在垃圾郵件檢測(cè)中FN通常需要重點(diǎn)關(guān)注因?yàn)槁┑衾]件會(huì)影響用戶體驗(yàn)。十三、隨機(jī)森林特征重要性分析隨機(jī)森林可以查看不同特征對(duì)于預(yù)測(cè)結(jié)果的影響程度。代碼rf.feature_importances_例如可能發(fā)現(xiàn)特征重要程度關(guān)鍵詞頻率0.30特殊字符數(shù)量0.25鏈接數(shù)量0.18通過(guò)特征重要性分析可以了解哪些因素更容易影響郵件分類結(jié)果。十四、隨機(jī)森林優(yōu)缺點(diǎn)分析優(yōu)點(diǎn)1.穩(wěn)定性更高多棵樹共同決策可以降低單個(gè)模型帶來(lái)的誤差。2.降低過(guò)擬合隨機(jī)數(shù)據(jù)和隨機(jī)特征減少模型對(duì)訓(xùn)練數(shù)據(jù)的依賴。3.適合處理大量特征面對(duì)高維數(shù)據(jù)時(shí)表現(xiàn)較好。缺點(diǎn)1.解釋性較弱單棵決策樹可以直接查看規(guī)則。但是隨機(jī)森林包含大量樹結(jié)構(gòu)不容易完全解釋。2.訓(xùn)練成本較高樹數(shù)量增加后訓(xùn)練時(shí)間和資源消耗都會(huì)增加。