首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >扩展xgboost.XGBClassifier

扩展xgboost.XGBClassifier
EN

Stack Overflow用户
提问于 2017-08-30 01:42:59
回答 1查看 1.1K关注 0票数 1

我正在尝试定义一个名为XGBExtended的类,它扩展了类xgboost.XGBClassifier,xgboost的scikit-learn API。我遇到了一些关于get_params方法的问题。下面是一个说明该问题的IPython会话。基本上,get_params似乎只返回我在XGBExtended.__init__中定义的属性,在父初始化方法(xgboost.XGBClassifier.__init__)期间定义的属性被忽略。我正在使用IPython并运行Python2.7。完整的系统规格在底部。

代码语言:javascript
运行
AI代码解释
复制
In [182]: import xgboost as xgb
     ...: 
     ...: class XGBExtended(xgb.XGBClassifier):
     ...:   def __init__(self, foo):
     ...:     super(XGBExtended, self).__init__()
     ...:     self.foo = foo
     ...: 
     ...: clf = XGBExtended(foo = 1)
     ...: 
     ...: clf.get_params()
     ...: 
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-182-431c4c3f334b> in <module>()
      8 clf = XGBExtended(foo = 1)
      9 
---> 10 clf.get_params()

/Users/andrewhannigan/lib/xgboost/python-package/xgboost/sklearn.pyc in get_params(self, deep)
    188         if isinstance(self.kwargs, dict):  # if kwargs is a dict, update params accordingly
    189             params.update(self.kwargs)
--> 190         if params['missing'] is np.nan:
    191             params['missing'] = None  # sklearn doesn't handle nan. see #4725
    192         if not params.get('eval_metric', True):

KeyError: 'missing'

所以我遇到了一个错误,因为'missing‘不是XGBClassifier.get_params方法中的params字典中的关键字。我进入调试器来查看:

代码语言:javascript
运行
AI代码解释
复制
In [183]: %debug
> /Users/andrewhannigan/lib/xgboost/python-package/xgboost/sklearn.py(190)get_params()
    188         if isinstance(self.kwargs, dict):  # if kwargs is a dict, update params accordingly
    189             params.update(self.kwargs)
--> 190         if params['missing'] is np.nan:
    191             params['missing'] = None  # sklearn doesn't handle nan. see #4725
    192         if not params.get('eval_metric', True):

ipdb> params
{'foo': 1}
ipdb> self.__dict__
{'n_jobs': 1, 'seed': None, 'silent': True, 'missing': nan, 'nthread': None, 'min_child_weight': 1, 'random_state': 0, 'kwargs': {}, 'objective': 'binary:logistic', 'foo': 1, 'max_depth': 3, 'reg_alpha': 0, 'colsample_bylevel': 1, 'scale_pos_weight': 1, '_Booster': None, 'learning_rate': 0.1, 'max_delta_step': 0, 'base_score': 0.5, 'n_estimators': 100, 'booster': 'gbtree', 'colsample_bytree': 1, 'subsample': 1, 'reg_lambda': 1, 'gamma': 0}
ipdb> 

如您所见,params只包含foo变量。但是,对象本身包含xgboost.XGBClassifier.__init__定义的所有参数。但是由于某些原因,从xgboost.XGBClassifier.get_params调用的BaseEstimator.get_params方法只能获得在XGBExtended.__init__方法中显式定义的参数。不幸的是,即使我用deep = True显式调用get_params,它仍然不能正常工作:

代码语言:javascript
运行
AI代码解释
复制
ipdb> super(XGBModel, self).get_params(deep=True)
{'foo': 1}
ipdb> 

有人能说出为什么会发生这种情况吗?

系统规格:

代码语言:javascript
运行
AI代码解释
复制
In [186]: print IPython.sys_info()
{'commit_hash': u'1149d1700',
 'commit_source': 'installation',
 'default_encoding': 'UTF-8',
 'ipython_path': '/Users/andrewhannigan/virtualenvironment/nimble_ai/lib/python2.7/site-packages/IPython',
 'ipython_version': '5.4.1',
 'os_name': 'posix',
 'platform': 'Darwin-14.5.0-x86_64-i386-64bit',
 'sys_executable': '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python',
 'sys_platform': 'darwin',
 'sys_version': '2.7.10 (default, Jul  3 2015, 12:05:53) \n[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)]'}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-30 01:55:51

这里的问题是子类的声明不正确。当您仅使用foo声明init方法时,您将覆盖原始方法。它不会自动初始化,即使基类构造函数应该有默认值。

