机器学习:Friedman检验与Nemenyi后续检验,Python实现

 


前言

本人大数据专业初入大三刚刚接触机器学习这一课程,教材是最典型的西瓜书,第一次作业当然就是利用本专业语言多功能python语言结合书内容尝试自己构建P-R曲线以及延伸指标曲线。当然初入一些算法和机器学习的一些库还不是很熟练掌握,有待提升自己的编程结合能力。在此领域本人有诸多不明确疑问,可能文章会有些许错误,望大家在评论区指正,本篇文章错误将会不断更正维护。

具体代码实现参考:https://blog.****.net/qqMiSa/article/details/98660515


提示:以下是本篇文章正文内容,下面案例可供参考

一、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个算法,令机器学习:Friedman检验与Nemenyi后续检验,Python实现表示第i个算法的平均序值,机器学习:Friedman检验与Nemenyi后续检验,Python实现的均值和方差分别为(k+1)/2和(机器学习:Friedman检验与Nemenyi后续检验,Python实现-1)/12N。

机器学习:Friedman检验与Nemenyi后续检验,Python实现

在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

机器学习:Friedman检验与Nemenyi后续检验,Python实现服从自由度为k-1和(k-1)(N-1)的F分布。

 

二、Nemenyi后续检验

若“所有算法的性能相同”这个假设被拒绝,则说明算法的性能显著不同,这时需要进行“后续检验”。

机器学习:Friedman检验与Nemenyi后续检验,Python实现

 

def nemenyi(n, k, q):
    return q * (np.sqrt(k * (k + 1) / (6 * n)))

使用检验可以直观的用Friedman检验图表示:

机器学习:Friedman检验与Nemenyi后续检验,Python实现

这是catEyesL大佬写的测试源代码:https://github.com/aBadCat/machineLearning/tree/master/Friedman&Nem


总结

有时间测试不同算法的差异性吧。

参阅博客:

https://blog.****.net/qqMiSa/article/details/98660515

https://blog.****.net/cherdw/article/details/55813071

https://www.cnblogs.com/bigox/p/11476904.html

https://blog.****.net/master_hunter/article/details/108847086

https://blog.****.net/qqMiSa/article/details/102409947