創建包含參數並可彙總訓練數據子集的caret::train
中使用的自定義度量標準函數的正確方法是什麼?按組分類的「k精度」的自定義省略度量標準
想象一下,我們有信用評分和貸款數據,並希望通過培訓模型來預測不同類別的貸款(住房抵押貸款,汽車貸款,學生貸款等)內的最高貸款前景。我們有限的金額並希望分散我們的投資組合,因此我們希望在每個類別中找出少數低風險貸款。
作爲示例,我們可以使用caret
包中的GermanLoans
數據。在這些培訓數據中,每筆貸款都歸類爲「好」或「差」。在重新安排一些欄目後,我們有Purpose
這一列標識了所請求貸款的類型。
## Load packages
library(data.table); library(caret); library(xgboost); library(Metrics)
## Load data and convert dependent variable (Class) to factor
data(GermanCredit)
setDT(GermanCredit, keep.rownames=TRUE)
GermanCredit[, `:=`(rn=as.numeric(rn), Class=factor(Class, levels=c("Good", "Bad")))]
## Now we need to collapse a few columns...
## - Columns containing purpose for getting loan
colsPurpose <- names(GermanCredit)[names(GermanCredit) %like% "Purpose."]
## - Replace purpose columns with a single factor column
GermanCredit[, Purpose:=melt(GermanCredit, id.var="rn", measure.vars=colsPurpose)[
value==1][order(rn), factor(sub("Purpose.", "", variable))]]
## - Drop purpose columns
GermanCredit[, colsPurpose:=NULL, with=FALSE]
現在我們需要創建自定義度量函數。像precision at k(其中k
是我們希望在每個類別中進行的貸款數量)在羣組上平均看起來是合適的,但我願意接受建議。在任何情況下,函數應該看起來像這樣:
twoClassGroup <- function (data, lev=NULL, model=NULL, k, ...) {
if(length(levels(data$obs)) > 2)
stop(paste("Your outcome has", length(levels(data$obs)),
"levels. The twoClassGroup() function isn't appropriate."))
if (!all(levels(data$pred) == levels(data$obs)))
stop("levels of observed and predicted data do not match")
[subset the data, probably using data$rowIndex]
[calculate the metrics, based on data$pred and data$obs]
[return a named vector of metrics]
}
最後,我們可以訓練模型。
## Train a model (just an example; may or may not be appropriate for this problem)
creditModel <- train(
Class ~ . - Purpose, data=GermanCredit, method="xgbTree",
trControl=trainControl(
method="cv", number=6, returnResamp="none", summaryFunction=twoClassGroup,
classProbs=TRUE, allowParallel=TRUE, verboseIter=TRUE),
tuneGrid = expand.grid(
nrounds=500, max_depth=6, eta=0.02, gamma=0, colsample_bytree=1, min_child_weight=6),
metric="someCustomMetric", preProc=c("center", "scale"))
## Add predictions
GermanCredit[, `:=`(pred=predict(creditModel, GermanCredit, type="raw"),
prob=predict(creditModel, GermanCredit, type="prob")[[levels(creditModel)[1]]])]
問題
- 我如何通過k的以
twoClassGroup
從train
呼叫的價值?在主函數參數中添加它不起作用,也不在trControl
或tuneGrid
中添加它。 - 如何在
twoClassGroup
範圍內對數據進行子集分析,以計算每個值Purpose
內前k個值的模型精度?twoClassGroup
函數中的data
對象與傳遞給原始train
函數的對象不同。