【问题标题】:Object has no attribute in scikit-learn, how can I access it?对象在 scikit-learn 中没有属性,我该如何访问它?
【发布时间】:2016-01-29 04:08:15
【问题描述】:

我想用scikit的SVC classifiercross-vlidation的不同参数,所以我尝试了以下:

那么,让我们使用SVC算法:

from sklearn import svm
print('Support vector machine(SVM):   {:.2f}'.format(metrics.accuracy_score(
            y, stratified_cv(X, y, svm.SVC(kernel='linear')))))

但似乎我无法访问该对象:

AttributeError                            Traceback (most recent call last)
<ipython-input-16-dacd8d429376> in <module>()
      5 
      6 print('Support vector machine(SVM):   {:.2f}'.format(metrics.accuracy_score(
----> 7             y, stratified_cv(X, y, svm.SVC(kernel='linear')))))
      8 

AttributeError: 'SVC' object has no attribute 'SVC'

有趣的是,当我尝试这个时:

print('Support vector machine(SVM):   {:.2f}'.format(metrics.accuracy_score(
            y, stratified_cv(X, y, svm.SVC))))

我明白了:

Support vector machine(SVM):   0.46

会发生什么?...对于上述交叉验证策略的任何想法,如何设置我自己的 SVM 配置?提前谢谢各位!

【问题讨论】:

  • 您是否创建了一个名为 svm 的对象来隐藏 svm 模块?
  • 那么请展示一个独立的例子来说明问题。您发布的代码中未定义变量svm
  • 在出现错误的情况下,您将stratified_cv 传递给SVC 的输出。在您没有收到错误的情况下,您将传递 stratified_cv 函数 SVC 本身。这是两个非常不同的事情。您的函数使用一种输入而不是另一种输入,这并不奇怪。多想想你在这里有什么。
  • 另外,看看你在引发错误的行上做了多少。为了隔离错误的原因,您需要在不同的行上进行不同的操作。
  • 就目前而言,这个问题应该关闭,因为它有很多复杂的BS,分散了核心问题,这是对函数对象和返回值之间的区别的简单混淆的那个功能。我想说你应该清理掉这里所有无关的scikit 东西,只保留你真正问题的精髓,即“svm.SVCsvm.SVC(...) 之间有什么区别?”

标签: python python-2.7 object python-3.x machine-learning


【解决方案1】:

你需要一个来自 python 的partial。一般来说,你的函数需要你传递一些可以用clf_class(**kwargs)调用的东西,所以如果你传递一个特定的object(通过clf = SVC(kernel='linear')获得)它将不起作用,因为你尝试这样做

SVC(kernel='linear')(**kwargs) # error!

你想打电话

SVC(kernel='linear', **kwargs)

这样你就可以在 python 中声明偏函数

from functools import partial
linear_svm = partial(svm.SVC, kernel='linear')

现在你可以打电话了

linear_svm(**kwargs)

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 2019-06-18
    • 1970-01-01
    • 2015-07-03
    • 2019-07-03
    • 1970-01-01
    • 2018-12-31
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多