左图展示了一个通过扫描单一阈值并记录相应的真正例率(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”