如何基于构造函数的参数创建具有类属性的子类,以供GridSearchCV的估计器使用?

霍克拉兹

我想sklearn.svm.LinearSVC使用子类并将其用作的估计量sklearn.model_selection.GridSearchCV我之前有一些关于子类化的问题,我想我根据之前的帖子和选定的答案进行了修复

但是,现在我的目标是创建一个sklearn.kernel_approximation.RBFSampler对象作为新类的属性。现在这是一个示例,我在这里有一个更广泛的问题:

问题: 最终期望将我的新estimator类与一起使用GridSearchCV,如何基于传递到构造函数(或缺少构造函数)的参数值创建属性?

到目前为止,我已经尝试了以下方法:

from sklearn.datasets import make_classification
from sklearn.svm import LinearSVC
from sklearn.model_selection import GridSearchCV
from sklearn.kernel_approximation import RBFSampler
from sklearn.datasets import load_breast_cancer

RANDOM_STATE = 123


class LinearSVCSub(LinearSVC):
    def __init__(self, penalty='l2', loss='squared_hinge', sampler_gamma=None, sampler_n=None,
                 dual=True, tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1,
                 class_weight=None, verbose=0, random_state=None, max_iter=1000):

        super(LinearSVCSub, self).__init__(penalty=penalty, loss=loss, dual=dual, tol=tol,
                                           C=C, multi_class=multi_class, fit_intercept=fit_intercept,
                                           intercept_scaling=intercept_scaling, class_weight=class_weight,
                                           verbose=verbose, random_state=random_state, max_iter=max_iter)

        self.sampler_gamma = sampler_gamma
        self.sampler_n = sampler_n
        
        # I have also tried a conditional statement here instead of
        #  within a separate function create_sampler()
        self.sampler = create_sampler()
       

    def fit(self, X, y, sample_weight=None):
        X = self.transform_this(X)
        super(LinearSVCSub, self).fit(X, y, sample_weight)
        return self

    def predict(self, X):
        X = self.transform_this(X)
        return super(LinearSVCSub, self).predict(X)

    def score(self, X, y, sample_weight=None):
        X = self.transform_this(X)
        return super(LinearSVCSub, self).score(X, y, sample_weight)

    def decision_function(self, X):
        X = self.transform_this(X)
        return super(LinearSVCSub, self).decision_function(X)

    def transform_this(self, X):
        if self.sampler is not None:
            X = sampler.fit_transform(X)
        return X
    
    def create_sampler(self):
         # If sampler_gamma and sampler_n have been given, create a sampler
        if (self.sampler_gamma is not None) and (self.sampler_n is not None):
            sampler = RBFSampler(gamma=self.sampler_gamma, n_components=self.sampler_n)
        else:
            sampler = None
        
        return sampler


if __name__ == '__main__':
    data = load_breast_cancer()
    X, y = data.data, data.target

    # Parameter tuning with custom LinearSVC
    param_grid = {'C': [0.00001, 0.0005],
                      'dual': (True, False), 'random_state': [RANDOM_STATE],
                      'sampler_gamma': [0.90, 0.60, 0.30],
                      'sampler_n': [10, 200]}

    gs_model = GridSearchCV(estimator=LinearSVCSub(), verbose=1, param_grid=param_grid,
                            scoring='roc_auc', n_jobs=-1, cv=2)
    gs_model.fit(X, y)
    gs_model.cv_results_

但是,正如我在这里了解到的那样,GridSearchCV首先使用默认值初始化estimator对象,并与中的feature_importances_属性实现类似sklearn.tree.DecisionTreeClassifier

另外,我从上面的代码中得到的错误是:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-6-a11420cc931e> in <module>
     66                       'sampler_n': [10, 200]}
     67 
---> 68     gs_model = GridSearchCV(estimator=LinearSVCSub(), verbose=1, param_grid=param_grid,
     69                             scoring='roc_auc', n_jobs=-1, cv=2)
     70     gs_model.fit(X, y)

<ipython-input-6-a11420cc931e> in __init__(self, penalty, loss, sampler_gamma, sampler_n, dual, tol, C, multi_class, fit_intercept, intercept_scaling, class_weight, verbose, random_state, max_iter)
     21         self.sampler_n = sampler_n
     22 
---> 23         self.sampler = create_sampler()
     24 
     25 

NameError: name 'create_sampler' is not defined
谢尔盖·布什曼诺夫(Sergey Bushmanov)
  1. 使用__init__构造函数作为容器来存储属性。
  2. 在方法中执行所有相应的逻辑
from sklearn.datasets import make_classification
from sklearn.svm import LinearSVC
from sklearn.model_selection import GridSearchCV
from sklearn.kernel_approximation import RBFSampler
from sklearn.datasets import load_breast_cancer

RANDOM_STATE = 123


class LinearSVCSub(LinearSVC):
    
    def __init__(self, penalty='l2', loss='squared_hinge', sampler_gamma=None, sampler_n=None,
                 dual=True, tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1,
                 class_weight=None, verbose=0, random_state=None, max_iter=1000, sampler=None):

        super(LinearSVCSub, self).__init__(penalty=penalty, loss=loss, dual=dual, tol=tol,
                                           C=C, multi_class=multi_class, fit_intercept=fit_intercept,
                                           intercept_scaling=intercept_scaling, class_weight=class_weight,
                                           verbose=verbose, random_state=random_state, max_iter=max_iter)

        self.sampler_gamma = sampler_gamma
        self.sampler_n = sampler_n
        self.sampler = sampler
       
    def fit(self, X, y, sample_weight=None):
        X = self.transform_this(X)
        super(LinearSVCSub, self).fit(X, y, sample_weight)
        return self

    def predict(self, X):
        X = self.transform_this(X)
        return super(LinearSVCSub, self).predict(X)

    def score(self, X, y, sample_weight=None):
        X = self.transform_this(X)
        return super(LinearSVCSub, self).score(X, y, sample_weight)

    def decision_function(self, X):
        X = self.transform_this(X)
        return super(LinearSVCSub, self).decision_function(X)

    def transform_this(self, X):
        if self.sampler:
            X = RBFSampler(gamma=self.sampler_gamma, n_components=self.sampler_n).fit_transform(X)
        return X



