随机森林原理_机器学习(29):随机森林调参实战(信用卡欺诈预测)
點擊“機器學習研習社”,“置頂”公眾號
重磅干貨,第一時間送達
回復【大禮包】送你機器學習資料與筆記
回顧
推薦收藏>機器學習文章集合:1-20
機器學習(21): Tensorflow Keras手寫數字識別
機器學習(22): Tensorflow Keras識別貓狗
機器學習(23): 幾張GIF理解K-均值聚類原理
機器學習(24): ?k均值聚類數學推導與python實現
機器學習(25):聚類系列:層次聚類原理及案例
機器學習(26): 最大熵模型
機器學習(27):隨機森林工作原理及調參實戰(信用卡欺詐預測)
機器學習(28): Adaboost知識手冊(理論篇)
本文我們重點講一下:
1、集成學習、Bagging和隨機森林概念
2、隨機森林參數解釋及設置建議?
3、隨機森林模型調參實戰
4、隨機森林模型優缺點總結
集成學習、Bagging和隨機森林
集成學習并不是一個單獨的機器學習算法,它通過將多個基學習器(弱學習器)進行結合,最終獲得一個強學習器。這里的弱學習器應該具有一定的準確性,并且要有多樣性(學習器之間具有差異),比較常用的基學習器有決策樹和神經網絡。
圖片來源:西瓜書集成學習的核心就是如何產生并結合好而不同的基學習器,這里有兩種方式是,一種是Bagging(基學習器之間沒有強依賴關系,可同時生成的并行化方法),一種是Boosting(基學習器之間有強依賴關系,必須串行生成)。集成學習另一個關鍵問題是結合策略,主要有平均法、投票法和學習法,這里不再展開。
Bagging是Bootstrap AGGregaING的縮寫,Bootstrap即隨機采樣,比如給定含有個樣本的數據集,每次隨機的從中選擇一個樣本,放入新的數據集,然后將其放回初始數據集,放回后有可能繼續被采集到,重復這個動作次,我們就得到新的數據集。
from:towardsdatascience用這種方式,我們可以采樣出含m個訓練樣本的采樣集,然后基于每個采樣集訓練基學習器,再將基學習器進行結合,這便是Bagging的基本流程。
from:mrlevo520@簡書隨機森林是非常具有代表性的Bagging集成算法,它在Bagging基礎上進行了強化。它的所有基學習器都是CART決策樹,傳統決策樹在選擇劃分屬性時是在當前結點的屬性集合(假定有d個屬性)中選擇最優屬性。但是隨機森林的決策樹,現在每個結點的屬性集合隨機選擇部分k個屬性的子集,然后在子集中選擇一個最優的特征來做決策樹的左右子樹劃分,一般建議.
隨機森林參數解釋及設置建議
在scikit-learn中,RandomForest的分類類是RandomForestClassifier,回歸類是RandomForestRegressor,需要調參的參數包括兩部分,第一部分是Bagging框架的參數,第二部分是CART決策樹的參數。
隨機森林參數及設置建議隨機森林模型調參實戰
這是一道kaggle上的題目,通過信用卡交易記錄數據對欺詐行為進行預測,信用卡欺詐檢測文件記錄了2013年9月歐洲信用卡持有者所發生的交易。在284807條交易記錄中共包含492條欺詐記錄。?
數據集下載地址:請在公眾號后臺回復[56]?
需要說明的是,本文重點是RF模型調參,所以不涉及數據預處理、特征工程和模型融合的內容,這些我會在本欄目未來的章節中再做介紹。所以最終結果可能會不理想,這里我們只關注通過調參給模型帶來的性能提升和加深對重要參數的理解即可。
1、導入模塊
import numpy as npimport pandas as pd
from sklearn.model_selection import GridSearchCV,train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
2、導入數據
df = pd.read_csv("creditcard.csv")data=df.iloc[:,1:31]
284807條交易記錄中只有492條欺詐記錄,樣本嚴重不平衡,這里我們需要使用下采樣策略(減少多數類使其數量與少數類相同)
X = data.loc[:, data.columns != 'Class']y = data.loc[:, data.columns == 'Class']
number_records_fraud = len(data[data.Class == 1]) # class=1的樣本函數
fraud_indices = np.array(data[data.Class == 1].index) # 樣本等于1的索引值
normal_indices = data[data.Class == 0].index # 樣本等于0的索引值
random_normal_indices = np.random.choice(normal_indices,number_records_fraud,replace = False)
random_normal_indices = np.array(random_normal_indices)
under_sample_indices = np.concatenate([fraud_indices,random_normal_indices]) # Appending the 2 indices
under_sample_data = data.iloc[under_sample_indices,:] # Under sample dataset
X_undersample = under_sample_data.loc[:,under_sample_data.columns != 'Class']
y_undersample = under_sample_data.loc[:,under_sample_data.columns == 'Class']
X_train, X_test, y_train, y_test = train_test_split(X_undersample,y_undersample,test_size = 0.3, random_state = 0)
3、先用默認參數訓練RF
rf0 = RandomForestClassifier(oob_score=True, random_state=666)rf0.fit(X_train,y_train)
print(rf0.oob_score_)
y_predprob = rf0.predict_proba(X_test)[:,1]
print("AUC Score (Train): %f" % roc_auc_score(y_test, y_predprob))
0.9244186046511628
?AUC Score (Train): 0.967082?
除oob_score將默認的False改為True, 我們重點優化n_estimators、max_depth、min_samples_leaf 這三個參數。為簡單起見,模型評價指標,我們選擇AUC值。
模型調優我們采用網格搜索調優參數(grid search),通過構建參數候選集合,然后網格搜索會窮舉各種參數組合,根據設定評定的評分機制找到最好的那一組設置。
先優化n_estimators
param_test1 = {'n_estimators':range(10,101,10)}gsearch1 = GridSearchCV(estimator = RandomForestClassifier(oob_score=True, random_state=666,n_jobs=2),
param_grid = param_test1, scoring='roc_auc',cv=5)
gsearch1.fit(X_train,y_train)
gsearch1.cv_results_, gsearch1.best_params_, gsearch1.best_score_
{'n_estimators': 50}, 0.9799524239675649
n_estimators=50,優化max_features
param_test2 = {'max_depth':range(2,12,2)}gsearch2 = GridSearchCV(estimator = RandomForestClassifier(n_estimators= 50,oob_score=True, random_state=666,n_jobs=2),
param_grid = param_test2, scoring='roc_auc',cv=5)
gsearch2.fit(X_train,y_train)
gsearch2.cv_results_, gsearch2.best_params_, gsearch2.best_score_
{'max_depth': 6}, 0.9809897227343921
n_estimators=50,max_features=6,優化max_depth
param_test2 = {'min_samples_split':range(2,8,1)}gsearch2 = GridSearchCV(estimator = RandomForestClassifier(n_estimators= 50,max_depth=6,
oob_score=True, random_state=666,n_jobs=2),
param_grid = param_test2, scoring='roc_auc',cv=5)
gsearch2.fit(X_train,y_train)
gsearch2.cv_results_, gsearch2.best_params_, gsearch2.best_score_
{'min_samples_split': 5}, 0.9819618127837587
最后我們將優化后的參數帶入模型
rf1 = RandomForestClassifier(n_estimators= 50,max_depth=6,min_samples_split=5,oob_score=True, random_state=666,n_jobs=2)rf1.fit(X_train,y_train)
print(rf1.oob_score_)
y_predprob1 = rf1.predict_proba(X_test)[:,1]
print("AUC Score (Train): %f" % roc_auc_score(y_test, y_predprob1))
0.9331395348837209 AUC Score (Train): 0.977811?
最終結果比默認參數時的模型袋外估計準確率得分、測試集上AUC值均有所提升。
隨機森林優缺點總結
RF優點?
不容易出現過擬合,因為選擇訓練樣本的時候就不是全部樣本。
可以既可以處理屬性為離散值的量,比如ID3算法來構造樹,也可以處理屬性為連續值的量,比如C4.5算法來構造樹。
對于高維數據集的處理能力令人興奮,它可以處理成千上萬的輸入變量,并確定最重要的變量,因此被認為是一個不錯的降維方法。此外,該模型能夠輸出變量的重要性程度,這是一個非常便利的功能。
分類不平衡的情況時,隨機森林能夠提供平衡數據集誤差的有效方法
RF缺點?
隨機森林在解決回歸問題時并沒有像它在分類中表現的那么好,這是因為它并不能給出一個連續型的輸出。當進行回歸時,隨機森林不能夠作出超越訓練集數據范圍的預測,這可能導致在對某些還有特定噪聲的數據進行建模時出現過度擬合。
對于許多統計建模者來說,隨機森林給人的感覺像是一個黑盒子——你幾乎無法控制模型內部的運行,只能在不同的參數和隨機種子之間進行嘗試。
參考:
https://www.jianshu.com/p/708dff71df3a https://www.cnblogs.com/pinard/p/6156009.html
往期閱讀:
推薦收藏>機器學習文章集合:1-20
機器學習(21): Tensorflow Keras手寫數字識別
機器學習(22): Tensorflow Keras識別貓狗
機器學習(23): 幾張GIF理解K-均值聚類原理
機器學習(24): ?k均值聚類數學推導與python實現
機器學習(25):聚類系列:層次聚類原理及案例
機器學習(25): 最大熵模型
機器學習(27):隨機森林工作原理及調參實戰(信用卡欺詐預測)
后臺回復Python深度學習獲取學習大禮包
機器學習研習社:目前是由國內985博士,碩士組成的團體發起并運營。主要分享和研究機器學習、深度學習、NLP 、Python,大數據等前沿知識、干貨筆記和優質資源。
總結
以上是生活随笔為你收集整理的随机森林原理_机器学习(29):随机森林调参实战(信用卡欺诈预测)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot 启动卡住_Spr
- 下一篇: 定时器和promise_手写Promis