【问题标题】:"scoring must return a number" cross_val_score error in scikit-learnscikit-learn 中的“评分必须返回一个数字”cross_val_score 错误
【发布时间】:2015-06-27 13:39:59
【问题描述】:

也许这是一个愚蠢的问题,但我不明白下面代码中的函数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

【问题讨论】:

    标签: python numpy machine-learning scikit-learn


    【解决方案1】:

    我认为这可能是 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的返回类型:

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

    当score 在GMM 和array is returned 上调用时。

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

    这避免了错误,我认为应该或多或少地做你正在寻找的东西。我不确定平均值是否一定是总结分数的最佳方式,尽管它似乎足够合理。但是您可以从这里定义自己的方法。

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 2021-07-01
      • 2018-01-29
      • 2015-12-14
      • 2018-03-06
      • 2020-09-23
      • 2018-05-14
      • 2015-11-28
      相关资源
      最近更新 更多