我想在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
?
答案 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
的值。