自定义亏本函数sklearn

时间:2016-11-21 13:02:43

标签: python scikit-learn

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

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

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

你有什么建议吗?

2 个答案:

答案 0 :(得分:5)

是的,可以调整。例如:

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

答案 1 :(得分:-1)

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

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

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