我有以下代码可以正常工作:
class Classifiers(object):
"""Multiple classifiers"""
class SVM():
"""
SVM Classifier Object.
This is binary classifier
"""
@staticmethod
def classifier(X, y):
from sklearn import svm
classifier = svm.SVC(kernel='linear', probability=True)
return(X,y,classifier)
class FeatureSelection(object):
def select_RFECV(self, X, y, clf):
"""
Feature ranking with recursive feature elimination
and cross-validated
"""
from sklearn.feature_selection import RFECV
from sklearn.svm import SVC
estimator = SVC(kernel="linear", probability=True)
# Below retrieving Clf failed
#estimator = clf
# Code below is ok
selector = RFECV(estimator, step=1, cv=5)
selector = selector.fit(X, y)
print selector.support_
return
def main():
# call estimator
svm = Classifiers.SVM()
# Create dataset
from sklearn import datasets
X, y = datasets.make_classification(n_samples = 100, n_features =20, n_classes=2)
# Feature selection
FS = FeatureSelection()
sel = FS.select_RFECV(X,y,svm)
if __name__ == '__main__':
main()
它产生如下输出:
[False True False False False True False False False False True True
False False True False False False False True]
但我的问题是这个。类select_RFECV
中的属性FeatureSelection()
,
将其中一个输入作为估算器clf
。现在,此estimator
实际上与svm = Classifiers.SVM()
相同。
当我评论estimator = SVC(kernel="linear", probability=True)
并取消注释estimator = clf
时。我收到了这个错误:
TypeError: Cannot clone object '<__main__.SVM instance at 0x1112f0fc8>' (type <type 'instance'>): it does not seem to be a scikit-learn estimator a it does not implement a 'get_params' methods.
如何在类之间正确传递属性?
答案 0 :(得分:2)
这里有一些问题:
第一个:
svm = Classifiers.SVM()
从您的代码判断,svm现在只是一个空实例,没有成员。就像做svm = object()
一样。由于classifier
是一个静态方法(我不会判断该决定,只是将其作为输入) - 并且唯一的方法 - 不需要实现该类。不需要这一行。
第二个:
sel = FS.select_RFECV(X,y,svm)
此方法预期X,y和clf。它得到了X,y和一个空实例。这个方法应该接受的是猜测:
sel = FS.select_RFECV(*Classifiers.SVM.classifier(X,y))
这将传递分类器方法(X, y, classifier)
的输出,作为方法的输入。
您收到的克隆错误与您的类无关,而是与sklearn期望分类器并接收其他内容的事实相关。