如何科學地評估和評判深度學習模型?


最近在考慮要發Paper,在模型的性能比較中,除了采用Precision/Recall的比較之外,為了進一步驗證論文中的選擇是存在可證明性的,因此考慮了使用F-test對多種模型算法進行統計顯著性檢驗。

常見的模型評估與方法

  • 誤分率(misclassification rate),即准確度。
  • 精確率(precision)和召回率(recall)
  • 計算F1
  • ROC曲線,ROC_AUC
  • k-fold cross-validation

以上這些方法都能為模型的評估和選擇提供有利的幫助,但是有時候會存在幾個模型精度相差不多,無法科學的評判選擇的情況。此時,為了更進一步的檢驗其顯著性,統計顯著性檢驗的方法就起到很好的的作用。

常用的顯著性檢驗方法

Student's t-test

通過小樣本來對總體均值或者總體之間均值的差異的推斷通常使用t檢驗

\[假設X_1,X_2,...,X_n 遵循獨立的分布 N(\mu,\sigma^2),i.e. 樣本數量為n ,均值為 \mu ,方差為\sigma^2 .\\ 隨機變量 \frac{\overline{X}-\mu}{\sigma/\sqrt{n}} 有一個標准的正態分布。由於總體方差未知,可以通過樣本方差來估計,但是對於小樣本,\\ \frac{\overline{X}-\mu}{S/\sqrt{n}}不再服從正態分布,而是服從 Student's t-distribution(n-1).\\ 其中,樣本方差為 S^2 = \frac{1}{n-1}\sum_{i=1}^n(X_i-\overline{X})^2.得到的統計量t:\\ t=\frac{\overline{X}-\mu}{S/\sqrt{n}}\\ 隨着n的增大,S逐漸趨近於\sigma,而t分布也越來越接近正態分布。 \]

一般常用雙總體t檢驗,two-sample t-test 。 來檢驗總體的均值的差異是否顯著。

檢驗統計量為:

\[t=\frac{\overline{X_1}-\overline{X_2}}{\sqrt{\frac{(n_1-1)S_1^2+(n_2-1)S_2^2}{(n_1+n_2-2)}(\frac{1}{n_1}+\frac{1}{n_2})}} \]

F-test

F檢驗又叫方差齊性檢驗。在兩樣本t檢驗中要用到F檢驗。

從兩研究總體中隨機抽取樣本,要對這兩個樣本進行比較的時候,首先要判斷兩總體方差是否相同,即方差齊性。若兩總體方差相等,則直接用t檢驗,若不等,可采用t'檢驗或變量變換或秩和檢驗等方法。

其中要判斷兩總體方差是否相等,就可以用F檢驗。

假設檢驗中 P<0.05通常說明了統計學顯著性差異。

實現

該實驗背景是根據某個工業場景,選擇了一些通用模型進行訓練。將數據集按照class進行分層采樣成5子樣本。分別使用7種不同的模型對5個子樣本進行訓練和檢測識別。經過實驗后得到一些實驗數據,發現存在幾種模型的precision和recall相差不多,此時在沒有檢測速度比較的的情況,如何科學地表達這幾種模型的表現力。即統計顯著性檢驗。

由於論文還沒在待審核中,為了保證論文的正常審核,對真實的實驗數據做了大的修改!!!但是不影響對顯著性檢驗的學習~

f-test具體的實現如下:

def F_test(sample, mean_list, modify_std_list):
    """
    統計顯著性檢驗
    :param mean_list:
    :param modify_std_list:
    :return:
    """
    statistic_list = []
    pvalue_list = []
    type_list = []
    model1_list = []
    model2_list = []
    result = {}
    cout = 1
    # 統計顯著性檢驗
    for i in range(len(Model)):
        for j in range(len(Model)):

            (statistic, pvalue) = stats.ttest_ind_from_stats(mean1=mean_list[i], std1=modify_std_list[i], nobs1=5,
                                                             mean2=mean_list[j],
                                                             std2=modify_std_list[j], nobs2=5)
            if pvalue < 0.05:
                type_list.append("Reject NULL hypothesis - Significant differences exist between groups.")
            else:
                type_list.append("Accept NULL hypothesis - No significant difference between groups.")

            model1_list.append(Model[i])
            model2_list.append(Model[j])
            statistic_list.append(statistic)
            pvalue_list.append(pvalue)

            print(
                "第 {} 對比檢驗組合:第 {} 個 mean:{},第 {} 個 modify_std:{}".format(cout, i, mean_list[i], j,
                                                                         modify_std_list[j]))
            print("------------第{}次迭代完成!----------".format(cout))
            cout += 1
    result = {"model1": model1_list, "model2": model2_list,
              "pvalue": pvalue_list, "statistic": statistic_list,
              "result": type_list}
    pd.DataFrame(result).to_csv('result.csv', index=False)
    return result

熱力圖可視化:

def plt_show(result):
    """
    可視化
    :param result:
    :return:
    """
    df = pd.read_csv('result.csv')
    print(df['pvalue'])
    # 將表格數據轉化成矩陣圖
    df = df.pivot("model1", 'model2', "pvalue")
    print(df)
    f, ax = plt.subplots(figsize=(9, 7))
    # grid_kws = {"height_ratios": (.9, .05), "hspace": .5}
    ax = sns.heatmap(df, ax=ax, vmin=0, vmax=0.05, cmap="GnBu", square=False,
                     xticklabels=['M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7'],
                     yticklabels=['M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7'],
                     center=df.loc['Faster RCNN+InceptionV2', 'SSD+MobileNetV1'],
                     annot=True, fmt='.2g', annot_kws={'size': 10, 'color': 'black', "ha": 'center', "va": 'center'})

    label_y = ax.get_yticklabels()
    plt.setp(label_y, rotation=360, horizontalalignment='right')
    label_x = ax.get_xticklabels()
    plt.setp(label_x, rotation=360, horizontalalignment='right')
    plt.xlabel('Model')  # 設置坐標名稱
    plt.ylabel('Model')
    plt.savefig("f-test.jpg")
    plt.show()

最后的結果:(以上只存放了一些主要代碼~)

在熱力圖中,如果p值大於0.05,表示兩個模型之間的顯著性差異不大,反之,顯著性差異比較大,有很大不同。

最后希望自己的論文能夠順利地成功發表!哈哈~😄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM