簡體   English   中英

“得分必須返回一個數字”scikit-learn中的cross_val_score錯誤

[英]“scoring must return a number” cross_val_score error in scikit-learn

也許這是一個愚蠢的問題,但我不明白下面代碼中的函數cross_val_score給出的錯誤。 也許答案是X樣本的格式,看到這正是崩潰消息中顯示的內容,但我不知道如何修復。 這是我項目中的一段代碼,帶有一些隨機值。

import numpy as np
from sklearn import mixture,cross_validation

np.random.seed(0)
n_samples = 300
C = np.array([[0., -0.7], [3.5, .7]])
X = np.r_[np.dot(np.random.randn(n_samples, 2), C),
          np.random.randn(n_samples, 2) + np.array([20, 20])]

clf = mixture.GMM(n_components=2, covariance_type='full')
score = cross_validation.cross_val_score(clf, X)

給我錯誤:

ValueError: scoring must return a number, got (<type 'numpy.ndarray'>) instead

我認為這可能是scikit中的一個問題。 cross_val_score最終調用score函數,無論估計器傳遞給它。 通常, score (例如在KMeans返回浮點數 當一個KMeans估算器傳遞給cross_val_score ,一切都很好:

>>> clf = cluster.KMeans()
>>> score = cross_validation.cross_val_score(clf, X)
# (no error)    

注意score的返回類型:

>>> clf = cluster.KMeans()
>>> clf.fit(X)
>>> type(clf.score(X))
numpy.float64

GMM上調用score ,將返回一個數組

>>> clf = mixture.GMM()
>>> clf.fit(X)
>>> type(clf.score(X))
numpy.ndarray

因為cross_val_score依賴於clf.score()返回一個浮點數,所以你看到的錯誤信息是有意義的。

解決方法是為您自己的得分手提供cross_val_score 例如,要獲取GMM.score()返回的分數的平均值,請創建此評分函數:

>>> scorer = lambda est, data: np.mean(est.score(data))

然后你可以將這個得分手作為參數傳遞給cross_val_score

>>> score = cross_validation.cross_val_score(clf, X, scoring=scorer)

這可以避免錯誤,我認為應該或多或少地做你正在尋找的東西。 我不確定平均值是否必然是總結得分的最佳方式,盡管它似乎足夠合理。 但是從這里你可以定義自己的方法。

暫無
暫無

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

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