为什么概率总和为 1,如何设置最佳阈值水平?

数据挖掘 机器学习 Python 分类 文本
2022-02-18 18:01:48

我正在研究文本分类用例。训练数据有两个类,因此 XBBoostClassifier 和 onevsrest 模型将测试数据分类到两个类中的任何一个。但我的要求是将其分类为给定的类,或者如果找不到匹配项,则将其设置为“未确定”,以便我可以手动对数据进行分类。

我尝试了以下 OneVsRest 分类器

pl = Pipeline([
        ('vec', CountVectorizer(token_pattern = tks)),
        ('clf', OneVsRestClassifier(LogisticRegression()))
    ])
pl.fit(x,y)
predictions = pl.predict_proba(test.comment_text)

但是概率之和为1,而且数据所属类别的概率在90以上。

请澄清以下几点 1. 为什么概率总是一?是否意味着数据是互斥的?2.概率是这样的

CLASS 1           :CLASS 2
0.892993358265023 : 0.106808845640795
0.999999742528922 : 2.57685096542208E-07 

这是否意味着在第一种情况下,第 1 类的概率仅为 90%,因此分类器无法正确分类数据。但是在其他情况下,存在明显差异,因为概率约为 99%

我可以设置阈值,比如 90%,如果概率小于 90% 就得出结论,让用户手动对数据进行分类?

请提供您的意见

1个回答

问题 1.为什么概率总和为 1:概率论。概率总和为 1,因为这就是我们定义它们的方式。碰巧的是,通过强制它们求和 1,它们具有直观的解释,并且计算最终变得更容易。但这仅仅是方便。概率(或更具体地说,概率度量)可以定义为总和 12 或 100 或您喜欢的任何数字。这并不重要。

进一步的子问题:

  • 它不是排他的类的数据。
  • 分类器能够以较低的概率进行分类(我实际上认为 99999% 可能是过度拟合)

问题2可以设置阈值,比如90%,如果概率小于90%,就可以得出结论,让用户手动对数据进行分类让数据告诉你最佳的截止水平/阈值(从 ROC 曲线中,阅读它)

def optimal_cutoff(ground_truths: np.array,
                             predictions: np.array) -> float:
        """

        :param ground_truths: array of arrays (matrix) of all ground truths
        :param predictions: array of arrays (matrix) of all predictions
        :return: optimal cut-off level
        """
        optimal_thresholds = []
        for y_train, y_pred in zip(ground_truths, predictions):
            fpr, tpr, threshold = roc_curve(y_train, y_pred)
            optimal_idx = np.argmax(tpr - fpr)
            optimal_thresholds.append(threshold[optimal_idx])

        return sum(optimal_thresholds) / (len(optimal_thresholds))

因此,您将计算可用 GROUND 事实的截止值。现在,如果当您指定最佳截止级别时,您的指标(比如说 f1)落后于某个级别,您可以告诉用户进行检查。