【问题标题】:Customize loss-function sklearn自定义损失函数 sklearn
【发布时间】:2017-04-04 21:21:26
【问题描述】:

我想在一个数据科学项目中进行预测,误差是通过非对称函数计算出来的。

是否可以调整随机森林或梯度提升(sklearn)的损失函数?

我已阅读需要修改 .pyx 文件,但我在我的 sklearn 文件夹中找不到任何文件(我在 ubuntu 14.04 LTS 上)。

你有什么建议吗?

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    是的,可以调整。例如:

    class ExponentialPairwiseLoss(object):
        def __init__(self, groups):
            self.groups = groups
    
        def __call__(self, preds, dtrain):
            labels = dtrain.get_label().astype(np.int)
            rk = len(np.bincount(labels))
            plus_exp = np.exp(preds)
            minus_exp = np.exp(-preds)
            grad = np.zeros(preds.shape)
            hess = np.zeros(preds.shape)
            pos = 0
            for size in self.groups:
                sum_plus_exp = np.zeros((rk,))
                sum_minus_exp = np.zeros((rk,))
                for i in range(pos, pos + size, 1):
                    sum_plus_exp[labels[i]] += plus_exp[i]
                    sum_minus_exp[labels[i]] += minus_exp[i]
                for i in range(pos, pos + size, 1):
                    grad[i] = -minus_exp[i] * np.sum(sum_plus_exp[:labels[i]]) +\
                              plus_exp[i] * np.sum(sum_minus_exp[labels[i] + 1:])
                    hess[i] = minus_exp[i] * np.sum(sum_plus_exp[:labels[i]]) +\
                              plus_exp[i] * np.sum(sum_minus_exp[labels[i] + 1:])
                pos += size
            return grad, hess
    

    【讨论】:

    • 一旦你像上面那样定义了一个类,你如何将它作为参数传递给 Sklearn 中的分类器?谢谢
    • 如何将其集成到模型本身中?
    【解决方案2】:

    您无需更改任何文件中的任何内容。

    修改.py 文件通常是个坏主意,应该避免这样做。

    如果您想创建自己的评分函数,here 是指向 sklearn 的文档的链接,其中显示了如何执行此操作。

    【讨论】:

    • 您的链接用于评分,而不是用于训练的目标函数。
    • 错了。可以在训练期间优化链接的“评分功能”。
    • 感谢 MMF,但我像米哈伊尔一样理解。我了解到您的链接显示构建由 scikitlearn 执行的 k 折交叉验证使用的记分器。您链接中的记分器不用于生长树过程。
    • Alex Miller 展示了如何为线性回归定义自定义目标函数(它只是根据任意损失函数计算误差)。 alex.miller.im/posts/…
    • 目标函数决定了如何更新/优化系数。评分函数选择哪一组优化系数相对于其他优化系数组“更好”。我不确定仅自定义其中一个是否可以实际实现类似的优化系数集。
    猜你喜欢
    • 2020-12-19
    • 2017-12-18
    • 2020-03-27
    • 2020-11-16
    • 2019-05-27
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多