最近在考慮要發Paper,在模型的性能比較中,除了采用Precision/Recall的比較之外,為了進一步驗證論文中的選擇是存在可證明性的,因此考慮了使用F-test對多種模型算法進行統計顯著性檢驗。
常見的模型評估與方法
- 誤分率(misclassification rate),即准確度。
- 精確率(precision)和召回率(recall)
- 計算F1
- ROC曲線,ROC_AUC
- k-fold cross-validation
以上這些方法都能為模型的評估和選擇提供有利的幫助,但是有時候會存在幾個模型精度相差不多,無法科學的評判選擇的情況。此時,為了更進一步的檢驗其顯著性,統計顯著性檢驗的方法就起到很好的的作用。
常用的顯著性檢驗方法
Student's t-test
通過小樣本來對總體均值或者總體之間均值的差異的推斷通常使用t檢驗。
一般常用雙總體t檢驗,two-sample t-test 。 來檢驗總體的均值的差異是否顯著。
檢驗統計量為:
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,表示兩個模型之間的顯著性差異不大,反之,顯著性差異比較大,有很大不同。


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