【问题标题】:binary classification target specifically on false positive二进制分类目标,专门针对误报
【发布时间】:2018-02-08 01:42:20
【问题描述】:

我在使用sklearn的模型时有点困惑,如何设置具体的优化功能?例如,当使用 RandomForestClassifier 时,我如何让模型“知道”我想要最大化“召回”或“F1 分数”。还是“AUC”而不是“准确度”?

有什么建议吗?谢谢。

【问题讨论】:

  • 有不同的分类器是有原因的,每个分类器都经过训练以最大化不同的优化函数。例如,在 RandomForest 中,每个节点都经过贪婪训练,以分割并最大化孩子的 Gini 标准(或标注熵)的信息增益。因此,1) RandomForest 不会直接最大化准确度,并且 2) recallF1 score 不是您训练模型的指标,而是评估不同已训练模型的指标楷模。您总是可以设计分类器的变体来最大化其中一些分数,但并非所有分类器都能做到。
  • @ImanolLuengo。你为我清理了很多东西。您能否指出一个关于如何“设计分类器变体以最大化其中一些分数”的示例?谢谢你。您对使用 gini 或熵的随机森林是正确的。其他型号呢?例如逻辑回归(我想它使用最大似然),或 SVM 或 LDA。有没有办法指定不同的优化函数?
  • 不是直接的,也不是以一种简单的方式,您必须在数学上重新制定分类器的优化函数来为您的分数引入一个惩罚(并非总是可能),然后对其进行编码。正如@MohammedKashif 在他的回答中所说,实现它的最简单方法是训练几个具有不同参数的模型,并保留在您的指标中获得最高分数的模型。

标签: optimization machine-learning scikit-learn classification


【解决方案1】:

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

详尽的网格搜索 在这种方法中,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]
            )

在这种情况下,指定的网格是分类器__min_samples_split、分类器__max_leaf_nodes 和分类器__max_depth 值的叉积。该文档指出:

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

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

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

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

您可以从here 了解更多信息。

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

供参考的替代链接:

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

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

【讨论】:

  • 谢谢。我知道参数调整以获得最佳结果,但我更多的是在谈论模型本身的优化功能,无论如何要更改它们?
  • @user6396 根据您的问题,您想根据您指定的评分函数优化您的模型吗?如果是这种情况,那么这正是上述 sklearn 的参数调整模块中发生的事情。还有什么我想念的吗?
【解决方案2】:

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

http://scikit-learn.org/stable/modules/model_evaluation.html

你需要使用类似的东西

cross_val_score(model, X, y, scoring='f1')

可能的选择是(查看文档)

['accuracy', 'adjusted_mutual_info_score', 'adjusted_rand_score', 
'average_precision', 'completeness_score', 'explained_variance', 
'f1', 'f1_macro', 'f1_micro', 'f1_samples', 'f1_weighted', 
'fowlkes_mallows_score', 'homogeneity_score', 'mutual_info_score', 
'neg_log_loss', 'neg_mean_absolute_error', 'neg_mean_squared_error', 
'neg_mean_squared_log_error', 'neg_median_absolute_error', 
'normalized_mutual_info_score', 'precision', 'precision_macro', 
'precision_micro', 'precision_samples', 'precision_weighted', 'r2', 
'recall', 'recall_macro', 'recall_micro', 'recall_samples', 
'recall_weighted', 'roc_auc', 'v_measure_score']

玩得开心 翁贝托

【讨论】:

  • 我不认为这实际上回答了这个问题。这仅与模型的评估有关。不是模型的优化
猜你喜欢
  • 2012-10-23
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多