【问题标题】:Implementing custom loss function in scikit learn在 scikit learn 中实现自定义损失函数
【发布时间】:2019-06-13 12:45:07
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    好的,这里发生了 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 调整为你想要的任何值。

    祝你好运!

    【讨论】:

    • 今天仍然如此吗?
    【解决方案2】:

    您的 my_custom_func_loss 的参数与您的真实标签(labm)没有任何关系。你可以保持现在的方式。

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

    【讨论】:

      【解决方案3】:

      make_scorer 的文档是这样的:

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

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

      【讨论】:

      • 我的意思是在定义函数 my_custom_func_loss(我的代码的第一行)时,我需要传递参数对吗?没有参数,我如何编写函数的主体?我问的是那些论点。这里我通过了 y_true 和 y_pred。
      • 是的!你只需要这两个参数。但是,如果你想传递一些额外的参数,你可以这样做: score_func(y, y_pred, **kwargs) 其中 **kwargs 是你想要传递的额外参数
      • 我的意思是默认情况下 y 将被分配标签矩阵和 y_pred 模型的预测值?我不需要在代码中定义这些值吗?我见过人们写真理,预测。那么我们可以写任何东西作为论点和 scikit learn 将能够做出来的吗?好像有点奇怪。
      • 请看,如果您按顺序传递它们,它将采用您在函数中定义的参数。例如:假设我们有一个类似 costFunc(y, y_pred) 的函数。现在,如果您传递诸如 costFunc(labels, predictions) 之类的值,那么标签将传递给 y,而预测将传递给 y_pred。但是,您可以这样做:costFunc(y_pred = predictions, y = labels)。如您所见,如果您提及姓名并通过,则不再需要订单。
      • 我的意思是默认情况下 scikit learn 会假设第一个参数是真实标签,第二个参数对应于预测的模型输出?如果我只写 y 和 y_pred,而没有在任何地方明确提及什么是 y 和什么是 y_pred,它仍然可以工作吗?
      猜你喜欢
      • 2019-06-13
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 2019-12-16
      • 2020-07-29
      • 2017-08-20
      • 2018-05-25
      • 1970-01-01
      相关资源
      最近更新 更多