Mik*_*ke 5 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)
Run Code Online (Sandbox Code Playgroud)
给我错误:
ValueError: scoring must return a number, got (<type 'numpy.ndarray'>) instead
Run Code Online (Sandbox Code Playgroud)
我认为这可能是 scikit 中的一个问题。cross_val_score最终调用该score函数以获取传递给它的任何估计器。通常,score(例如 in KMeans)返回 float。当KMeans估计器传递给时cross_val_score,一切都很好:
>>> clf = cluster.KMeans()
>>> score = cross_validation.cross_val_score(clf, X)
# (no error)
Run Code Online (Sandbox Code Playgroud)
请注意 的返回类型score:
>>> clf = cluster.KMeans()
>>> clf.fit(X)
>>> type(clf.score(X))
numpy.float64
Run Code Online (Sandbox Code Playgroud)
当score对一个数组进行调用时,会返回GMM一个数组。
>>> clf = mixture.GMM()
>>> clf.fit(X)
>>> type(clf.score(X))
numpy.ndarray
Run Code Online (Sandbox Code Playgroud)
因为cross_val_score依赖于clf.score()返回浮点数,所以您看到的错误消息是有意义的。
解决方法是配备cross_val_score您自己的记分员。例如,要获取 所返回分数的平均值GMM.score(),请创建以下评分函数:
>>> scorer = lambda est, data: np.mean(est.score(data))
Run Code Online (Sandbox Code Playgroud)
然后您可以将此记分器作为参数传递给cross_val_score:
>>> score = cross_validation.cross_val_score(clf, X, scoring=scorer)
Run Code Online (Sandbox Code Playgroud)
这可以避免错误,我认为或多或少应该做你正在寻找的事情。我不确定平均值是否一定是总结分数的最佳方式,尽管它看起来足够合理。但从这里您可以定义自己的方法。
| 归档时间: |
|
| 查看次数: |
1075 次 |
| 最近记录: |