我正在构建一个多类分类器来预测问题的“意图”。目标变量中有大约 100 个类,每个目标类包含不相等比例的观察/问题,从 3% 到 40% 不等。
问题
- 这个分类器的一个好的评估指标是什么?
- 优化建议评估指标的最佳代理损失函数是什么?
编辑:这不是排名问题。该模型应仅预测 1 个目标类别。每个目标类别的错误分类成本相同。
我正在构建一个多类分类器来预测问题的“意图”。目标变量中有大约 100 个类,每个目标类包含不相等比例的观察/问题,从 3% 到 40% 不等。
问题
编辑:这不是排名问题。该模型应仅预测 1 个目标类别。每个目标类别的错误分类成本相同。
你可以看看sensitivity和specificity。它们可以有效地结合起来,为正确分类提供基础,或为每个类别中的排除性分类提供基础。也就是说,如果您正在为整个模型寻找衡量标准,您可能希望查看某种加权平均sensitivity分数。
sensitivity与 的计算相同precision,但specificity与 不同recall。
也就是说,您可能需要有几个专门针对不同领域的模型,或者,在最坏的情况下,您可能需要生成一个一对一的模型集合以获得最佳结果。如果正如anymous.asker 所建议的那样,这可能会有所帮助,也许您可以围绕积极或消极的结果引入一些成本。
高温高压
通常排名指标,例如 N 处的精度(例如,真实类在模型预测的前 3 或前 5 中的次数)。如果您可以以某种方式合并相似性信息或每种错误分类类型的成本,那么还有其他指标可能更合适。
您可以在所有类型的算法中使用一些相关参数作为成本函数,例如 Kappa、CEN 和 MCEN。
免责声明:
如果您使用的是 Python,则可以使用PyCM模块。该模块在接收到您的数据的混淆矩阵后,可以根据您的数据集的特点,提出一些适合评估您的算法的参数。
这是一个从该模块获取推荐参数的简单代码:
>>> from pycm import *
>>> cm = ConfusionMatrix(matrix={"Class1": {"Class1": 1, "Class2":2}, "Class2": {"Class1": 0, "Class2": 5}})
>>> print(cm.recommended_list)
["Kappa", "SOA1(Landis & Koch)", "SOA2(Fleiss)", "SOA3(Altman)", "SOA4(Cicchetti)", "CEN", "MCEN", "MCC", "J", "Overall J", "Overall MCC", "Overall CEN", "Overall MCEN", "AUC", "AUCI", "G", "DP", "DPI", "GI"]
之后,您想用作损失函数的每个参数都可以使用如下:
>>> y_pred = model.predict #the prediction of the implemented model
>>> y_actu = data.target #data labels
>>> cm = ConfusionMatrix(y_actu, y_pred)
>>> loss = cm.Kappa #or any other parameter (Example: cm.SOA1)