"scoring must return a number" cross_val_score scikit-learn 错误
"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
)returns a float。当 KMeans
估计器传递给 cross_val_score
时,一切正常:
>>> clf = cluster.KMeans()
>>> score = cross_validation.cross_val_score(clf, X)
# (no error)
注意 score
的 return 类型:
>>> clf = cluster.KMeans()
>>> clf.fit(X)
>>> type(clf.score(X))
numpy.float64
当在 GMM
和 array is returned 上调用 score
时。
>>> clf = mixture.GMM()
>>> clf.fit(X)
>>> type(clf.score(X))
numpy.ndarray
因为 cross_val_score
依赖于 clf.score()
return 浮点数,所以您看到的错误消息是有道理的。
解决方法是为 cross_val_score
提供您自己的记分器。例如,要取 GMM.score()
的得分 return 的平均值,创建此评分函数:
>>> scorer = lambda est, data: np.mean(est.score(data))
然后你可以将这个得分手作为参数传递给cross_val_score
:
>>> score = cross_validation.cross_val_score(clf, X, scoring=scorer)
这样就避免了错误,我认为应该或多或少地做你正在寻找的事情。我不确定平均值是否一定是总结分数的最佳方式,尽管它看起来很合理。但是从这里您可以定义自己的方法。
也许这是一个愚蠢的问题,但我不明白下面代码中的函数 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
)returns a float。当 KMeans
估计器传递给 cross_val_score
时,一切正常:
>>> clf = cluster.KMeans()
>>> score = cross_validation.cross_val_score(clf, X)
# (no error)
注意 score
的 return 类型:
>>> clf = cluster.KMeans()
>>> clf.fit(X)
>>> type(clf.score(X))
numpy.float64
当在 GMM
和 array is returned 上调用 score
时。
>>> clf = mixture.GMM()
>>> clf.fit(X)
>>> type(clf.score(X))
numpy.ndarray
因为 cross_val_score
依赖于 clf.score()
return 浮点数,所以您看到的错误消息是有道理的。
解决方法是为 cross_val_score
提供您自己的记分器。例如,要取 GMM.score()
的得分 return 的平均值,创建此评分函数:
>>> scorer = lambda est, data: np.mean(est.score(data))
然后你可以将这个得分手作为参数传递给cross_val_score
:
>>> score = cross_validation.cross_val_score(clf, X, scoring=scorer)
这样就避免了错误,我认为应该或多或少地做你正在寻找的事情。我不确定平均值是否一定是总结分数的最佳方式,尽管它看起来很合理。但是从这里您可以定义自己的方法。