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

单一阈值多重阈值

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

右图展示了我的问题设置,其中有3个参数,每个参数只有两个选择。结合起来,图中显示了8个点。在实际应用中,我打算有成千上万种参数组合的可能性,但在这个缩小规模的案例中,概念仍然相同。

我的目标是找到以下两件事:

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

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

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

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

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

    参数分数 = TPR – FPR * 成本比率

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

我找到了很多关于单一阈值ROC曲线的参考资料,虽然有其他技术可以确定性能,但本问题中提到的方法绝对被认为是标准方法。我没有找到关于右图中展示的场景的阅读材料。

总之,这里提出的问题是双重的:(1)提供方法来评估我的问题场景中的最优参数集和整体性能,(2)提供声称所建议的方法是给定场景的标准方法的参考资料。

附注:我最初在“Cross Validated”论坛上发布了这个问题,但没有得到任何回应,实际上,在15小时内只有7次浏览量。


回答:

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

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

import numpy as npfrom sklearn import model_selection, ensemble, metricsnp.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      1793avg / 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       720avg / total       0.49      0.49      0.49      1500

我们可以看到这个模型在测试集上的表现不佳,说明模型过拟合了。但这并不奇怪,因为数据只是随机噪声!希望在对具有信号的数据执行这些方法时,你将得到一个经过良好调整的模型。

编辑

这是一种“大家都这样做”的情况,但没有明确的参考资料说这是最好的方法。我建议寻找与你正在处理的分类问题相近的例子。例如使用Google Scholar搜索“grid search” “SVM” “gene expression”

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注