sklearn svm.SVC中的属性错误

时间:2017-03-21 22:13:12

标签: python scikit-learn svm

在使用scikit-learn实现线性SVM时遇到属性错误问题。我正在使用线性分类器通过RFECV方法进行交叉验证,我无法访问SVC的任何属性。不确定它是否与特征选择或基本模型有关。

    model = svm.SVC(kernel='linear')
    selector=RFECV(model)
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=pct_test)
    selector=selector.fit(X_train, Y_train)
    my_prediction = selector.predict(X_test)
    f1.append(metrics.f1_score(Y_test, my_prediction))
    kappa.append(metrics.cohen_kappa_score(Y_test, my_prediction))
    precision.append(metrics.precision_score(Y_test, my_prediction))
    recall.append(metrics.recall_score(Y_test, my_prediction))
    print model.intercept_
    print model.support_vectors_
    print model.coef_

指标工作正常,属性全部失败。 错误消息是:

AttributeError:'SVC'对象没有属性'intercept _'

文档:http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC

除此之外:我对OOP很新。如果我缺少一个潜在的概念,请详细说明或通过链接发送。

1 个答案:

答案 0 :(得分:0)

您正在拟合(训练数据)RFECV对象selector,但尝试访问SVC对象model的属性。但它没有受过训练。因此,其中没有属性intercept_

要访问SVC的拦截,您应该使用:

selector.estimator_.intercept_ 

但要理解上述估算器仅适用于简化数据集(在消除指定的特征之后)

<强>解释

您可以看到,RFECV内部使用RFE来获取每次迭代中的重要功能。并且RFE克隆了所提供的估算器。因此,当您使用model初始化RFECV时,它会接受模型克隆的培训。 检查source code

第407行(在RFECV的拟合方法内):

rfe = RFE(estimator=self.estimator, 
          n_features_to_select=n_features_to_select, 
          step=self.step, verbose=self.verbose)

第428行(用于估算得分):

scores = parallel(func(rfe, self.estimator, X, y, train, test, scorer)
                       for train, test in cv.split(X, y))

然后是第165行(RFE的内部拟合方法):

estimator = clone(self.estimator)