簡體   English   中英

用cross_val_score計算的指標與從cross_val_predict開始計算的相同指標有何不同?

[英]How a metric computed with cross_val_score can differ from the same metric computed starting from cross_val_predict?

用cross_val_score計算的度量與從cross_val_predict開始計算的同一度量有何不同(用於獲取要提供給度量函數的預測)?

這是一個例子:

from sklearn import cross_validation
from sklearn import datasets
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB


iris = datasets.load_iris()

gnb_clf = GaussianNB()
#  compute mean accuracy with cross_val_predict
predicted = cross_validation.cross_val_predict(gnb_clf, iris.data, iris.target, cv=5)
accuracy_cvp = metrics.accuracy_score(iris.target, predicted)
#  compute mean accuracy with cross_val_score
score_cvs = cross_validation.cross_val_score(gnb_clf, iris.data, iris.target, cv=5)
accuracy_cvs = score_cvs.mean()

print('Accuracy cvp: %0.8f\nAccuracy cvs: %0.8f' % (accuracy_cvp, accuracy_cvs))

在這種情況下,我們獲得相同的結果:

Accuracy cvp: 0.95333333
Accuracy cvs: 0.95333333

但是,似乎並非總是如此,因為在官方文檔中已經寫過(關於使用cross_val_predict計算的結果):

注意,由於以不同方式對元素進行分組,因此此計算的結果可能與使用cross_val_score獲得的結果略有不同。

想象以下標簽和拆分

[010 | 101 | 10]

因此,您有8個數據點,每個類4個,將其拆分為3折,導致3個元素折合為2折,1個為2折。

[010 | 100 | 00]

因此,您的得分為[100%,67%,50%],而跨值得分(平均)約為72%。 現在,關於預測的准確性如何? 您顯然有6/8件事正確,因此75%。 如您所見,分數是不同的,即使它們都依賴於交叉驗證。 在這里,由於分割的大小不完全相同而產生差異,因此最后一個“ 50%”實際上降低了總分,因為它是僅2個樣本的平均值(其余均基於3個樣本)。

通常,可能還會存在其他類似現象-它應該歸結為求平均值的方式。 因此,-交叉Val得分是平均值的平均值,而不必是交叉驗證預測的平均值。

除了lejlot的答案外,cross_val_score和cross_val_predict之間可能會得到略有不同的結果的另一種方式是,目標類的分布方式不使它們在折痕之間平均分配。

根據cross_val_predict的文檔,如果estimator是分類器,並且y是二進制或多類,則默認使用StratifiedKFold。 這可能會導致一種情況,即使數據集中實例的總數可以被折疊數整除,但最終折疊的大小會稍有不同,因為拆分器是根據目標的存在進行拆分的。 然后,這可能導致平均平均值與總體平均值略有不同的問題。

例如,如果有100個數據點,以及這些33是目標類,然后KFoldn_splits=5將分成的20個觀察5倍這一點,但StratifiedKFold不一定給你相等大小的褶皺。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM