使用 predict_proba 与 class_weight 进行校准

数据挖掘 机器学习 Python 分类 scikit-学习 随机森林
2021-10-01 02:48:31

我正在制作一个随机森林分类器来确定一个句子是“正面”(1)、“负面”(-1)还是“中性”(0)。

然而,我更喜欢假阴性而不是假阳性,也就是说,我更喜欢说一个句子是中性的,即使它不是在它是中性的时候说一个句子是肯定的,如果它是否定的更是如此。

所以我使用predict_proba, 类似于:

def my_pred(rfc, X, weight=0.5):
  res = rfc.predict_proba(X) 
  if res[0]>weight: return -1
  elif res[2]>weight: return 1
  return 0

但我想知道我是否可以使用class_weight会更好吗?

1个回答

有几个选项供您选择:

sklearn.svm.SVC, sklearn.ensemble.RandomForestClassifier, 和其他。请注意,重量比没有理论上的限制,因此即使 1 到 100 对您来说不够强,您也可以继续使用 1 到 500 等。

  • 您还可以在交叉验证期间选择非常低的决策阈值来选择召回率最高的模型(尽管可能精度较低)。召回接近1.0有效意味着false_negatives接近0.0,这是想要的。为此,使用sklearn.model_selection.cross_val_predictsklearn.metrics.precision_recall_curve功能:

      y_scores = cross_val_predict(classifier, x_train, y_train, cv=3,
    
                                   method="decision_function")
    
    
    
      precisions, recalls, thresholds = precision_recall_curve(y_train, y_scores)
    

    如果你绘制precisionsrecalls反对thresholds,你应该看到这样的图片:

    精确召回权衡

    选择最佳阈值后,您可以使用classifier.decision_function()方法中的原始分数进行最终分类。

最后,尽量不要过度优化你的分类器,因为你很容易得到一个微不足道的 const 分类器(这显然永远不会出错,但毫无用处)。

如前所述,进行此调整有两个阶段:模型训练阶段(如自定义权重)和预测阶段(如降低决策阈值)。

模型训练阶段的另一个调整是使用召回记分器您可以在网格搜索交叉验证 ( GridSearchCV ) 中使用它来调整分类器,并使用最佳超参数实现高召回率。

GridSearchCV评分参数可以接受“recall”字符串或函数recall_score

由于您使用的是二元分类,因此这两个选项都应该开箱即用,并使用适合二元分类的默认值调用recall_score :

  • 平均:'二进制'(即一个简单的召回值)

  • pos_label: 1 (就像numpy的True值)

如果您需要自定义它,您可以使用make_scorer包装现有的记分器或自定义记分器,并将其传递给评分参数。