在使用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很新。如果我缺少一个潜在的概念,请详细说明或通过链接发送。
答案 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)