您应该使用以下内容:

代码语言:javascript
运行
AI代码解释
复制
class XGBExtended(xgb.XGBClassifier):
    def __init__(self, foo, max_depth=3, learning_rate=0.1,
                 n_estimators=100, silent=True,
                 objective="binary:logistic",
                 nthread=-1, gamma=0, min_child_weight=1,
                 max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1,
                 reg_alpha=0, reg_lambda=1, scale_pos_weight=1,
                 base_score=0.5, seed=0, missing=None, **kwargs):

        # Pass the required parameters to super class
        super(XGBExtended, self).__init__(max_depth, learning_rate,
                                            n_estimators, silent, objective,
                                            nthread, gamma, min_child_weight,
                                            max_delta_step, subsample,
                                            colsample_bytree, colsample_bylevel,
                                            reg_alpha, reg_lambda,
scale_pos_weight, base_score, seed, missing, **kwargs)

        # Use other custom parameters
        self.foo = foo

在此之后,您将不会得到任何错误。

代码语言:javascript
运行
AI代码解释
复制
clf = XGBExtended(foo = 1)
print(clf.get_params(deep=True))

>>> {'reg_alpha': 0, 'colsample_bytree': 1, 'silent': True, 
     'colsample_bylevel': 1, 'scale_pos_weight': 1, 'learning_rate': 0.1, 
     'missing': None, 'max_delta_step': 0, 'nthread': -1, 'base_score': 0.5, 
     'n_estimators': 100, 'subsample': 1, 'reg_lambda': 1, 'seed': 0, 
     'min_child_weight': 1, 'objective': 'binary:logistic', 
     'foo': 1, 'max_depth': 3, 'gamma': 0}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45950630

