如何在类之间传递属性(克隆问题)



我有下面的代码可以正常工作:

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]
然而,我的问题是这样的。类FeatureSelection()中的属性select_RFECV,取其中一个输入估计量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.

如何在类之间正确地传递属性?

这里有几个问题:

第一个

:

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期望一个分类器并接收到其他东西的事实有关。

相关内容

  • 没有找到相关文章

最新更新