【问题标题】:Custom function in make_scorer in sklearnsklearn中make_scorer中的自定义函数
【发布时间】:2020-07-26 03:29:02
【问题描述】:

我正在尝试创建一个自定义评分函数以在 GridSearchCV 中实现分类问题,但我认为我不太了解它的工作原理(我已阅读文档)。我的目标是对错误分类的类型赋予不同的权重。我的代码如下所示。 goodexcellent 是我的样本所属的两个类别。我认为问题在于GridSearchCV 将真实值和预测值传递给score_func 但我不确定如何解决它。

def score_func(y, y_pred):
    '''score function for grid search'''
    error = 0
    for i in range(len(y)):
        if y[i] == 'excellent':
            if y_pred[i] == 'excellent':
                error += 10
            elif y_pred[i] == 'good':
                error += 5
    return error

score_f = make_scorer(score_func, needs_proba=False ,needs_threshold=False)

RF = make_pipeline(
        StandardScaler(),
        RandomForestClassifier(random_state=101, criterion = 'gini')
        )

gs_rf = GridSearchCV(estimator=RF, param_grid=param_grid, scoring=score_f, 
                     cv=KFold(5, True, random_state=1234)).fit(X_data,y_data)

提前致谢!

【问题讨论】:

  • make_scorer() 定义在哪里?
  • make_scorer 不是函数,它是从 sklearn 导入的指标。检查它here
  • 对,它是 sklearn.metrics 中的一个指标,我应该能够在其中定义和实现自己的评分函数here

标签: python machine-learning scikit-learn classification scoring


【解决方案1】:

如果您的目标是为标签关联权重,则无需创建函数。

只需使用RandomForestClassifier 中的class_weight 参数即可。

weight_dict = {'excellent':10, 'good':5}
RandomForestClassifier(random_state=101, criterion='gini', class_weight=weight_dict)

【讨论】:

  • 谢谢!虽然比如说我有 3 个班级,“优秀”、“好”和“差”。我想说的是,将excellent 样本误分类为good 不如将excellent 样本误分类为poor 严重,我可以使用class_weight 来做到这一点吗?我的想法是,如果我如上所述定义了一个得分函数,我可以说error += 0 是模型将样本错误分类为poor。这样我就可以量化错误分类的差异。
  • 我只是对它进行一个小研究,并在这里为您提供反馈。
  • 您好。我刚刚找到了这个link。意思是您可以为每个类概率定义一个阈值,而不是为类定义权重。只需阅读它并尝试定义决策阈值。请回到这里说它是否有效。
  • This other questin in SO 也可以帮到你。
  • 完美,我现在就去研究一下!感谢您的帮助!
猜你喜欢
  • 2018-03-14
  • 1970-01-01
  • 2020-06-17
  • 2017-04-04
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2015-09-24
相关资源
最近更新 更多