自定义损失函数 sklearn
Posted
技术标签:
【中文标题】自定义损失函数 sklearn【英文标题】:Customize loss-function sklearn 【发布时间】:2017-04-04 21:21:26 【问题描述】:我想在一个数据科学项目中进行预测,误差是通过非对称函数计算出来的。
是否可以调整随机森林或梯度提升(sklearn)的损失函数?
我已阅读需要修改 .pyx 文件,但我在我的 sklearn 文件夹中找不到任何文件(我在 ubuntu 14.04 LTS 上)。
你有什么建议吗?
【问题讨论】:
【参考方案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/… 目标函数决定了如何更新/优化系数。评分函数选择哪一组优化系数相对于其他优化系数组“更好”。我不确定仅自定义其中一个是否可以实际实现类似的优化系数集。以上是关于自定义损失函数 sklearn的主要内容,如果未能解决你的问题,请参考以下文章
sklearn基于make_scorer函数构建自定义损失函数或者评估指标
sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss)
sklearn基于make_scorer函数为Logistic模型构建自定义损失函数并可视化误差图(lambda selection)和系数图(trace plot)+代码实战