Machine learning 多参数分类器的最优参数估计

Machine learning 多参数分类器的最优参数估计,machine-learning,scikit-learn,mathematical-optimization,roc,Machine Learning,Scikit Learn,Mathematical Optimization,Roc,左边的图像显示了一条标准ROC曲线,该曲线通过扫描单个阈值并记录相应的真阳性率(TPR)和假阳性率(FPR)形成 右边的图片显示了我的问题设置,其中有3个参数,每个参数只有2个选择。如图所示,它总共生成8个点。实际上,我打算有上千种可能的100个参数的组合,但在这种缩小比例的情况下,概念保持不变 我打算在这里找到两件事: 确定给定数据的最佳参数 提供所有参数组合的总体性能分数 对于左侧的ROC曲线,可以使用以下方法轻松完成: 最佳参数:TPR和FPR的最大差值,带有成本成分(我相信它被称为

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

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

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

  • 确定给定数据的最佳参数
  • 提供所有参数组合的总体性能分数
对于左侧的ROC曲线,可以使用以下方法轻松完成:

  • 最佳参数:TPR和FPR的最大差值,带有成本成分(我相信它被称为J统计量?)
  • 整体性能:曲线下的面积(图中阴影部分)
然而,对于右边图片中的例子,我不知道我选择的方法是否是通常使用的标准原则方法

  • 最佳参数设置:TPR和FPR的最大差值相同

    参数得分=TPR-FPR*成本率

  • 总体绩效:所有“参数得分”的平均值

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

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


注:我第一次在“交叉验证”论坛上发布了这个问题,但没有得到任何回应,事实上,15小时内只有7次浏览

我觉得我们在讨论scikit learn。它(1)提供了评估最佳(超)参数的方法,(2)在一个广受欢迎且引用良好的统计软件包中实现。

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

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

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
的示例,因为它是我的go-to模型

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}
             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
现在,您可能希望在所有训练数据上重新训练分类器,因为目前它是使用交叉验证训练的。有些人不喜欢,但我是一名再培训者

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))
产出:

{'max_features': 5, 'n_estimators': 30, 'max_depth': 20}
             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
我们可以看到,由于测试集上的分数太低,该模型训练过度。但这并不奇怪,因为数据只是随机噪声!希望在使用信号对数据执行这些方法时,您最终将得到一个经过良好调整的模型

编辑


这是“每个人都这样做”的情况之一,但没有真正明确的参考来说明这是最好的方式。我建议你找一个与你正在研究的分类问题相近的例子。例如,使用Google Scholar搜索“网格搜索”“SVM”“基因表达式”

您能描述一下您使用的模型吗?我不清楚你所说的“多重阈值”是什么意思。您的模型是否输出多个概率而不是单个概率?如果是这样的话,也许你想把它们组合成一个概率,然后你可以ROC_AUC@maxymoo,这与输出无关。它涉及培训和验证,以及选择最佳参数集。有关示例参数网格,请参见ncfirth的答案。我想知道的是,如果输入参数中没有“曲线”可供绘制,而是一系列点,那么如何计算roc_auc。此外,是否还有其他评分标准是首选的(我收集到成本矩阵的准确性可能与曲线无关)哇,我不知道还有其他再培训者!谢谢你的解释。它帮助我专注于我想问的问题。您确实打印了gs.best_params,它返回了最佳参数。您的
参数网格
与我的网格设置完全相同。我正在尝试自己得分,这意味着,如果我使用类似于ROCAUC的东西,那么我需要知道如何做到这一点。考虑到您的
参数网格
最佳参数是什么_