在 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 中自定义损失函数的主要内容,如果未能解决你的问题,请参考以下文章
PyTorch 中自定义后向函数的损失 - 简单 MSE 示例中的爆炸损失
为啥带有铰链损失的 SGDClassifier 比 scikit-learn 中的 SVC 实现更快