spark xgboost损失函数和评价函数的修改

spark xgboost自定义损失函数和评价函数

一、spark xgboost自定义损失函数

image

xgboost定义损失函数的是通过setCustomObj定义,要想定义损失函数,首先我们得知道其接收的数据类型是什么类型的


image

可见它需要的数据类型是ObjectiveTrait的实现类。


image

可见,我们只需重载getGradient方法即可。代码如下
/**
    * 自定义损失函数
    */
  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
      //定义惩罚系数和指数
      //指数
      val label = dtrain.getLabel //得到训练数据的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) {
        //每个样本计算其一阶导数
        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) //每个样本计算其二阶导数
        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)放的是一阶导数的值,list(1)是二阶导数的值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 之前介绍过梯度下降法与牛顿法,GBDT与XGBoost就与这两种方法有关。 boosting(包括GBDT、XGB...
    小松qxs阅读 24,317评论 0 31
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,545评论 0 13
  • 本章涉及到的知识点清单:1、boosting模式2、集成学习模型的偏差和方差3、bagging的偏差和方差4、bo...
    PrivateEye_zzy阅读 4,935评论 0 6
  • 晚上睡觉前梦宝问我,“妈妈,明天晚上可以和你们一起睡吗?” 额(⊙o⊙)…这个问题最近总在梦宝的...
    梦与凡华阅读 226评论 0 0
  • 今天是学习的第9天,一直以来,我们都在用哲学的思想思考人生,或者艺术的角度思考人生,我从来没有用数学的思维思考人生...
    宇宙公民熙媛阅读 421评论 0 0