二元分类目标特别关注假阳性

我在使用sklearn的模型时有点困惑,如何设置特定的优化函数?例如,当使用RandomForestClassifier时,我如何让模型“知道”我想最大化“召回率”或“F1分数”,或者“AUC”而不是“准确率”?

有什么建议吗?谢谢你。


回答:

你要找的是参数调优。基本步骤是,首先选择一个估计器,然后定义一个超参数空间(即你想要调整的所有可能的参数及其各自的值),一个交叉验证方案和评分函数。现在,根据你选择的搜索参数空间的方式,你可以选择以下方法:

详尽的网格搜索在这种方法中,sklearn使用用户定义的GridSearchCV方法创建一个包含所有可能的超参数值组合的网格。例如:

my_clf = DecisionTreeClassifier(random_state=0,class_weight='balanced')param_grid = dict(            classifier__min_samples_split=[5,7,9,11],            classifier__max_leaf_nodes =[50,60,70,80],            classifier__max_depth = [1,3,5,7,9]            )

在这种情况下,指定的网格是classifier__min_samples_split、classifier__max_leaf_nodes和classifier__max_depth的值的交叉乘积。文档中说明:

GridSearchCV实例实现了常用的估计器API:当在数据集上“拟合”时,会评估所有可能的参数值组合,并保留最佳组合。

使用GridSearch的一个例子:

#创建一个分类器 clf = LogisticRegression(random_state = 0)#对数据集进行交叉验证cv=StratifiedKFold(n_splits=n_splits).split(features,labels)#声明超参数网格param_grid = dict(            classifier__tol=[1.0,0.1,0.01,0.001],              classifier__C = np.power([10.0]*5,list(xrange(-3,2))).tolist(),              classifier__solver =['newton-cg', 'lbfgs', 'liblinear', 'sag'],             )#使用分类器、参数网格、评分函数和交叉验证的数据集执行网格搜索grid_search = GridSearchCV(clf, param_grid=param_grid, verbose=10,scoring=make_scorer(f1_score),cv=list(cv))grid_search.fit(features.values,labels.values)#要使用指定的评分函数获取最佳分数,使用以下命令print grid_search.best_score_#同样地,获取最佳估计器best_clf = grid_logistic.best_estimator_print best_clf

你可以阅读更多关于其文档的这里,了解各种内部方法等,以检索最佳参数等。

随机搜索与详尽检查超参数空间不同,sklearn实现了RandomizedSearchCV来对参数进行随机搜索。文档中说明:

RandomizedSearchCV实现了对参数的随机搜索,其中每个设置是从可能的参数值分布中抽样的。

你可以从这里阅读更多相关信息。

你可以从这里阅读更多关于其他方法的信息。

参考的替代链接:

编辑: 在你的情况下,如果你想最大化模型的召回率,你只需指定recall_score来自sklearn.metrics作为评分函数。

如果你希望如你问题中所述最大化“假阳性”,你可以参考这个回答混淆矩阵中提取“假阳性”。然后使用make_scorer函数并将其传递给GridSearchCV对象进行调优。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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