我想在scikit-learn中实现一个自定义的loss函数。我使用以下代码片段:
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
?
好吧,这里有三件事:
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安装,并将这个精度_核心调整为你想要的任何值。
祝你好运!
make_scorer的文档如下:
sklearn.metrics.make_scorer(score_func, greater_is_better=True, needs_proba=False,
needs_threshold=False, **kwargs)
因此,它不需要您在调用函数时传递参数。这是你问的吗?
my_custom_fonc_loss的参数与真正的标签labm
没有任何联系。你可以保持现在的方式。
内部GridSearchCV将调用评分函数,因此您的真实标签不会在那里发生冲突。y_pred
将是根据模型的输出生成的预测值。CCD_ 8将被分配有CCD_ 9的值。