我正在嘗試將此配對 t 檢驗代碼用于 2 個以上的 ML 分類器和資料庫:
整個代碼和資料庫: https ://github.com/cemdogdu/stack
def paired_t_test(p):
p_hat = np.mean(p)
n = len(p)
den = np.sqrt(sum([(diff - p_hat)**2 for diff in p]) / (n - 1))
t = (p_hat * (n**(1/2))) / den
p_value = t_dist.sf(t, n-1)*2
return t, p_value
n_tests = 30
p_ = []
rng = np.random.RandomState(42)
for i in range(n_tests):
randint = rng.randint(low=0, high=32767)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=randint)
rf.fit(X_train, y_train)
knn.fit(X_train, y_train)
acc1 = accuracy_score(y_test, rf.predict(X_test))
acc2 = accuracy_score(y_test, knn.predict(X_test))
p_.append(acc1 - acc2)
print("Paired t-test Resampled")
t, p = paired_t_test(p_)
print(f"t statistic: {t}, p-value: {p}\n")
但是,當我為多個分類器創建 for 回圈時,
p_ = np.zeros(n_tests)
p = np.zeros((len(clf_list),len(clf_list)))
for ii in range(len(clf_list)):
for jj in range(len(clf_list)):
for kk in tqdm( range(n_tests)):
# clf_list = deepcopy(clf_list_temp)
clf1 = clf_list[ii]
clf2 = clf_list[jj]
它為回圈中的每次運行產生不同的精度,該回圈使用'''for file in glob.glob(path)'''讀取資料集。
此外,有時我會得到大于 1 的 p 值,而當我對每對進行一次比較時,情況并非如此。這里可能是什么問題?
uj5u.com熱心網友回復:
關于為什么會得到不同的結果,如果您查看代碼的這一部分:
randint = rng.randint(low=0, high=32767)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=randint)
我懷疑當您通過其他分類器等進行不同的迭代時,您的隨機狀態是不同的,因此會產生不同的結果。如果沒有可重現的示例,我們無法復制您所看到的差異。
至于 p 值的問題,您需要確保您的測驗是雙向的,因此,例如,使用您的代碼,您可以查看 的平均值p_,即您的 t 統計量是否為負,您最終會得到 ap 值> 1。
import numpy as np
from scipy.stats import t as t_dist
np.random.seed(111)
acc1 = np.random.uniform(0,1,10)
acc2 = np.random.uniform(0,1,10)
acc1.mean()
0.3450090833343872
acc2.mean()
0.44340491701581025
paired_t_test(acc1 - acc2)
(-0.9621893188877937, 1.6389080997936225)
paired_t_test(acc2 - acc1)
(0.9621893188877937, 0.3610919002063774)
如果您更改代碼,請確保您正在測驗雙邊 t 統計量:
def paired_t_test(p):
p_hat = np.mean(p)
n = len(p)
den = np.sqrt(sum([(diff - p_hat)**2 for diff in p]) / (n - 1))
t = (p_hat * (n**(1/2))) / den
p_value = t_dist.sf(abs(t), n-1)*2
return t, p_value
無論差異如何,我們都應該得到相同的 p 值:
paired_t_test(acc2 - acc1)
(0.9621893188877937, 0.3610919002063774)
paired_t_test(acc1 - acc2)
(-0.9621893188877937, 0.3610919002063774)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488470.html
標籤:Python python-3.x for循环 scikit-学习
下一篇:在forloop中創建多個物件
