【发布时间】:2019-07-31 06:57:36
【问题描述】:
我已经实现了梯度提升决策树来进行多类分类。我的自定义损失函数如下所示:
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,所以只是一个实数)。 有没有办法同时考虑错误分类和惩罚值?
【问题讨论】:
-
Devianceloss,在GradientBoostingClassifier中使用已经会惩罚错误分类。您要添加的特殊约束是什么?你能补充一下它的细节吗? -
是否可以调整偏差损失以增加惩罚?要理解约束需要整个模型......但我认为知道约束的惩罚(之前计算过)在 0 到 5% 之间就足够了
标签: python machine-learning scikit-learn