复制
相关文章
【Kotlin】扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )
如果定义的 扩展函数 需要在 多个 Kotlin 代码文件 中使用 , 则需要在 单独的 Kotlin 文件 中定义 , 该文件被称为 扩展文件 ;
韩曙亮
2023/03/30
1.3K0
【Kotlin】扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )
【Kotlin】扩展函数总结 ★ ( 超类扩展函数 | 私有扩展函数 | 泛型扩展函数 | 扩展属性 | 定义扩展文件 | infix 关键字用法 | 重命名扩展函数 | 标准库扩展函数 )
为 现有类 定义 扩展函数 , 可以在 不修改 原有类 的情况下 增加类的功能 ;
韩曙亮
2023/03/30
2.9K0
【Kotlin】扩展函数总结 ★ ( 超类扩展函数 | 私有扩展函数 | 泛型扩展函数 | 扩展属性 | 定义扩展文件 | infix 关键字用法 | 重命名扩展函数 | 标准库扩展函数 )
soapclient php 扩展,PHP扩展—SOAP[通俗易懂]
SOAP扩展可以用于编写SOAP服务器和客户端,支持 SOAP 1.1, SOAP 1.2 和 WSDL 1.1 规格的子集。
全栈程序员站长
2022/11/16
2K0
【Groovy】Groovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
在上一篇博客 【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 ) 中 , 分析 Thread 的扩展方法 start 方法 , 该方法调用如下 ,
韩曙亮
2023/03/30
1K0
【Groovy】Groovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
什么是横向扩展和纵向扩展?
现代应用程序不断变化,随着新要求的发展而发展,并且存在于对资源的不同需求的环境中。扩展应用程序可以根据资源需求适当调整其大小,以确保客户满意并降低基础设施成本。
后场技术
2022/04/15
4.9K0
什么是横向扩展和纵向扩展?
python扩展
补充一些有趣的知识 1. sys模块方法的补充,打印进度条 import sys,time for i in range(20): sys.stdout.write("#") sys.stdout.flush() time.sleep(0.1)  2. 实现简单的shell sed替换功能 import sys res = sys.argv print(res) #命令行参数,在Terminal输入命令:python update_flie.py ,res接收到的结果为list
py3study
2020/01/16
9170
python扩展
扩展欧几里得
基本算法:设a=qb+r。当中a,b。q,r都是整数。则gcd(a,b)=gcd(b,r)。即gcd(a,b)=gcd(b,a%b)。
全栈程序员站长
2022/07/08
5020
DOM扩展
尽管DOM作为API已经非常完善了,但是为了实现更多的功能,仍然会有一些标准或专有的扩展。对DOM的两个主要扩展是Selectors API(选择符API)和HTML5。
奋飛
2019/08/15
1.5K0
Firefox 扩展开发 扩展学习 工具
要开发Firefox扩展当然需要一些工具和教程,这里根据笔者的所得,略略写一下: 教程:   教程嘛,网上基本没有什么中文资料,最多也就一个简单,非常简单的入门说明。所以教程还是以官网的为主:https://developer.mozilla.org/En 工具:   官网的教程中,会提到一些工具。   1.Firefox 3.0,这个肯定必不可少了。在此推荐3.0,因为最新版3.6或者3.7,那些扩展还没有更新跟进,所以要想安装更多的扩展,还是以3.0为好。   2.Firebug,这个不必多说。虽然我只
用户1258909
2018/07/03
7310
admin扩展
需要使用 django.contrib import admin 编写模型管理类,需要继承admin.ModelAdmin
爱喝水的木子
2022/01/12
5660
js扩展
扩展 定义对象 var zj = zj || {}; 字符串转json对象 /** * 字符串转json对象 */ zj.toJson = function(result) { if (typeof result == "string") { return eval("(" + result + ")"); } else { return result; } } 格式化字符串 /** * @author 张剑 使用方法:zj.formatStri
码客说
2019/10/22
1.2K0
【Kotlin】扩展函数作用域分析 ( 扩展函数导入 | 扩展函数重载 | 扩展函数作用域优先级 )
① 扩展函数作用域 : 扩展函数使用需要导入包 , 如果在本包中使用 , 可以默认不导入包 ;
韩曙亮
2023/03/27
8620
【Kotlin】扩展函数作用域分析 ( 扩展函数导入 | 扩展函数重载 | 扩展函数作用域优先级 )
WebService扩展
SOAP、WSDL、XML Schema 已经可以完成点到点的调用,但点到点的调用不能完全发挥面向服务的特点
hotarugali
2022/02/28
6700
WebService扩展
Prometheus:扩展
2、Prometheus配置集群 ?????? 3、可配置远程存储 ????
用户5760343
2020/01/15
7420
扩展 Sketch
我们努力使Sketch成为梦想中的“设计师工具箱”。但是每个人都有不同的需求,也许你需要一个我们还没有实现的功能。不要担心:插件已经可以满足您的需求,或者您可以轻松创建一个插件。 如果您有兴趣扩展Sketch,那么您就位于正确的位置。在这里,我们展示Sketch可扩展性文档的概要以及如何快速构建您的第一个Sketch插件。 如果您只想使用现有的插件,请参阅插件目录。 你可以用插件做什么? Sketch中的插件可以做任何用户可以做的事情(甚至更多!)。例如: 根据复杂的规则选择文档中的图层 操作图层属性 创建
iOSDevLog
2018/05/17
1.4K0
MySQL扩展
mysql中变量不用事前申明,在用的时候直接用“@变量名”。 第一种用法:set @num=1; 或set @num:=1; 第二种用法:select @num:=1; 也可以把字段的值赋值给变量 select @num:=字段名 from 表名 where …… 注意上面两种赋值符号,使用set时可以用 = 或 := ,但是使用select时必须用 :=
化羽羽
2022/10/28
2K0
【php 扩展开发】扩展生成器
每个php扩展都包含一些非常公共的并且非常单调的结构和文件,这些文件对所有扩展来说都是通用的。当开始一个新扩展开发的时候,如果这些公共的结构已经存在,而不需要费力去复制每个文件的内容, 我们只需考虑填充功能代码那心情一定会愉快很多。
猿哥
2019/03/13
7490
手动添加扩展,修改 composer 配置引入扩展
Composer 是 PHP 的一个依赖管理工具。我们可以在项目中声明所依赖的外部工具库,Composer 会帮你安装这些依赖的库文件,有了它,我们就可以很轻松的使用一个命令将其他人的优秀代码引用到我们的项目中来。
OwenZhang
2022/05/30
1.5K0
手动添加扩展,修改 composer 配置引入扩展
Safari扩展
本系列文章分两部分,介绍macOS浏览器扩展背后的技术,以及恶意插件如何窃取密码、银行细节和其他敏感用户数据。
安恒网络空间安全讲武堂
2019/09/29
1.7K0
扩展方法
扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 扩展方法当然不能破坏面向对象封装的概念,所以只能是访问所扩展类的public成员。
wfaceboss
2019/04/08
6610

相似问题

xgboost.XGBClassifier中可用的目标函数有哪些不同的选项?

20

如何在xgboost.XGBClassifier中同时使用自定义eval_metric和内置指标

1188

扩展Datarow扩展方法

20

DataServiceQuery扩展相关扩展

10

扩展扩展类型

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档