【发布时间】:2018-11-07 02:04:33
【问题描述】:
例如,一个数据集包含 60% 的“是”类实例和 30% 的“否”类实例。 在这种情况下,随机分类器的 Precision、Recall 是
精度 =60%
召回率 =50%
那么,这种场景下随机分类器的准确率是多少?
【问题讨论】:
标签: machine-learning classification evaluation
例如,一个数据集包含 60% 的“是”类实例和 30% 的“否”类实例。 在这种情况下,随机分类器的 Precision、Recall 是
精度 =60%
召回率 =50%
那么,这种场景下随机分类器的准确率是多少?
【问题讨论】:
标签: machine-learning classification evaluation
这里需要小心一点,因为随机分类器的定义有点模棱两可;这在数据不平衡的情况下得到了最好的说明。
根据定义,二元分类器的准确率是
acc = P(class=0) * P(prediction=0) + P(class=1) * P(prediction=1)
P 代表概率。
确实,如果我们坚持将随机二元分类器直观定义为给出
P(prediction=0) = P(prediction=1) = 0.5
那么由上述公式计算的准确率始终为 0.5,与类别分布无关(即 P(class=0) 和 P(class=1) 的值)。
但是,在这个定义中,有一个隐式假设,即我们的类是平衡的,每个类都包含我们数据集的 50%。
这个假设(以及相应的直觉)在类不平衡的情况下会失效:如果我们有一个数据集,例如,90% 的样本属于 0 类(即P(class=0)=0.9),那么使用上述随机二元分类器的定义就没有多大意义了;相反,我们应该使用类分布本身的百分比作为随机分类器的概率,即:
P(prediction=0) = P(class=0) = 0.9
P(prediction=1) = P(class=1) = 0.1
现在,将这些值代入定义精度的公式,我们得到:
acc = P(class=0) * P(prediction=0) + P(class=1) * P(prediction=1)
= (0.9 * 0.9) + (0.1 * 0.1)
= 0.82
这与 0.5 的幼稚值相去甚远......
正如我已经说过的,AFAIK 在文献中没有对随机分类器的明确定义。 Sometimes“天真的”随机分类器(总是抛公平硬币)被称为“随机猜测”分类器,而我所描述的被称为“加权猜测”分类器,但这仍然远没有被接受为标准......
这里的底线如下:由于使用随机分类器的主要原因是作为基线,因此只有在相对平衡数据集中这样做才有意义.在您的余额为 60-40 的情况下,结果是 0.52,诚然,这与 0.5 的天真值相差不远;但是对于高度不平衡的数据集(例如 90-10),随机分类器作为基线的有用性本身不复存在,因为正确的基线已变为“总是预测多数类”,这里将给出 90% 的准确率,而随机分类器的准确率仅为 82%(更不用说幼稚方法的 50% 准确率了)...
【讨论】:
正如@desertnaut 所提到的,如果您对模型进行简单的基准测试,那么您最好使用“始终预测多数类”作为基准,实现 %of_samples_in_majority_class 的准确度(这总是比随机猜测或加权猜测)。
在Deepchecks(我维护的一个包)中,我们进行了一项检查,可以自动将您的模型的性能与简单模型(加权随机、多数类或简单决策树)进行比较。
from deepchecks.checks import SimpleModelComparison
from deepchecks import Dataset
SimpleModelComparison().run(Dataset(train_df, label='target'), Dataset(test_df, label='target'), model)
【讨论】: