在 scikit learn 中自定义损失函数

Posted

技术标签:

【中文标题】在 scikit learn 中自定义损失函数【英文标题】:Customising loss functions in scikit learn 【发布时间】:2019-06-13 00:47:08 【问题描述】:

如何?例如,我想使用 MSE 乘以样本的真实值,而不是使用均方误差。我使用了以下代码sn-p:

def my_custom_loss_func(y_true,y_pred):
    diff3=(abs(y_true-y_pred))*y_true
    return diff3

clf=RandomForestRegressor(criterion=my_custom_loss_func)
knn=clf.fit(feam,labm)

我收到以下错误:

KeyError: <function my_custom_loss_func at 0x000000002EA9CA60>

【问题讨论】:

@franco piccolo 传递给 my_custom_loss_func 的参数应该是什么? scikit learn 中是否预定义了 y_pred 和 y_true?我的标签矩阵是labm。如果我用labm代替y_true,我应该用什么代替y_pred? 【参考方案1】:

您可以在 scikit learn 中自定义损失函数,为此您需要将 make_scorer 工厂应用于您的自定义损失函数,例如:

from sklearn.metrics import make_scorer
score = make_scorer(my_custom_loss_func, greater_is_better=False)

在您使用随机森林的特定情况下,尽管您无法自定义标准,但您可以做的是使用 GridSearchCV 优化超参数,然后您可以使用自定义损失。

【讨论】:

你确定吗?我认为这只是 RandomForestRegressor 不接受自定义标准.. 没错,我只是笼统地回答了,现在我为他的特殊情况建议了 GridSearchCV。 make_scorer 工厂用于自定义指标(可能是潜在的损失函数)。我认为区分 (metric / loss ) 很重要,我会说在 scikit-learn 上您很少能轻松使用自定义损失函数(如果您触摸源代码除外),但您可以使用超参数搜索自定义指标。 记分器和损失函数不同,所以这不是 OP 的答案 @FrancoPiccolo 传递给自定义损失函数的参数应该是什么? scikit learn 中是否预定义了 y_true 和 y_pred?我的标签矩阵被命名为“labm”。如果我用它代替 y_true,我应该用什么代替 y_pred?

以上是关于在 scikit learn 中自定义损失函数的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Scikit-learn 分类器添加加权损失?

带权重的 Scikit-Learn 分类和回归

PyTorch 中自定义后向函数的损失 - 简单 MSE 示例中的爆炸损失

为啥带有铰链损失的 SGDClassifier 比 scikit-learn 中的 SVC 实现更快

如何在交叉验证中获得 Keras scikit-learn 包装器的训练和验证损失?

keras 和 scikit-learn 中 MLP 回归器的不同损失值和准确度