data = load_breast_cancer()
X, y = data.data, data.target

# Parameter tuning with custom LinearSVC
param_grid = {'C': [0.00001, 0.0005],
                  'dual': (True, False), 'random_state': [RANDOM_STATE],
                  'sampler_gamma': [0.90, 0.60, 0.30],
                  'sampler_n': [10, 200],
                  'sampler':[0,1]
             }

gs_model = GridSearchCV(estimator=LinearSVCSub(sampler=1), verbose=1, param_grid=param_grid,
                        scoring='roc_auc', n_jobs=-1, cv=2)
gs_model.fit(X, y)
gs_model.cv_results_

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有额外属性的子类构造函数

来自分类Dev

如何基于超类属性的值创建子类的实例

来自分类Dev

当基类具有带参数的构造函数时,为什么不能创建无参数子类构造函数?

来自分类Dev

如何使用具有相同参数类型的多个构造函数创建类

来自分类Dev

从具有泛型参数的子类方法调用构造函数

来自分类Dev

使用类属性调用具有非类型模板参数的模板函数

来自分类Dev

Java如何在调用父构造函数之前覆盖子类中的父类属性

来自分类Dev

通过构造函数设置子类属性:不好的做法?

来自分类Dev

如何动态创建具有类属性的列表

来自分类Dev

如果子类与父类具有相同的参数,则子类应该重写构造函数吗?

来自分类Dev

如何构造具有构造函数参数的对象的向量?

来自分类Dev

如何使用超类的构造函数创建子类的实例

来自分类Dev

具有数组参数的属性构造函数

来自分类Dev

我如何创建具有与类相同的泛型作为参数的构造函数

来自分类Dev

如何从子类访问属性 [field] 并在子类的构造函数中创建它?

来自分类Dev

子类需要具有构造函数吗?

来自分类Dev

使用类属性限制函数参数值

来自分类Dev

如何使用 kotlinpoet 生成具有单个类型参数的 Kotlin“Unit”类型的构造函数参数?

来自分类Dev

在构造函数期间/之后限定类属性(新创建)

来自分类Dev

使用ImmutableJS记录创建具有不同属性的子类

来自分类Dev

从具有构造函数参数的父类注入子类。(奥蕾莉亚)

来自分类Dev

从具有构造函数参数的父类注入子类。(奥蕾莉亚)

来自分类Dev

如何使用 VBScript 子类或通过子或构造函数设置子类类型属性?

来自分类Dev

如何使用具有构造函数参数的TypeScript类定义AngularJS工厂

来自分类Dev

如何使用具有 List<T> 参数的构造函数解析类?

来自分类Dev

如何在构造函数之外访问类属性

来自分类Dev

存储函数以供以后使用/具有未定义属性的委托

来自分类Dev

如何使用内部构造函数从具有新约束的通用类创建实体

来自分类Dev

如何使用非默认构造函数创建具有类型的类范围范围的对象

Related 相关文章

  1. 1

    具有额外属性的子类构造函数

  2. 2

    如何基于超类属性的值创建子类的实例

  3. 3

    当基类具有带参数的构造函数时,为什么不能创建无参数子类构造函数?

  4. 4

    如何使用具有相同参数类型的多个构造函数创建类

  5. 5

    从具有泛型参数的子类方法调用构造函数

  6. 6

    使用类属性调用具有非类型模板参数的模板函数

  7. 7

    Java如何在调用父构造函数之前覆盖子类中的父类属性

  8. 8

    通过构造函数设置子类属性:不好的做法?

  9. 9

    如何动态创建具有类属性的列表

  10. 10

    如果子类与父类具有相同的参数,则子类应该重写构造函数吗?

  11. 11

    如何构造具有构造函数参数的对象的向量?

  12. 12

    如何使用超类的构造函数创建子类的实例

  13. 13

    具有数组参数的属性构造函数

  14. 14

    我如何创建具有与类相同的泛型作为参数的构造函数

  15. 15

    如何从子类访问属性 [field] 并在子类的构造函数中创建它?

  16. 16

    子类需要具有构造函数吗?

  17. 17

    使用类属性限制函数参数值

  18. 18

    如何使用 kotlinpoet 生成具有单个类型参数的 Kotlin“Unit”类型的构造函数参数?

  19. 19

    在构造函数期间/之后限定类属性(新创建)

  20. 20

    使用ImmutableJS记录创建具有不同属性的子类

  21. 21

    从具有构造函数参数的父类注入子类。(奥蕾莉亚)

  22. 22

    从具有构造函数参数的父类注入子类。(奥蕾莉亚)

  23. 23

    如何使用 VBScript 子类或通过子或构造函数设置子类类型属性?

  24. 24

    如何使用具有构造函数参数的TypeScript类定义AngularJS工厂

  25. 25

    如何使用具有 List<T> 参数的构造函数解析类?

  26. 26

    如何在构造函数之外访问类属性

  27. 27

    存储函数以供以后使用/具有未定义属性的委托

  28. 28

    如何使用内部构造函数从具有新约束的通用类创建实体

  29. 29

    如何使用非默认构造函数创建具有类型的类范围范围的对象

热门标签

归档