今天来谈谈一个话题:模型性能如何评估?
对于这个问题,相信不少数据挖掘的朋友会说这还用思考吗?一顿啪哩啪啦:分类用precision、recall、F1、KS等等,回归用MSE等等,聚类用总体误差平方和、轮廓系数silhouette等等。。。
但是,真的是这样吗?从项目的角度来说,不同项目有不同目标、不同侧重点,世界上存在通用、不成不变的一种准则吗,想通了这一点,自然就会知道,其实在真实的项目中,不考虑业务,直接使用指标是有问题的,或者说是存在缺陷的。
举例如下:
(1)对于分类问题,不管是precision还是其他KS也好,其实都不能准确、全面评估模型性能,一个更好的方法应该是:
计算整体的precision、recall、各个阀值下的KS;
计算各个类别的precision、recall、各个阀值下的KS;
因为数据集存在倾斜(不同类样本不均匀),如果只看整体指标,则多数类会掩盖少数类效果,尤其是少数类为目标样本的时候,这时会存在很大误导性,应该要各个类别指标一起观察。
(2)对于聚类问题,如果是使用MSE(均方误差和)存在问题:理论上,样本越多,误差越大,样本越小,误差越小,误差对模型性能的影响,单纯看误差之和存在误导。一个合理做法是:将分类好的样本投影到低维空间,看在低维空间,簇和簇之间是否有明显边界,再结合各个簇的分布,簇内样本之间距离,簇间样本之间距离综合评估。
补充下轮廓系数:
如SKlearn上所说,轮廓系数含义为:
在聚类完成之后,对于某个样本而言i,计算样本i和所在簇中其他样本的平均距离A,再计算样本i和其他各个簇中样本的平均值并选择一个最小平均值作为B,这样(B-A)/max{A,B}即为样本i轮廓系数,整个数据集的轮廓系数为所有样本轮廓系数的平均值。
步骤如下:
假定一个样本i,当前样本属于簇C_i,一共有K个簇;
step1:计算样本i到C_i中其他样本的距离,求均值得到A_i。
step2:计算样本i到C_1中各个样本的距离,得到均值B1,计算样本i到C_2中各个样本的距离,得到均值B2,以此类推,得到K-1个B_j(j != i,剔除当前簇C_i),从中选择一个最小的B作为B_i。
step3:样本i的轮廓系数S_i = (B_i - A_i) / max{B_i, A_i}。
step4:全部样本S_i求均值得到整体的轮廓系数S。
整个思想是:希望簇和簇之间尽快远离,簇内尽可能紧密,这样B_i就会很大,A_i就会很小,这样计算得到的单个S_i就会尽可能接近1(等价于B_i/B_i),整体S就会接近1。