我在使用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对象进行调优。