數(shù)據(jù)分享|R語言決策樹和隨機森林分類電信公司用戶流失churn數(shù)據(jù)和參數(shù)調(diào)優(yōu)、ROC曲線可
原文鏈接:http://tecdat.cn/?p=26868
最近我們被客戶要求撰寫關(guān)于電信公司用戶流失的研究報告,包括一些圖形和統(tǒng)計輸出。
在本教程中,我們將學(xué)習(xí)覆蓋決策樹和隨機森林。這些是可用于分類或回歸的監(jiān)督學(xué)習(xí)算法
下面的代碼將加載本教程所需的包和數(shù)據(jù)集。
library(tidyverse)#?電信客戶流失率數(shù)據(jù)churn?<-?read_rds(chuata.rds))
數(shù)據(jù)
花點時間探索下面的這個數(shù)據(jù)集?(?查看文末了解數(shù)據(jù)獲取方式?)?。
此數(shù)據(jù)框中的一行代表一家電信公司的客戶。每個客戶都從該公司購買了電話和互聯(lián)網(wǎng)服務(wù)。
此數(shù)據(jù)中的因變量變量?canceled
?指示客戶是否終止了他們的服務(wù)。

決策樹
為了演示擬合決策樹,我們將使用?churn
數(shù)據(jù)集并使用所有可用的預(yù)測變量進行預(yù)測。
數(shù)據(jù)拆分
我們將數(shù)據(jù)分成訓(xùn)練集和測試集。訓(xùn)練數(shù)據(jù)將進一步分為 5 折進行超參數(shù)調(diào)優(yōu)。
?#?記住一定要設(shè)置你的隨機數(shù)種子。chuit?<-?iniplit(cdf)chining?<-?chulit?%>%?trang()chuest?<-?chuplit?%>%?tesg()#在訓(xùn)練數(shù)據(jù)集上創(chuàng)建交叉驗證的##這些將被用于調(diào)整模型的超參數(shù)chds?<-?vfcv(chung,?v?=?5)
特征工程
我們將在訓(xùn)練數(shù)據(jù)上進行以下轉(zhuǎn)換。
消除數(shù)值預(yù)測變量的偏度
標準化所有數(shù)字預(yù)測變量
為所有名義預(yù)測變量創(chuàng)建虛擬變量
chu_rep?<-?recipe(cace_srce?~?.,?data?=?chutann)?%>%????????????????????????stepYeonon(al_nmeric(),?-al_utcoms())?%>%????????????????????????ste_nomaze(all_umic(),?-al_oucoes())?%>%????????????????????????ste_dumy(all_inal(),?-al_otcomes())
讓我們檢查一下特征工程步驟是否正確執(zhí)行。
模型規(guī)格
接下來,我們指定具有以下超參數(shù)的決策樹分類器:
成本復(fù)雜度參數(shù)(又名 Cp 或 λ)
樹的最大深度
節(jié)點中進一步拆分所需的最小數(shù)據(jù)點數(shù)。
工作流程
接下來,我們將模型組合到一個工作流中,以輕松管理模型構(gòu)建過程。
treow?<-?workflow()
超參數(shù)調(diào)優(yōu)
我們將對決策樹超參數(shù)進行網(wǎng)格搜索,并在交叉驗證期間根據(jù) ROC 曲線下的面積選擇性能最佳的模型。
請參見下面的示例,我們在其中創(chuàng)建?tree_grid
?對象。
##?創(chuàng)建一個超參數(shù)值的網(wǎng)格來測試tr_gid?<-?girular(cotolty(),??????????????????????????teedeth(),??????????????????????????mnn(),???????????????????????????lvs?=?2)
調(diào)整超參數(shù)?tune_grid()
為了從我們的調(diào)整網(wǎng)格中找到超參數(shù)的最佳組合,我們將使用該?tune_grid()
?函數(shù)。
在我們的 KNN 示例中,此函數(shù)將模型對象或工作流作為第一個參數(shù),將交叉驗證折疊作為第二個參數(shù),將調(diào)整網(wǎng)格數(shù)據(jù)框作為第三個參數(shù)。
##?調(diào)整決策樹工作流程set.seed(314)tre_tig?<-?trewolow?%>%???????????????tue_rid(rsampes?=?chrnols,?????????????????????????grid?=?reegid)
查看我們的超參數(shù)調(diào)整的結(jié)果。
從下面的結(jié)果中,我們看到對于我們網(wǎng)格中的每個超參數(shù)組合。
下面?mean
?結(jié)果中的列表示獲得的性能指標的平均值。
我們可以使用該?select_best()
?模型從我們的調(diào)優(yōu)結(jié)果中選擇具有最佳整體性能的模型。在下面的代碼中,我們指定根據(jù)?roc_auc
?指標選擇性能最佳的模型。
我們看到成本復(fù)雜度為 1-10、樹深度為 15、最小 n 為 40 的模型產(chǎn)生了最佳模型。
##?根據(jù)roc_auc選擇最佳模型besree?<-?te_uin?%>%
完成工作流程
超參數(shù)調(diào)整的最后一步是?將我們的最佳模型添加到我們的工作流對象中。
可視化結(jié)果
為了可視化我們的決策樹模型,我們需要使用該?fit()
?函數(shù)手動訓(xùn)練我們的工作流對象。
此步驟是可選的,因為并非所有應(yīng)用程序都需要可視化模型。但是,如果目標是了解?模型預(yù)測某些值的原因?,那么建議這樣做。
下一節(jié)將展示如何擬合模型以?自動獲得測試集的性能。
擬合模型
接下來,我們將工作流程與訓(xùn)練數(shù)據(jù)相匹配。這是通過將我們的工作流對象傳遞給?fit()
?函數(shù)來完成的。
???????????????fit(data?=?chning)
探索我們的訓(xùn)練模型變量的重要性
一旦我們在訓(xùn)練數(shù)據(jù)上訓(xùn)練了我們的模型,我們就可以使用該?vip
?函數(shù)研究變量的重要性。
teeit?<-?tree__it?%>%?????????????pull_orfowit()
變量重要性
接下來我們傳遞?tree_fit
?給?vip()
?函數(shù)。
我們從下面的結(jié)果中看到最重要的預(yù)測因子。
vip(teeit)

