自定义loss-function sklearn

M.L*_*LTA 17 python scikit-learn

我想在数据科学项目中进行预测,并通过非对称函数计算误差.

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

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

你有什么建议吗?

小智 6

是的,可以调整.例如:

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
Run Code Online (Sandbox Code Playgroud)

  • 一旦你定义了一个像上面这样的类,你如何将它作为参数传递给Sklearn中的分类器?谢谢 (18认同)
  • 如何将其集成到模型本身中? (2认同)

MMF*_*MMF -2

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

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

如果您想创建自己的评分函数,这里有一个指向 的文档的链接sklearn,其中显示了如何操作。

  • 您的链接用于评分,而不是用于训练的目标函数。 (23认同)
  • 错误的。与之相关的“评分函数”可以在训练期间进行优化。 (4认同)
  • Alex Miller 展示了如何为线性回归定义自定义目标函数(它只是根据任意损失函数计算误差)。https://alex.miller.im/posts/linear-model-custom-loss-function-regularization-python/ (4认同)
  • 谢谢MMF,但我像米哈伊尔一样理解。我了解到您的链接显示了构建由 scikitlearn 执行的 k 倍交叉验证所使用的评分器。您链接中的记分器未在生长树过程中使用。 (3认同)