自定义继承LGBMClassifier的类运行报错:KeyError: 'random_state'
问题原因
你的自定义子类触发KeyError: 'random_state'的核心原因是sklearn的BaseEstimator(LGBMClassifier的父类之一)的get_params()方法依赖于类的__init__参数列表。
你定义的MyClf类的__init__仅接受**kwargs,而sklearn的_get_param_names()方法会自动排除可变关键字参数(**kwargs),导致get_params()返回空字典。LightGBM的fit方法需要从self.params(由get_params()生成)中读取random_state参数,因此触发键不存在的错误。
解决方案
根据你的需求,有两种简单的修复方式:
方案1:删除不必要的__init__方法
如果你的子类__init__没有自定义逻辑,只是调用父类的初始化,完全可以删除该方法,直接继承父类的__init__:
class MyClf(LGBMClassifier): def fit(self, X, y=None): return super().fit(X, y=y) def predict(self, X): return super().predict(X) def predict_proba(self, X): return super().predict_proba(X)
方案2:重写_get_param_names()(需保留__init__时使用)
如果必须保留自定义__init__,则重写_get_param_names()方法,让它返回父类的参数列表,确保get_params()能正确获取所有参数:
class MyClf(LGBMClassifier): def __init__(self, **kwargs): super().__init__(**kwargs) @classmethod def _get_param_names(cls): return super()._get_param_names() def fit(self, X, y=None): return super().fit(X, y=y) def predict(self, X): return super().predict(X) def predict_proba(self, X): return super().predict_proba(X)
验证
修改后的代码运行时,self.params会包含LGBMClassifier的所有默认参数(包括random_state=None),fit、predict、predict_proba方法均可正常执行。
内容的提问来源于stack exchange,提问作者emremrah
相关产品推荐
相关产品推荐

