调整自定义损失函数以进行梯度提升分类

时间:2019-03-09 11:23:32

标签: python machine-learning scikit-learn

我已经实现了梯度增强决策树来进行多类别分类。我的自定义损失函数如下所示:

import numpy as np
from sklearn.preprocessing import OneHotEncoder
def softmax(mat):
    res = np.exp(mat)
    res = np.multiply(res, 1/np.sum(res, axis=1, keepdims=True))
    return res
def custom_asymmetric_objective(y_true, y_pred_encoded):
    pred = y_pred_encoded.reshape((-1, 3), order='F')
    pred = softmax(pred)
    y_true = OneHotEncoder(sparse=False,categories='auto').fit_transform(y_true.reshape(-1, 1))
    grad = (pred - y_true).astype("float")
    hess = 2.0 * pred * (1.0-pred)
    return grad.flatten('F'), hess.flatten('F')


def custom_asymmetric_valid(y_true, y_pred_encoded):
    y_true = OneHotEncoder(sparse=False,categories='auto').fit_transform(y_true.reshape(-1, 1)).flatten('F')
    margin = (y_true - y_pred_encoded).astype("float")
    loss = margin*10
    return "custom_asymmetric_eval", np.mean(loss), False

一切正常,但是现在我想通过以下方式调整损失函数:如果某项的分类不正确,它应该“惩罚”,并且应该为一定的约束加罚分(这是之前计算得出的,比方说罚款是0,05,所以只是一个实数)。 有什么办法可以同时考虑错误分类和惩罚值吗?

1 个答案:

答案 0 :(得分:0)

尝试L2正则化:权重将减去learning rate乘以error乘以x乘以惩罚项lambda weight之2

L2 Regularization

简化:

L2 Simple

这将是效果:

Overfit

已添加:惩罚项(在等式右边)增加了模型的泛化能力。因此,如果您在训练集中过度拟合模型,则测试集中的性能将很差。因此,您要对训练集中的这些“正确”分类进行惩罚,这些分类会在测试集中产生错误并影响泛化。