1.調整模型參數來提高性能
- 參數調整:調節模型合適的選項的過程,如股票C5.0決策樹模型中的trials參數,神經網絡中的調節節點、隱層數目,SVM中的核函數等等。
- caret包自動調整參數:train函數,為分類和回歸的150種不同機器學習模型自動搜尋一個最優的模型。支持的模型及相關可調節參數的詳細信息可參考:http://topepo.github.io/caret/modelList.html
自動調整不會遍歷所有參數所有值,只選擇參數可能值的一些子集來構建網格。caret默認對每個參數最多搜索3個可能值,假設共有p個參數,則有3^p個候選模型將被測試。
1.1 創建簡單的調整模型
最簡單的調整模型只需要通過mehod參數來指定模型的類型。這里仍以采用決策樹C5.0對信用數據建模為例。
# load the credit dataset
credit <- read.csv("credit.csv")
library(caret)
## Creating a simple tuned model ----
# automated parameter tuning of C5.0 decision tree
set.seed(300)
m <- train(default ~ ., data = credit, method = "C5.0")
# summary of tuning results
m
計算量比較大,R會重復地生成數據的隨機抽樣,建立決策樹模型,計算性能統計量,並且對結果進行評估。
結果分為4部分:
- 一是輸入數據的情況;
- 二是預處理和重抽樣的應用情況:25個自助法抽樣;
- 三是候選模型評估列表:共12個模型被測試,基於3個參數(model\winno\trials)組合;
- 四是最佳模型的選擇:圖中紅框內結果。
將最佳模型進行預測:
# apply the best C5.0 candidate model to make predictions
p <- predict(m, credit)
table(p, credit$default)
# obtain predicted classes
head(predict(m, credit, type = "raw"))
# obtain predicted probabilities
head(predict(m, credit, type = "prob"))
有2個被錯誤分類,這只是重新代入誤差,而不是對未來數據性能的度量。上圖中自助法估計的73%才是對未來性能的估計。
2.2 定制調整參數
-
trainControl函數可創建一系列配置選項(控制對象),與train函數一起使用。method參數設置重抽樣的方法。
-
如使用Kappa優化決策樹的提升(boosting)參數的過程:
①創建配置選項
## Customizing the tuning process ----
# use trainControl() to alter resampling strategy
ctrl <- trainControl(method = "cv", #重抽樣方法
number = 10, #折數目
selectionFunction = "oneSE") #oneSE選擇最好性能標准差之內的最簡單的候選者
#默認best,即選擇具有最好的某特定度量值的候選者
②創建組合數據框
#model和winnow保持不變,trials設置8個值
# use expand.grid() to create grid of tuning parameters
grid <- expand.grid(.model = "tree",
.trials = c(1, 5, 10, 15, 20, 25, 30, 35),
.winnow = FALSE)
# look at the result of expand.grid()
grid
③定制參數訓練
# customize train() with the control list and grid of parameters
set.seed(300)
m <- train(default ~ ., data = credit, method = "C5.0",
metric = "Kappa",
trControl = ctrl,
tuneGrid = grid)
m
- 和之前自助法的結果相比需要注意的地方:
-- 10折交叉驗證的樣本量為900;
-- 自定義的8個候選模型;
-- 8個候選模型中雖然trials為35的模型准確度最高,但結果推薦的是trials為5的模型,因為這里使用了oneSE規則而非之前的best規則來選擇模型。簡單的模型更可取,一是具有更好的計算性能,二是減少過擬合的可能。
2.使用元學習來提高性能
- 將多個模型合並成一個更強的組。模型互補,而非重疊。
- 元學習適合對多個模型的預測和要求的結果之間的關系建模。
2.1 集成學習(元學習)概述
- 元學習也稱集成學習:基於結合多個很弱的學習器來創建一個很強學習器的思路。
- 集成學習示意圖:
分配函數決定每個模型接受完整的訓練集還是某個抽樣的樣本。
組合函數用來對預測中的不一致進行調節。
堆疊:使用多個模型的預測來訓練一個仲裁模型的過程。
集成學習的好處:
- 便利性:能節省尋求單一最佳模型的時間,只需要訓練一批表現尚可的候選者,然后整合它們即可。
- 普適性
- 提升大量數據或少量數據的性能
- 將不同領域數據合成
- 對困難學習任務更細致的理解
2.2 bagging
- 自助匯聚法(bagging):最好的集成學習方法之一。bagging對原始訓練集使用自助法抽樣產生多個訓練集,再使用單一的機器學習算法產生多個模型,然后使用投票(對於分類問題)或平均(對於數值預測)的方法來組合預測值。
- bagging對不穩定的學習器(隨着數據發送很小變化產生差別很大的模型),如決策樹具有很好的效果。
## Bagging ----
# Using the ipred bagged decision trees
library(ipred)
set.seed(300)
mybag <- bagging(default ~ .,
data = credit,
nbagg = 25) #用於投票的決策樹的數目,默認25
credit_pred <- predict(mybag, credit)
table(credit_pred, credit$default)
模型訓練得不錯,再通過catet::train函數的10折交叉驗證來建立bagging樹,來評估未來的性能表現。
# estimate performance of ipred bagged trees
library(caret)
set.seed(300)
ctrl <- trainControl(method = "cv", number = 10)
train(default ~ ., data = credit,
method = "treebag", #bagging樹函數
trControl = ctrl)
- 基於bagging的其他機器學習模型
caret包中包含了支持向量機svmBag,朴素貝葉斯nbBag,決策樹ctreeBag,神經網絡nnetBag等。 - 以caret包中的svmBag對象為例,提供了fit,pred,aggregate三個函數來創建一個bagging控制對象:
# Using caret's more general bagging function
# create a bag control object using svmBag
str(svmBag)
svmBag$fit
bagctrl <- bagControl(fit = svmBag$fit,
predict = svmBag$pred,
aggregate = svmBag$aggregate)
# fit the bagged svm model
set.seed(300)
svmbag <- train(default ~ ., data = credit, "bag",
trControl = ctrl, bagControl = bagctrl)
svmbag
2.3 boosting
- boosting:另一種基於集成學習的方法,通過增加弱學習器的性能來獲得強學習器的性能。
- 類似bagging,boosting也是使用不同的重抽樣數據中訓練模型的集成學習,通過投票來決定最終的預測值。不同的是boosting中的重抽樣數據集是專門構建用來產生互補的模型,而且選票不是同等重要,會根據性能進行加權。
- boosting算法稱為自適應boosting或AdaBoost,該算法產生弱分類器來迭代地學習訓練集中很大比例的難以分類的樣本,對經常分錯的樣本進行更多的關注(即給予更大的權重)。
- boosting原理可用於幾乎任何模型,但最常用於決策樹,詳見:【機器學習與R語言】4-決策樹
- 代碼示例:
## Boosting ----
## Using C5.0 Decision Tree (not shown in book)
library(C50)
m_c50_bst <- C5.0(default ~ ., data = credit, trials = 100)
## Using AdaBoost.M1
library(adabag)
# create a Adaboost.M1 model
set.seed(300)
m_adaboost <- boosting(default ~ ., data = credit)
p_adaboost <- predict(m_adaboost, credit)
head(p_adaboost$class)
p_adaboost$confusion
# create and evaluate an Adaboost.M1 model using 10-fold-CV
set.seed(300)
adaboost_cv <- boosting.cv(default ~ ., data = credit)
adaboost_cv$confusion
# calculate kappa
library(vcd)
Kappa(adaboost_cv$confusion)
2.4 隨機森林
- 隨機森林(決策樹森林):只關注決策樹的集成學習。
- 將bagging和隨機特征選擇結合起來,對決策樹模型添加額外的多樣性。在樹的集成(森林)產生之后,該模型使用投票的方法來組合預測結果。
- 隨機森林特點:
1)訓練隨機森林
算法說明:
#創建分類器
m=randomForest(train,
class, #因子變量,訓練集中的每一行的類別
ntree=500, #指定樹的數目,默認500
mtry=sqrt(p)) #每次划分中隨機選擇的特征數目(默認sqrt(p),p是總特征數目)
#預測
p=predict(m,test,
type="response") #response/prob/votes分別為預測類別/預測概率/投票數矩陣
仍然以包含16個特征的信用數據為例:
## Random Forests ----
# random forest with default settings
library(randomForest)
set.seed(300)
rf <- randomForest(default ~ ., data = credit)
rf
注意這個混淆矩陣不是重代入誤差(前面提到的混淆矩陣),而是出包錯誤率(out-of-bag)(OOB估計錯誤率),它是對測試集合錯誤的一個無偏估計,表示對未來性能的一個合理估計。
在森林構建結束時,每個樣本每次的預測值會被記錄,通過投票來決定該樣本最終的預測值,這種預測的總錯誤率就是出包錯誤率。
2)評估隨機森林性能
randomForest函數得到了caret包的支持,允許在優化模型的同時計算出包錯誤率之外的性能度量指標。
①設置訓練控制選項
library(caret)
ctrl <- trainControl(method = "repeatedcv",
number = 10, repeats = 10)
②對隨機森林設置參數調整網格
mtry參數表每一次划分中要隨機選擇多少特征。默認sqrt(16)=4個特征,這里測試該數的一半,兩倍及所有特征。
# auto-tune a random forest
grid_rf <- expand.grid(.mtry = c(2, 4, 8, 16))
當隨機森林在每一次划分中用到所有特征時,實際上它與bagging決策樹是一樣的。
③train模型
set.seed(300)
m_rf <- train(default ~ ., data = credit, method = "rf",
metric = "Kappa", trControl = ctrl,
tuneGrid = grid_rf)
m_rf
以上工作非常耗時!
我們將它的結果與使用10、20、30、40次迭代來與boosting樹進行比較。
# auto-tune a boosted C5.0 decision tree
grid_c50 <- expand.grid(.model = "tree",
.trials = c(10, 20, 30, 40),
.winnow = "FALSE")
set.seed(300)
m_c50 <- train(default ~ ., data = credit, method = "C5.0",
metric = "Kappa", trControl = ctrl,
tuneGrid = grid_c50)
m_c50
結果表明,最好的隨機森林模型比最好的C5.0決策樹模型略勝一籌。
機器學習與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-如何提高模型的性能?