在使用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)