"得分必须返回一个数字" scikit-learn中的cross_val_score错误

时间:2015-04-20 17:29:58

标签: python numpy machine-learning 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

1 个答案:

答案 0 :(得分:2)

我认为这可能是scikit中的一个问题。 cross_val_score最终调用score函数,无论传递给它的估算器是什么。通常,score(例如KMeansreturns a float。当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

scorearray is returned上调用GMM

>>> 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)

这可以避免错误,我认为应该或多或少地做你想要的。我不确定平均值是否必然是总结得分的最佳方式,尽管它似乎足够合理。但是从这里你可以定义自己的方法。