點擊標題查閱往期內(nèi)容

PYTHON用戶流失數(shù)據(jù)挖掘:建立邏輯回歸、XGBOOST、隨機森林、決策樹、支持向量機、樸素貝葉斯和KMEANS聚類用戶畫像

左右滑動查看更多

01

02

03

04

決策樹圖
我們可以可視化訓(xùn)練好的決策樹。
這種可視化是一種工具,用于傳達經(jīng)過訓(xùn)練的決策樹的預(yù)測規(guī)則。
很多時候,決策樹圖會很大并且難以閱讀。有專門的軟件包?R
?用于放大決策樹圖的區(qū)域。

訓(xùn)練和評估?
接下來,我們將最終模型工作流程擬合到訓(xùn)練數(shù)據(jù)并評估測試數(shù)據(jù)的性能。
該?函數(shù)將使我們的工作流程適合訓(xùn)練數(shù)據(jù),并根據(jù)我們的?chuplit
?對象定義的測試數(shù)據(jù)生成預(yù)測。
tre_latit?<-?fil_tewklow?%>%??????????????????last_fit(chnpit)
我們可以在測試數(shù)據(jù)上查看我們的性能指標
tre_lft?%>%?collect_metrics()
ROC曲線
我們可以繪制 ROC 曲線來可視化我們調(diào)整的決策樹的測試集性能
treatft?%>%?collect_predictions()?%>%

混淆矩陣
我們看到我們的模型在我們的測試數(shù)據(jù)集上產(chǎn)生了 80 個假陰性和 57 個假陽性。
tre_pcis?<-?tre_s_t?%>%?collect_predictions()

隨機森林
在本節(jié)中,我們將為?chudf
?數(shù)據(jù)擬合一個隨機森林模型。隨機森林采用決策樹并在預(yù)測準確性方面構(gòu)建更強大的模型。支持該算法的主要機制是對訓(xùn)練數(shù)據(jù)進行重復(fù)采樣(替換)以生成一系列決策樹模型。然后對這些模型進行平均以獲得預(yù)測空間中給定值的單個預(yù)測。
隨機森林模型選擇預(yù)測變量的隨機子集,用于在樹構(gòu)建過程中分割預(yù)測空間。算法的每次迭代都會這樣做,通常是 100 到 2,000 次。
數(shù)據(jù)特征工程
我們已經(jīng)將我們的數(shù)據(jù)分成訓(xùn)練、測試和交叉驗證集,并訓(xùn)練了我們的特征工程,??chucipe
. 這些可以在我們的隨機森林工作流程中重復(fù)使用。
模型
接下來,我們指定具有以下超參數(shù)的隨機森林分類器:
mtry
:創(chuàng)建樹模型時在每次拆分時隨機抽樣的預(yù)測變量的數(shù)量trees
:要擬合并最終平均的決策樹的數(shù)量min_n
: 節(jié)點進一步分裂所需的最小數(shù)據(jù)點數(shù)
要指定具有 的隨機森林模型?,我們需要該?ranorest()
?函數(shù)。
工作流程
接下來,我們將我們的模型和配方組合到一個工作流中,以輕松管理模型構(gòu)建過程。
f_orkflw?<-?workflow()?%>%
超參數(shù)調(diào)優(yōu)
隨機網(wǎng)格搜索
我們將對隨機森林超參數(shù)進行網(wǎng)格搜索,并在交叉驗證期間根據(jù) ROC 曲線下的面積選擇性能最佳的模型。
在上一節(jié)中,我們曾經(jīng)?gridlar()
?創(chuàng)建一個超參數(shù)值網(wǎng)格。這創(chuàng)建了推薦默認值的常規(guī)網(wǎng)格。
另一種進行超參數(shù)調(diào)整的方法是創(chuàng)建一個?隨機?的值網(wǎng)格。許多研究表明,這種方法比常規(guī)網(wǎng)格方法做得更好。
在下面的代碼中,我們將范圍設(shè)置為 4 到 12。
##?創(chuàng)建一個超參數(shù)值的網(wǎng)格來測試set.sd(314)rf_gd?<-?grid_random(mry()?%>%?range_set

調(diào)整超參
為了從我們的調(diào)整網(wǎng)格中找到超參數(shù)的最佳組合,我們將使用該?tugid()
?函數(shù)。
##?調(diào)整隨機森林工作流程set.seed(314)rftin?<-?rfwoflow?%>%??????????????tune_grid(resamples?=?cu_olds,???????????????????????grid?=?r_id)
查看我們的超參數(shù)調(diào)整的結(jié)果。
我們可以使用模型從我們的調(diào)優(yōu)結(jié)果中選擇具有最佳整體性能的模型。在下面的代碼中,我們指定根據(jù)?rocauc
?指標選擇性能最佳的模型。
##?根據(jù)roc_auc選擇最佳模型berf?<-?rftunng?%>%????????????select_best
完成工作流程
超參數(shù)調(diào)整的最后一步是?將我們的最佳模型添加到我們的工作流對象中。
fina_rkflow?<-?rfow?%>%??????????????????????finaflow(betrf)
變量重要性
為了可視化隨機森林模型的可變重要性分數(shù)。
擬合模型
接下來,我們將工作流程與訓(xùn)練數(shù)據(jù)相匹配。這是通過將我們的工作流對象傳遞給?fit()
?函數(shù)來完成的。
rf_it?<-?fnalrfrlow?%>%??????????????fit(data?=?crnranng)
一旦我們在訓(xùn)練數(shù)據(jù)上訓(xùn)練了我們的模型,我們就可以研究變量的重要性。
第一步是從我們的工作流擬合中提取訓(xùn)練好的模型。
rf?<-?ft?%>%???????????pll_orfow_fit()
變量重要性
從我們的模型返回一個?ggplot
?具有可變重要性分數(shù)的對象。重要性分數(shù)基于通過超參數(shù)隨機選擇的具有最大預(yù)測能力的預(yù)測變量。

訓(xùn)練和評估
接下來,我們將最終模型工作流程擬合到訓(xùn)練數(shù)據(jù)并評估測試數(shù)據(jù)的性能。
使我們的工作流程擬合訓(xùn)練數(shù)據(jù),并根據(jù)測試數(shù)據(jù)生成預(yù)測。
我們可以在測試數(shù)據(jù)上查看我們的性能指標
rf_tfit?%>%?cole_trcs()
ROC曲線
我們可以繪制 ROC 曲線來可視化隨機森林模型的測試集性能。
rflafit?%>%?collepedions()?%>%?????????????????roc_ve(trth??=?cncele_srice,?estimate?=?.rd_es)?%>%?????????????????autplot()

混淆矩陣
我們看到我們的模型在我們的測試數(shù)據(jù)集上產(chǎn)生了 61 個假陰性和 48 個假陽性,優(yōu)于我們的決策樹模型。
conf_mat(predis,?truth?=?cncervice,?estimate?=?.prd_las)

