Optimization 二元分类目标特别是假阳性

Optimization 二元分类目标特别是假阳性,optimization,machine-learning,scikit-learn,classification,Optimization,Machine Learning,Scikit Learn,Classification,在使用sklearn的模型时,我有点困惑,如何设置特定的优化函数?例如,使用RandomForestClassifier时,如何让模型“知道”我希望最大化“回忆”或“F1分数”。还是“AUC”而不是“准确性” 有什么建议吗?谢谢。我建议你喝杯咖啡,阅读(并理解)以下内容 你需要使用一些类似于 cross_val_score(model, X, y, scoring='f1') 可能的选择包括(检查文档) 玩得开心 Umberto您要找的是。基本上,首先选择一个估计器,然后定义一个超参数空间(

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


有什么建议吗?谢谢。

我建议你喝杯咖啡,阅读(并理解)以下内容

你需要使用一些类似于

cross_val_score(model, X, y, scoring='f1')
可能的选择包括(检查文档)

玩得开心
Umberto

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

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

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]
            )
在这种情况下,指定的网格是分类器最小样本分割、分类器最大叶子节点和分类器最大深度值的叉积。文件指出:

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

使用GridSearch的示例如下:

#Create a classifier 
clf = LogisticRegression(random_state = 0)

#Cross-validate the dataset
cv=StratifiedKFold(n_splits=n_splits).split(features,labels)

#Declare the hyper-parameter grid
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'],

             )

#Perform grid search using the classifier,parameter grid, scoring function and the cross-validated dataset
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)

#To get the best score using the specified scoring function use the following
print grid_search.best_score_

#Similarly to get the best estimator
best_clf = grid_logistic.best_estimator_
print best_clf
您可以阅读更多关于它的文档,了解各种内部方法等,以检索最佳参数等

随机搜索 sklearn没有彻底检查超参数空间,而是实现对参数进行随机搜索。文件指出:

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

你可以从网站上了解更多

您可以阅读更多关于其他方法的信息

供参考的备选链接:

编辑:在您的情况下,如果您想最大化模型的召回率,只需将from指定为评分函数


如果您希望最大化问题中所述的“误报”,您可以参考从中提取“误报”。然后使用该函数并将其传递给GridSearchCV对象进行优化。

有不同的分类器,每个分类器都经过训练以最大化不同的优化函数。例如,在随机森林中,每个节点都经过贪婪的训练,以分割和最大化儿童的基尼准则(或标签熵)的信息增益。因此,1)RandomForest不能直接最大化准确性,2)回忆或F1分数不是训练模型的指标,而是评估不同已训练模型的指标。你可以设计不同的分类器来最大化其中一些分数,但不是所有的分类器都能做到。@ImanolLuengo。你为我澄清了很多事情。你能给我举一个例子,说明如何“设计分类器的变体以最大限度地提高一些分数”吗?非常感谢。关于使用基尼或熵的随机森林,你是对的。其他型号的呢?比如逻辑回归(我想它使用最大似然),或者SVM或LDA。有没有一种方法可以指定不同的优化函数?不是直接的,也不是简单的方法,您必须从数学上重新构造分类器的优化函数,为您的分数引入惩罚(并非总是可能),然后对其进行编码。正如@MohammedKashif在他的回答中所说的,实现这一点最简单的方法是训练几个具有不同参数的模型,并保留在你的度量中获得最高分数的模型。我认为这实际上并不能回答问题。这仅与模型的评估有关。不是模型的优化。谢谢。我知道参数调整是为了获得最佳结果,但我更多的是谈论模型本身的优化功能,不管怎样,是为了改变它们吗?@user6396根据您的问题,您想根据您指定的评分函数优化您的模型吗?如果是这种情况,那么这正是上述sklearn的参数调整模块中发生的事情。我还缺什么吗?
#Create a classifier 
clf = LogisticRegression(random_state = 0)

#Cross-validate the dataset
cv=StratifiedKFold(n_splits=n_splits).split(features,labels)

#Declare the hyper-parameter grid
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'],

             )

#Perform grid search using the classifier,parameter grid, scoring function and the cross-validated dataset
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)

#To get the best score using the specified scoring function use the following
print grid_search.best_score_

#Similarly to get the best estimator
best_clf = grid_logistic.best_estimator_
print best_clf