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_

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

属性

错误:"SVC"对象没有属性"intercept_">

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

旁白:我对OOP很陌生。如果我缺少一个基本概念,请详细说明或通过链接发送。

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

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

selector.estimator_.intercept_ 

但请理解,上述估计器仅拟合在简化的数据集上(在消除指定的特征后(

解释:

你看,RFECV在内部使用RFE来获得每次迭代中的重要特征。RFE 为此目的克隆提供的估算器。因此,当您使用 model 初始化 RFECV 时,它会在模型的克隆上进行训练。检查源代码:

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)

最新更新