【機器學習與R語言】4-決策樹


1.決策樹原理

  • 決策樹:樹形結構流程圖(漏斗型),模型本身包含一些列邏輯決策。數據分類從根節點開始,根據特征值遍歷樹上的各個決策節點。
  • 幾乎可應用於任何類型的數據建模,且性能不錯。但當數據有大量多層次的名義特征或者大量的數值特征時,可能會生成一個過於復雜的決策樹。
  • 遞歸划分/分而治之:利用特征值將數據分解成具有相似類的較小的子集。
  • 過程:從代表整個數據集的根節點開始,選擇最能預測目標類的特征,然后將案例划分到該特征不同值的組中(即第一組樹枝),繼續分而治之其他節點,每次選擇最佳的候選特征,直到節點上所有案例都屬於同一類,或者沒有其他的特征來區分案例,或者決策樹已經達到了預先定義的大小。
  • 由於數據可一直划分(直到組內的特征沒有區別),所以決策樹容易過擬合,給出過於具體細節的決策。
  • C5.0決策樹算法:C4.5/ID3(迭代二叉樹3代)算法的改進:
    image.png
    ①選擇最佳分割
    確定根據哪個特征來進行分割。
    純類:一組數據中只包含單一的類。
  • 熵Entropy(S):用來度量純度,取值0-1。0表示樣本完全同質,1表示樣本凌亂最大。
    c為類的水平,pi為落入類水平i的特征值比例
    如兩個類的數據分割,紅為60%,白為40%,則該數據分割的熵為:image.png
    任何可能的兩個類划分的熵的圖形(一個類比例x,另一個1-x):
curve(-x*log2(x)-(1-x)*log2(1-x),
      col='red',xlab = 'x',ylab = 'Entropy',lwd=4)

0.5時最大熵值

  • 信息增益:用熵值計算每一個可能特征的分割引起的同質性(均勻性)變化,即分割前與分割后的數據分區熵值之差。
    image.png
    如果一次分割后划分到多個分區,則要通過落入每一分區比例按權重來計算所有分區熵值總和:
    比例wi加權的n個分區
    信息增益越高,根據某一特征分割后創建的分組越均衡。

以上假定的是名義特征,對於數值特征同樣可用信息增益。即通過設置閾值來划分不同組。

除了信息增益可用於特征分割標准,其他常用的標准還有:基尼系數,卡方統計量,增益比等。

②修剪決策樹

  • 修建決策樹減少它的大小,避免過擬合。
  • 提前終止法/預剪枝決策樹法:決策節點達到一定數量的案例就停止。
  • 后剪枝決策樹法(更有效):根據節點處的錯誤率使用修剪准則將樹減少到更合適的大小。
  • 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'))

image.png
錯誤率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'))

image.png

總的錯誤率仍為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

image.png
可通過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'))

image.png
雖然總的錯誤率增加到了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-如何提高模型的性能?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM