在scikit学习中实现自定义丢失功能

时间:2019-01-19 13:47:48

标签: python machine-learning scikit-learn data-science gridsearchcv

我想在scikit learning中实现自定义损失功能。我使用以下代码段:

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。我想计算实际输出和预测输出之间的差异(通过model)乘以真实输出。如果我用labm代替y_true,应该用什么代替y_pred

3 个答案:

答案 0 :(得分:1)

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

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安装,并将这个precision_score调整为您想要的任何值。

祝你好运!

答案 1 :(得分:0)

make_scorer的文档如下:

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

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

答案 2 :(得分:0)

my_custom_func_loss的参数与真实标签labm没有任何关系。您现在可以保持原样。

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