【问题标题】:grid search with weighted AUC加权 AUC 的网格搜索
【发布时间】:2016-04-12 09:16:58
【问题描述】:

所以我使用的是样本权重函数,我不想使用默认的 sklearn 评分函数来衡量性能。

看起来它说Here 我可以传递GridSearchCV 字符串'roc_auc',它应该为我计算auc,但它计算的auc 是加权的auc 还是只是普通的auc?

【问题讨论】:

  • 看来GridSearchCV 不支持sample_weight。您可以在没有权重的情况下调整模型,使用cross_val_predict,然后自己加权评分。我猜这不是你要找的。​​span>
  • GridSearchCV 通过fit_params 选项接受样本权重(因为需要将样本权重传递给fit 方法)。我还在使用RandomizedSearchCV,这需要相当多的复杂性才能使用cross_val_predict 进行复制,所以我希望scorer 自动处理权重,但我似乎在文档中找不到任何内容。
  • 这真的有效吗?权重也需要分成褶皱。它们不能天真地传递给 fit 函数。
  • 是的,它有效。由于输入 cv 只是一个索引,因此它只是将该索引应用于样本权重,其方式与对 X 和 y 矩阵的处理方式相同。您不会将其传递给网格搜索中的 fit 函数,而是传递给 fit_params 选项。我确信这部分有效,但我不确定任何得分手都会被传递类似的论点。
  • 我不敢相信它有效,但它确实有效。它不会将sample_weight 传递给记分员:-(

标签: scikit-learn grid-search auc


【解决方案1】:

感谢书呆子狙击。

我制作了一个二元分类数据集来测试这个问题。

x y weight 
0 0   1
1 1   1
<repeated 25 times>
0 1   0
1 0   0
<repeated 25 times>

使用python:

X = np.array([[0], [1]] * 25 +  [[0], [1]] * 25)
y = np.array([ 0 ,  1 ] * 25 +  [ 1 ,  0 ] * 25)
w = np.array([ 1 ,  1 ] * 25 +  [ 0 ,  0 ] * 25)

在这个数据集中,我们可以看到,如果存在样本权重,模型将产生非常好的拟合并且对数损失非常低。如果权重不存在,损失将非常高。

然后我们可以构建使用GridSearchCV来查看是否使用了权重。

clf = LogisticRegression(solver='newton-cg', C=100)
gs = GridSearchCV(clf, {},
                  fit_params={"sample_weight": w}, 
                  scoring="log_loss", cv=KFold(y.shape[0],10, shuffle=True))
gs.fit(X,y)
gs.grid_scores_

[mean: -2.68562, std: 0.68038, params: {}]

我们可以看到损失相当高,这表明没有使用权重。

我为 scikit-learn 写了一个补丁来解决这个问题。请认为它是实验性的。 https://github.com/scikit-learn/scikit-learn/compare/master...dmaust:master

应用补丁后,我们可以启用score_sample_weight,重复之前的测试,可以看到考虑权重后我们期望的日志损失。

gs.score_sample_weight=True
gs.fit(X,y)
gs.grid_scores_

[mean: -0.00486, std: 0.00016, params: {}]

【讨论】:

  • 还没有。计划很快
  • 是的。您可能暂时可以替换交叉验证模块中的两种方法。
猜你喜欢
  • 2016-10-07
  • 2019-06-06
  • 2019-06-06
  • 2016-07-26
  • 2020-10-06
  • 2020-02-28
  • 1970-01-01
  • 2013-09-14
  • 2019-03-25
相关资源
最近更新 更多