上周我遇到了一个有趣的问题。使用来自 基因组癌症图谱的 数据(数千名患者的完整遗传和临床数据),我正在构建一个分类器,该分类器可以根据遗传特征集预测癌症的类型。
在 PANCAN33 子集中,有 33 种不同类型癌症的样本。并且分类器应该能够将新样本分类到这 33 个类中的一个。我尝试了不同的方法,如随机森林、svm、bgmm 和其他一些方法,并最终得到了分类器的集合。如何选择最好的?
我们需要一种方法来计算分类器预测与真实标签/癌症类型之间的一致性。对于二元分类器,有很多常用的指标,如精度、召回率、准确性等。但这里我们有 33 个类别。混淆矩阵有 33×33 个单元格,有很多数字需要比较。
当然,有一些直接的解决方案,比如分类器正确猜测真实标签的样本部分。但是,如果类分布不均(很常见),那么这种简单的解决方案就会受到很大影响。这样的指标对于虚拟分类器来说可能很高,比如:总是投票给最常见的类。最好避免使用此类指标。
其他协议措施
实际上我使用了两个有趣的——Cohen Kappa 和 Krippendorff Alpha 。他们考虑了每个评分者的选票分布。此外,Krippendorff Alpha 考虑了缺失数据( 在此处找到更多信息 )。
这两个系数都被心理测量学家广泛使用(例如,评估两位精神病医生对诊断的同意程度)。我们使用它们来估计分类器的性能。这两个系数都在 irr 包 中实现。
您将在下面找到一个示例应用程序:
kappa2(cbind(predictions, trueLabels))
# Cohen's Kappa for 2 Raters (Weights: unweighted)
#
# Subjects = 3599
# Raters = 2
# Kappa = 0.941
#
# z = 160
# p-value = 0
kripp.alpha(rbind(predictions, trueLabels))
Krippendorff's alpha
Subjects = 3599
Raters = 2
alpha = 0.941