數(shù)據(jù)獲取
在下面公眾號后臺回復(fù)“流失數(shù)據(jù)”,可獲取完整數(shù)據(jù)。

點擊文末?“閱讀原文”
獲取全文完整資料。
本文選自《R語言決策樹和隨機森林分類電信公司用戶流失churn數(shù)據(jù)和參數(shù)調(diào)優(yōu)、ROC曲線可視化》。
點擊標題查閱往期內(nèi)容
從決策樹到隨機森林:R語言信用卡違約分析信貸數(shù)據(jù)實例
PYTHON用戶流失數(shù)據(jù)挖掘:建立邏輯回歸、XGBOOST、隨機森林、決策樹、支持向量機、樸素貝葉斯和KMEANS聚類用戶畫像
Python對商店數(shù)據(jù)進行l(wèi)stm和xgboost銷售量時間序列建模預(yù)測分析
PYTHON集成機器學(xué)習(xí):用ADABOOST、決策樹、邏輯回歸集成模型分類和回歸和網(wǎng)格搜索超參數(shù)優(yōu)化
R語言集成模型:提升樹boosting、隨機森林、約束最小二乘法加權(quán)平均模型融合分析時間序列數(shù)據(jù)
Python對商店數(shù)據(jù)進行l(wèi)stm和xgboost銷售量時間序列建模預(yù)測分析
R語言用主成分PCA、?邏輯回歸、決策樹、隨機森林分析心臟病數(shù)據(jù)并高維可視化
R語言基于樹的方法:決策樹,隨機森林,Bagging,增強樹
R語言用邏輯回歸、決策樹和隨機森林對信貸數(shù)據(jù)集進行分類預(yù)測
spss modeler用決策樹神經(jīng)網(wǎng)絡(luò)預(yù)測ST的股票
R語言中使用線性模型、回歸決策樹自動組合特征因子水平
R語言中自編基尼系數(shù)的CART回歸決策樹的實現(xiàn)
R語言用rle,svm和rpart決策樹進行時間序列預(yù)測
python在Scikit-learn中用決策樹和隨機森林預(yù)測NBA獲勝者
python中使用scikit-learn和pandas決策樹進行iris鳶尾花數(shù)據(jù)分類建模和交叉驗證
R語言里的非線性模型:多項式回歸、局部樣條、平滑樣條、 廣義相加模型GAM分析
R語言用標準最小二乘OLS,廣義相加模型GAM?,樣條函數(shù)進行邏輯回歸LOGISTIC分類
R語言ISLR工資數(shù)據(jù)進行多項式回歸和樣條回歸分析
R語言中的多項式回歸、局部回歸、核平滑和平滑樣條回歸模型
R語言用泊松Poisson回歸、GAM樣條曲線模型預(yù)測騎自行車者的數(shù)量
R語言分位數(shù)回歸、GAM樣條曲線、指數(shù)平滑和SARIMA對電力負荷時間序列預(yù)測R語言樣條曲線、決策樹、Adaboost、梯度提升(GBM)算法進行回歸、分類和動態(tài)可視化
如何用R語言在機器學(xué)習(xí)中建立集成模型?
R語言ARMA-EGARCH模型、集成預(yù)測算法對SPX實際波動率進行預(yù)測在python 深度學(xué)習(xí)Keras中計算神經(jīng)網(wǎng)絡(luò)集成模型R語言ARIMA集成模型預(yù)測時間序列分析R語言基于Bagging分類的邏輯回歸(Logistic Regression)、決策樹、森林分析心臟病患者
R語言基于樹的方法:決策樹,隨機森林,Bagging,增強樹
R語言基于Bootstrap的線性回歸預(yù)測置信區(qū)間估計方法
R語言使用bootstrap和增量法計算廣義線性模型(GLM)預(yù)測置信區(qū)間
R語言樣條曲線、決策樹、Adaboost、梯度提升(GBM)算法進行回歸、分類和動態(tài)可視化
Python對商店數(shù)據(jù)進行l(wèi)stm和xgboost銷售量時間序列建模預(yù)測分析
R語言隨機森林RandomForest、邏輯回歸Logisitc預(yù)測心臟病數(shù)據(jù)和可視化分析
R語言用主成分PCA、?邏輯回歸、決策樹、隨機森林分析心臟病數(shù)據(jù)并高維可視化
Matlab建立SVM,KNN和樸素貝葉斯模型分類繪制ROC曲線
matlab使用分位數(shù)隨機森林(QRF)回歸樹檢測異常值