Machine learning 多参数分类器的最优参数估计
左边的图像显示了一条标准ROC曲线,该曲线通过扫描单个阈值并记录相应的真阳性率(TPR)和假阳性率(FPR)形成 右边的图片显示了我的问题设置,其中有3个参数,每个参数只有2个选择。如图所示,它总共生成8个点。实际上,我打算有上千种可能的100个参数的组合,但在这种缩小比例的情况下,概念保持不变 我打算在这里找到两件事: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的最大差值,带有成本成分(我相信它被称为
- 确定给定数据的最佳参数
- 提供所有参数组合的总体性能分数
- 最佳参数:TPR和FPR的最大差值,带有成本成分(我相信它被称为J统计量?)
- 整体性能:曲线下的面积(图中阴影部分)
- 最佳参数设置:TPR和FPR的最大差值相同 参数得分=TPR-FPR*成本率
- 总体绩效:所有“参数得分”的平均值
注:我第一次在“交叉验证”论坛上发布了这个问题,但没有得到任何回应,事实上,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的东西,那么我需要知道如何做到这一点。考虑到您的参数网格
,最佳参数是什么_