【问题标题】:Optimal parameter estimation for a classifier with multiple parameters多参数分类器的最优参数估计
【发布时间】:2017-02-15 10:15:14
【问题描述】:

左图显示了通过扫描单个阈值并记录相应的真阳性率 (TPR) 和假阳性率 (FPR) 形成的标准 ROC 曲线。

右图显示了我的问题设置,其中有 3 个参数,对于每个参数,我们只有 2 个选择。如图所示,它总共产生 8 个点。在实践中,我打算有数千种可能的 100 参数组合,但在这个缩小的情况下,概念保持不变。

我打算在这里找到两件事:

  • 确定给定数据的最佳参数
  • 为所有参数组合提供整体性能得分

对于左侧的 ROC 曲线,可以使用以下方法轻松完成:

  • 最优参数:TPR 和 FPR 的最大差异与成本成分(我相信它被称为 J 统计量?)
  • 整体性能:曲线下面积(图中阴影部分)

但是,对于我在右图中的情况,我不知道我选择的方法是否是通常使用的标准原则方法。

  • 最优参数集:TPR和FPR的最大差值相同

    参数分数 = TPR - FPR * cost_ratio

  • 总体性能:所有“参数分数”的平均值

我找到了很多关于具有单一阈值的 ROC 曲线的参考资料,虽然还有其他技术可用于确定性能,但这个问题中提到的那些绝对被认为是一种标准方法。对于右边的场景,我没有找到这样的阅读材料。

底线,这里的问题有两个:(1)提供方法来评估我的问题场景中的最佳参数集和整体性能,(2)提供声称建议的方法是给定方法的标准方法的参考场景。

P.S.:我第一次在“Cross Validated”论坛上发布了这个问题,但没有得到任何回应,事实上,在 15 小时内只有 7 次浏览。

【问题讨论】:

  • 你能描述一下你正在使用的模型吗?我不清楚您所说的“多个阈值”是什么意思。您的模型是否输出多个概率而不是单个概率?如果是这种情况,也许你想将它们组合成一个概率,然后你可以 ROC_AUC
  • @maxymoo,这与输出无关。它是关于训练和验证,以及选择最佳参数集。有关示例参数网格,请参阅 ncfirth 的答案。我想知道的是,如果没有从输入参数中绘制的“曲线”而是点阵,如何计算 roc_auc 。此外,是否还有其他首选的评分指标(我认为成本矩阵的准确性可能与曲线无关)

标签: machine-learning scikit-learn mathematical-optimization roc


【解决方案1】:

我将稍微扩展aberger 先前关于网格搜索的答案。与模型的任何调整一样,最好使用一部分数据优化超参数并使用另一部分数据评估这些参数,因此GridSearchCV 最适合此目的。

首先我将创建一些数据并将其拆分为训练和测试

import numpy as np
from sklearn import model_selection, ensemble, metrics

np.random.seed(42)

X = np.random.random((5000, 10))
y = np.random.randint(0, 2, 5000)

X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.3)

这给了我们一个分类问题,这就是我认为您所描述的,尽管这也适用于回归问题。

现在考虑一下您可能想要优化哪些参数会很有帮助。交叉验证的网格搜索是一个计算量大的过程,因此搜索空间越小,完成的速度就越快。我将展示一个RandomForestClassifier 的示例,因为它是我的首选模型。

clf = ensemble.RandomForestClassifier()    
parameters = {'n_estimators': [10, 20, 30],
              'max_features': [5, 8, 10],
              'max_depth': [None, 10, 20]}

所以现在我有了我的基本估计器和一个我想要优化的参数列表。现在我只需要考虑如何评估我将要构建的每个模型。从您的问题来看,您似乎对 ROC AUC 感兴趣,所以这就是我将用于此示例的内容。尽管您可以从 scikit 中的许多默认指标中进行选择,甚至可以定义自己的指标。

gs = model_selection.GridSearchCV(clf, param_grid=parameters,
                                  scoring='roc_auc', cv=5)
gs.fit(X_train, y_train)

这将为我给出的所有可能的参数组合拟合一个模型,使用 5 折交叉验证评估这些参数使用 ROC AUC 的执行情况。一旦适合了,我们就可以查看最佳参数并提取性能最佳的模型。

print gs.best_params_
clf = gs.best_estimator_

输出:

{'max_features': 5, 'n_estimators': 30, 'max_depth': 20}

现在,您可能希望在所有训练数据上重新训练分类器,因为目前它是使用交叉验证进行训练的。有些人不喜欢,但我是一名再培训师!

clf.fit(X_train, y_train)

所以现在我们可以评估模型在我们的训练集和测试集上的表现。

print metrics.classification_report(y_train, clf.predict(X_train))
print metrics.classification_report(y_test, clf.predict(X_test))

输出:

             precision    recall  f1-score   support

          0       1.00      1.00      1.00      1707
          1       1.00      1.00      1.00      1793

avg / total       1.00      1.00      1.00      3500

             precision    recall  f1-score   support

          0       0.51      0.46      0.48       780
          1       0.47      0.52      0.50       720

avg / total       0.49      0.49      0.49      1500

我们可以看到,该模型已因测试集上的低分而过度训练。但这并不奇怪,因为数据只是随机噪声!希望在对带有信号的数据执行这些方法时,您最终会得到一个经过良好调整的模型。

编辑

这是“每个人都这样做”的情况之一,但没有真正明确的参考可以说这是最好的方法。我建议寻找一个接近您正在处理的分类问题的示例。比如用谷歌学术搜索“网格搜索”“SVM”“基因表达”

【讨论】:

  • 哇,我不知道还有其他培训师!谢谢你的解释。它帮助我专注于我想问的问题。你做了print gs.best_params_,它返回了最好的参数。您的 param_grid 看起来与我的设置完全相同。我正在尝试自己进行评分,这意味着,如果我使用类似于 ROCAUC 的东西,那么我需要知道它是如何完成的。给定您的param_gridbest_params_ 是如何计算的?对每个网格实例使用 TPR-FPR?
  • 是的,它只是为每个网格实例训练模型并计算分数。 best_params_ 被定义为给定评分方法和数据的最佳网格实例。可以创建自己的记分器并将其传递给GridSearchCV 函数,文档对此有一些信息。
  • 这方面的文档很少。你不可能使用梯形规则,就像我的或你的问题的设置方式一样,你没有得到一系列(TPR,FPR)对,它们形成一条曲线。这是一连串的点,就像我在右边的图表一样。如果你有一个成本矩阵,我知道如何使用成本矩阵计算准确度,但在这种情况下,AUC 的计算对我来说是个谜。
【解决方案2】:

我感觉我们在谈论 scikit-learn 中的 Grid Search。它 (1) 提供了评估最佳(超)参数的方法,并且 (2) 在一个广受欢迎且被广泛引用的统计软件包中实现。

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2018-02-17
    • 2011-07-03
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多