前言
本人大数据专业初入大三刚刚接触机器学习这一课程,教材是最典型的西瓜书,第一次作业当然就是利用本专业语言多功能python语言结合书内容尝试自己构建P-R曲线以及延伸指标曲线。当然初入一些算法和机器学习的一些库还不是很熟练掌握,有待提升自己的编程结合能力。在此领域本人有诸多不明确疑问,可能文章会有些许错误,望大家在评论区指正,本篇文章错误将会不断更正维护。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Friedman检验
在很多时候,我们会在一组数据集上对比多个算法的性能。当有多个算法参与比较时,常用基于算法排序的Friedman
检验。我们可以给出多个数据集如D1、D2、D3、D4.....Dn等对算法A1、A2.....An进行比较。使用评估方法得到每个算法在每个数据集上的测试结果,然后在每个数据集上根据测试性能由好到坏排序,并赋予序值1,2,3....;若算法的测试性能相同,则平分序值。
数据集 | 算法A | 算法B | 算法C |
D1 | 1 | 2 | 3 |
D2 | 1 | 2.5 | 2.5 |
D3 | 1 | 2 | 3 |
D4 | 1 | 2 | 3 |
平均序值 | 1 | 2.125 | 2.875 |
得出此算法比较序值表后,使用Friedman检验来判断这些算法的性能是否相同。若相同则平均序值也应当相同。
假定我们在N个数据集上比较k个算法,令\gamma _{i}表示第i个算法的平均序值,\gamma _{i}的均值和方差分别为(k+1)/2和(k^{2}-1)/12N。
在k和N都较大时,服从自由度为k-1的卡方分布。
def friedman(n, k, rank_matrix): # 计算每一列的排序和 sumr = sum(list(map(lambda x: np.mean(x) ** 2, rank_matrix.T)))#降序矩阵 result = 12 * n / (k * ( k + 1)) * (sumr - k * (k + 1) ** 2 / 4)#T的卡方分布 result = (n - 1) * result /(n * (k - 1) - result)#TF变量 return result
服从自由度为k-1和(k-1)(N-1)的F分布。
二、Nemenyi后续检验
若“所有算法的性能相同”这个假设被拒绝,则说明算法的性能显著不同,这时需要进行“后续检验”。
def nemenyi(n, k, q): return q * (np.sqrt(k * (k + 1) / (6 * n)))
使用检验可以直观的用Friedman检验图表示:
这是catEyesL大佬写的测试源代码:
https://github.com/aBadCat/machineLearning/tree/master/Friedman&Nem
总结
有时间测试不同算法的差异性吧。