sklearn 中的属性错误 svm.SVC

attribute error in sklearn svm.SVC

使用 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 很陌生。如果我遗漏了一个基本概念,请详细说明或发送 link.

您正在 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的Inside fit方法):

estimator = clone(self.estimator)