10

我想在 scikit learn 中实现自定义损失函数。我使用以下代码片段:

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

score=make_scorer(my_custom_loss_func,greater_ is_better=False)
clf=RandomForestRegressor()
mnn= GridSearchCV(clf,score)
knn = mnn.fit(feam,labm) 

传入的参数应该是什么my_custom_loss_func?我的标签矩阵称为labm. 我想计算实际输出和预测输出(由模型)乘以真实输出之间的差异。如果我使用labm代替y_true,我应该使用什么代替y_pred

4

3 回答 3

22

好的,这里发生了 3 件事:

1)训练时有一个损失函数用于调整模型参数

2)有一个评分功能,用于判断模型的质量

3)有超参数调整,它使用评分功能来优化你的超参数。

所以......如果您正在尝试调整超参数,那么您在为此目的定义“损失 fxn”时处于正确的轨道上。但是,如果您正在尝试调整整个模型以使其在召回测试中表现良好 - 那么您需要召回优化器作为训练过程的一部分。这很棘手,但你可以做到......

1)打开你的分类器。让我们以 RFC 为例:https ://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

2) 点击【来源】

3) 看看它是如何从 ForestClassifier 继承的?就在类定义中。单击该单词以跳转到它的父定义。

4) 看看这个新对象是如何从 ClassifierMixin 继承的?点击那个。

5) 看看 ClassifierMixin 类的底部是怎么说的?

from .metrics import accuracy_score
return accuracy_score(y, self.predict(X), sample_weight=sample_weight)

那是您的模型正在接受准确性培训。如果要将模型训练为“召回模型”或“精确模型”或任何模型,则需要在此时注入。这个准确度指标被烘焙到 SKlearn 中。总有一天,一个比我更好的人会将这个参数设置为模型接受的参数,但是与此同时,你必须进入你的 sklearn 安装,并将这个 accuracy_score 调整为你想要的任何值。

祝你好运!

于 2019-10-24T22:53:43.710 回答
1

make_scorer 的文档是这样的:

sklearn.metrics.make_scorer(score_func, greater_is_better=True, needs_proba=False, 
needs_threshold=False, **kwargs)

因此,它不需要您在调用函数时传递参数。这是你问的吗?

于 2019-01-19T14:13:55.097 回答
0

您的 my_custom_func_loss 的参数与您的真实标签(即labm. 你可以保持现在的方式。

在内部 GridSearchCV 将调用评分函数,因此您的真实标签不会在那里发生冲突。y_pred将是从模型的输出生成的预测值。y_true将被赋予 的值labm

于 2019-01-19T14:57:00.347 回答