【问题标题】:Python scikit-learn - TypeErrorPython scikit-learn - 类型错误
【发布时间】:2015-03-21 02:10:29
【问题描述】:

我正在编写一个小程序来绘制具有交叉验证的数据集的 SVM 和朴素贝叶斯的学习曲线。这是绘图函数的代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn import cross_validation
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.learning_curve import learning_curve

def plot_learning_curves(X, y, nb=GaussianNB, svc=SVC(kernel='linear'), ylim=None, cv=None, n_jobs=1,
                     train_sizes=np.linspace(.1, 1.0, 5)):
    plt.figure()
    plt.title('Learning Curves with NB and SVM')
    if ylim is not None:
        plt.ylim(*ylim)

    train_sizes_nb, test_scores_nb = learning_curve(
        nb, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)
    test_scores_mean_nb = np.mean(test_scores_nb, axis=1)

    train_sizes_svc, test_scores_svc = learning_curve(
        svc, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)
    test_scores_mean_svc = np.mean(test_scores_svc, axis=1)

    plt.grind()

    plt.plot(train_sizes_nb, test_scores_mean_nb, 'o-', color="g",
             label="NB")
    plt.plot(train_sizes_svc, test_scores_mean_svc,'o',color="r",label="SVM")    

return plt

这是函数调用:

digits = load_digits()
X, y = digits.data, digits.target

cv = cross_validation.ShuffleSplit(digits.data.shape[0], n_iter=100,
                               test_size=0.2, random_state=0)
plot_learning_curves(X, y, ylim=(0.7, 1.01), cv=cv,n_jobs=1)
plt.show()

我不知道是什么问题,但我得到了这个错误:

Traceback (most recent call last):
File "C:/Users/Gianmarco/PycharmProjects/Learning/plotLearningCurves.py", line 43, in <module>
plot_learning_curves(X, y, ylim=(0.7, 1.01), cv=cv,n_jobs=1)
File "C:/Users/Gianmarco/PycharmProjects/Learning/plotLearningCurves.py", line 19, in plot_learning_curves
nb, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)
File "C:\Users\Gianmarco\Anaconda\lib\site-packages\sklearn\learning_curve.py", line 136, in learning_curve
for train, test in cv for n_train_samples in train_sizes_abs)
File "C:\Users\Gianmarco\Anaconda\lib\site-packages\sklearn\externals\joblib\parallel.py", line 652, in __call__
for function, args, kwargs in iterable:
File "C:\Users\Gianmarco\Anaconda\lib\site-packages\sklearn\learning_curve.py", line 136, in <genexpr>
for train, test in cv for n_train_samples in train_sizes_abs)
File "C:\Users\Gianmarco\Anaconda\lib\site-packages\sklearn\base.py", line 45, in clone
new_object_params = estimator.get_params(deep=False)
TypeError: unbound method get_params() must be called with GaussianNB instance as first argument (got nothing instead)

Process finished with exit code 1

我不明白“TypeError: unbound method get_params() must be called with GaussianNB instance as first argument (got nothing instead)”这行是什么意思。

什么是可能的解决方案?

【问题讨论】:

  • 看起来 sklearn 的错误信息不是很好。我不知道这个模块,所以我不知道这是否会有所帮助:它说你需要一个 GaussianNB 实例。也许您需要创建一个实例?将nb=GaussianNB 更改为nb=GaussianNB()

标签: python numpy scikit-learn


【解决方案1】:

解决方案非常简单。 这不是

nb=GaussianNB

但是

nb=GaussianNB()

【讨论】:

    【解决方案2】:

    TypeError: unbound method get_params() 必须以 GaussianNB 实例作为第一个参数调用(什么都没有)

    此错误表示方法 get_params() 已收到 None 而不是 GaussianNB 对象。

    错误发生在 sklearn 模块内部的几个步骤中。因此,如果不使用调试工具进入代码并阅读 sklearn 源代码,就很难调试确切的原因。

    如果您使用的是 ipython,%debug 魔术命令对于调查这类异常非常有用。

    查看您的代码,问题可能在于您将GaussianNB 类而不是该类的实例传递给sklearn.learning_curve.learning_curve()

    从到docslearning_curve

    参数: estimator:实现“fit”和“predict”方法的对象类型 为每次验证克隆的该类型的对象。

    我觉得这很模棱两可。但是在示例代码中,使用了GaussianNB 实例,而不是类型。

    除此之外,使用mutables as default arguments 通常不是一个好主意。对象实例是可变的。它还使您的代码更难阅读和调试。

    有了这么多可选的关键字参数,这样的内容可能更具可读性。

    def plot_learning_curves(x, y, ylim=None, **kwargs):
        """ Plots learning curves with NB and SVM """
        nb = kwargs.get('nb', GaussianNB())
        svc = kwargs.get('svc', SVC(kernel='linear'))
        train_sizes = kwargs.get('train_sizes', np.linspace(.1, 1.0, 5))     
    

    您可能根本不需要那些关键字参数。看起来您是从复制一些示例代码并添加自己的东西开始的。最好先简化示例代码并确保您了解正在发生的事情。

    def plot_learning_curves(x, y, ylim=None):
        nb = GaussianNB()
        svc = SVC(kernel='linear')
        train_sizes = np.linspace(.1, 1.0, 5)
    

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 2018-05-03
      • 1970-01-01
      • 2016-01-26
      • 2019-11-29
      • 2016-06-28
      • 2016-08-11
      • 2014-06-27
      • 2018-10-29
      相关资源
      最近更新 更多