spark xgboost自定義損失函數(shù)和評價函數(shù)
一、spark xgboost自定義損失函數(shù)
image
xgboost定義損失函數(shù)的是通過setCustomObj定義玉锌,要想定義損失函數(shù)疟羹,首先我們得知道其接收的數(shù)據(jù)類型是什么類型的
image
可見它需要的數(shù)據(jù)類型是ObjectiveTrait的實現(xiàn)類。
image
可見救湖,我們只需重載getGradient方法即可涎才。代碼如下
/**
* 自定義損失函數(shù)
*/
class MyObject extends ObjectiveTrait {
@Override
def getGradient(predicts: Array[Array[Float]], dtrain: DMatrix): List[Array[Float]] = {
var penalty = 1.0f
val weight: Array[Float] = dtrain.getWeight
//定義懲罰系數(shù)和指數(shù)
//指數(shù)
val label = dtrain.getLabel //得到訓(xùn)練數(shù)據(jù)的lable值
val gradArr = new Array[Float](label.length)
val hasArr = new Array[Float](label.length)
val resList = new ListBuffer[Array[Float]]
for (i: Int <- label.indices) {
//每個樣本計算其一階導(dǎo)數(shù)
gradArr(i) = -penalty*label(i) / predicts(i)(0) + (1 - label(i) )/ (1 - predicts(i)(0))
gradArr(i) = gradArr(i) * weight(i)
hasArr(i) = penalty *(label(i) / Math.pow(predicts(i)(0), 2)).toFloat
+(1 - label(i))/ Math.pow(1 - predicts(i)(0), 2) //每個樣本計算其二階導(dǎo)數(shù)
hasArr(i) = hasArr(i) * weight(i)
println(gradArr(i))
println(hasArr(i))
}
resList.append(gradArr)
resList.append(hasArr)
resList.toList
}
}
掉坑記錄1:以后list的長度和樣本的長度一樣耍铜,然后array是二維的。實際上是list的長度是2棕兼,list(0)放的是一階導(dǎo)數(shù)的值伴挚,list(1)是二階導(dǎo)數(shù)的值