1.決策樹原理
- 決策樹:樹形結構流程圖(漏斗型),模型本身包含一些列邏輯決策。數據分類從根節點開始,根據特征值遍歷樹上的各個決策節點。
- 幾乎可應用於任何類型的數據建模,且性能不錯。但當數據有大量多層次的名義特征或者大量的數值特征時,可能會生成一個過於復雜的決策樹。
- 遞歸划分/分而治之:利用特征值將數據分解成具有相似類的較小的子集。
- 過程:從代表整個數據集的根節點開始,選擇最能預測目標類的特征,然后將案例划分到該特征不同值的組中(即第一組樹枝),繼續分而治之其他節點,每次選擇最佳的候選特征,直到節點上所有案例都屬於同一類,或者沒有其他的特征來區分案例,或者決策樹已經達到了預先定義的大小。
- 由於數據可一直划分(直到組內的特征沒有區別),所以決策樹容易過擬合,給出過於具體細節的決策。
- C5.0決策樹算法:C4.5/ID3(迭代二叉樹3代)算法的改進:
①選擇最佳分割
確定根據哪個特征來進行分割。
純類:一組數據中只包含單一的類。 - 熵Entropy(S):用來度量純度,取值0-1。0表示樣本完全同質,1表示樣本凌亂最大。
如兩個類的數據分割,紅為60%,白為40%,則該數據分割的熵為:
任何可能的兩個類划分的熵的圖形(一個類比例x,另一個1-x):
curve(-x*log2(x)-(1-x)*log2(1-x),
col='red',xlab = 'x',ylab = 'Entropy',lwd=4)
- 信息增益:用熵值計算每一個可能特征的分割引起的同質性(均勻性)變化,即分割前與分割后的數據分區熵值之差。
如果一次分割后划分到多個分區,則要通過落入每一分區比例按權重來計算所有分區熵值總和:
信息增益越高,根據某一特征分割后創建的分組越均衡。
以上假定的是名義特征,對於數值特征同樣可用信息增益。即通過設置閾值來划分不同組。
除了信息增益可用於特征分割標准,其他常用的標准還有:基尼系數,卡方統計量,增益比等。
②修剪決策樹
- 修建決策樹減少它的大小,避免過擬合。
- 提前終止法/預剪枝決策樹法:決策節點達到一定數量的案例就停止。
- 后剪枝決策樹法(更有效):根據節點處的錯誤率使用修剪准則將樹減少到更合適的大小。
- C5.0算法能自動修剪。采用后剪枝策略,先生成一個過擬合訓練集的大決策樹,再刪除對分類誤差影響不大的節點和分枝。這樣整個分枝會上移或被取代(子樹提升/子樹替換)。
2.決策樹應用示例
采用C5.0決策樹來識別高風險銀行貸款
2.1)收集數據
信貸數據集:包含1000個貸款案例,貸款特征和貸款者特征的數值特征和名義特征的組合。其中一個類變量表示貸款是否陷入違約。
數據下載:
鏈接: https://pan.baidu.com/s/1p6eTQvUZEAHd9GaFQN0BKA 提取碼: ph8u
2.2)探索和准備數據
## Example: Identifying Risky Bank Loans ----
## Step 2: Exploring and preparing the data ----
credit <- read.csv("credit.csv")
str(credit)
# look at two characteristics of the applicant
table(credit$checking_balance)
table(credit$savings_balance)
# look at two characteristics of the loan
summary(credit$months_loan_duration)
summary(credit$amount)
# look at the class variable
table(credit$default)
# create a random sample for training and test data
# use set.seed to use the same random number sequence as the tutorial
set.seed(123)
train_sample <- sample(1000, 900)
str(train_sample)
# split the data frames
credit_train <- credit[train_sample, ]
credit_test <- credit[-train_sample, ]
# check the proportion of class variable
prop.table(table(credit_train$default))
prop.table(table(credit_test$default))
2.3)訓練模型
## Step 3: Training a model on the data ----
# build the simplest decision tree
library(C50)
credit_model <- C5.0(credit_train[-17], credit_train$default)
# trial可選數值用於控制自助法循環次數(默認1)
# costs可選矩陣用於給出各類型錯誤對應的成本
# display simple facts about the tree
credit_model
# display detailed information about the tree
summary(credit_model)
2.4)評估模型性能
依然使用混淆矩陣來評價模型。
## Step 4: Evaluating model performance ----
# create a factor vector of predictions on test data
credit_pred <- predict(credit_model, credit_test)
# cross tabulation of predicted versus actual classes
library(gmodels)
CrossTable(credit_test$default, credit_pred,
prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
dnn = c('actual default', 'predicted default'))
錯誤率30%,且只正確預測了15個貸款違約者。需要提升性能。
2.5)提高模型性能
通過自適應增強算法(boosting)
- 通過將很多學習能力弱的學習算法組合在一起,尤其使用優點和缺點的多種學習方法組合,可以顯著提高分類器的准確性。
- 參數trials設為10,即10個試驗(研究表明能降低約25%的錯誤率)
## Step 5: Improving model performance ----
## Boosting the accuracy of decision trees
# boosted decision tree with 10 trials
credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
trials = 10)
credit_boost10
summary(credit_boost10)
credit_boost_pred10 <- predict(credit_boost10, credit_test)
CrossTable(credit_test$default, credit_boost_pred10,
prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
dnn = c('actual default', 'predicted default'))
總的錯誤率仍為30%。缺乏更大的提高可能是本身使用了一個相對較小的訓練集。
將懲罰因子分配到不同類型的錯誤上
假陰性付出的代價比較大(給有違約的申請者放貸),可以通過拒絕大量處於邊界線的申請者來規避風險。
將懲罰因子設定在一個代價矩陣中,用來指定每種錯誤相對於其他任何錯誤有多少倍的嚴重性。如錯放一個貸款違約者的損失是錯失一次基於損失的4倍:
# create dimensions for a cost matrix
matrix_dimensions <- list(c("no", "yes"), c("no", "yes"))
names(matrix_dimensions) <- c("predicted", "actual")
matrix_dimensions
# build the matrix
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2, dimnames = matrix_dimensions)
error_cost
可通過costs參數來指定代價矩陣:
# apply the cost matrix to the tree
credit_cost <- C5.0(credit_train[-17], credit_train$default,
costs = error_cost)
credit_cost_pred <- predict(credit_cost, credit_test)
CrossTable(credit_test$default, credit_cost_pred,
prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
dnn = c('actual default', 'predicted default'))
雖然總的錯誤率增加到了33%,但假陰性率降低到了7%。以增加錯誤肯定為代價,減少錯誤否定的這種折中的方案是可以接受的。
機器學習與R語言系列推文匯總:
【機器學習與R語言】1-機器學習簡介
【機器學習與R語言】2-K近鄰(kNN)
【機器學習與R語言】3-朴素貝葉斯(NB)
【機器學習與R語言】4-決策樹
【機器學習與R語言】5-規則學習
【機器學習與R語言】6-線性回歸
【機器學習與R語言】7-回歸樹和模型樹
【機器學習與R語言】8-神經網絡
【機器學習與R語言】9-支持向量機
【機器學習與R語言】10-關聯規則
【機器學習與R語言】11-Kmeans聚類
【機器學習與R語言】12-如何評估模型的性能?
【機器學習與R語言】13-如何提高模型的性能?