Python 估计器基类包装模型及预处理流水线

Python 估计器基类包装模型及预处理流水线,python,scikit-learn,pipeline,Python,Scikit Learn,Pipeline,我正试图找出如何轻松地包装现有的估计器以及预处理管道和目标编码器,基本上概括了scikit的TransformedTargetRegressor背后的思想。我有一个可能的解决方案,但我想知道我是否忽略了设计的任何影响,而这些影响不是很明显的。其基本思想是: 类基本模型: 型号=无 def uuu init uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 步骤=[(“特征”,特征编码器)]如果特征编码

我正试图找出如何轻松地包装现有的估计器以及预处理管道和目标编码器,基本上概括了scikit的
TransformedTargetRegressor
背后的思想。我有一个可能的解决方案,但我想知道我是否忽略了设计的任何影响,而这些影响不是很明显的。其基本思想是:

类基本模型:
型号=无
def uuu init uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
步骤=[(“特征”,特征编码器)]如果特征编码器不是[]
步骤.append((“model”,self.model(**params)))
self.pipe=管道(步骤=步骤)
self.target\u编码器=target\u编码器
def get_参数(self,deep=True):
“”“Argument`deep`本质上区别于结果参数dict的使用。
-在GridSearch等中使用'deep=True',以了解可以使用'set_params'设置哪些参数。
-clone()使用'deep=False',其中生成的键必须对应于_init__; args。
"""
如果深入:
返回self.pipe_u.get_参数(deep=deep)
参数={
“feature_编码器”:self.pipe_u.named_步骤[“features”],
“目标编码器”:self.target\u编码器,
}
params.update(self.pipe_u.named_steps[“model”].get_params())
返回参数
def设置参数(自身,**kwargs):
自管道设置参数(**kwargs)
回归自我
def准备_配合(自身、X、y=无):
“”“对目标进行编码,根据数据动态确定模型参数等。”“”
...
def配合(自身、X、y=无):
y=自配(X,y)
自管接头(X,y)
...
回归自我
def预测(自我,X):
“”“预测和解码(逆变换)目标”“”
yp=自管道预测(X)
...
因此,包装CatBoost(例如)将非常简单

类别CatboostClassifier(基本模型):
型号=catboost.catboost分类器
关键的部分是获得正确的
get_params
set_params
,这样包装好的模型可以很好地使用scikit的网格搜索等,即使设计没有遵循让模型属性匹配其
\u init\u
参数的官方指导原则

从获取和设置任何模型或预处理管道参数的意义上讲,它似乎是可行的,克隆也是可行的:

model=CatboostClassifier(详细=50,迭代次数=100,特征编码=…,目标编码=…)
参数={
“模型迭代”:95,
“功能\uuuu日期时间\uuuu编码\uuuuu组件”:[“年”、“月”],
}
打印(“Params before:”,{k:v代表k,v在model.get_Params().items()如果k在Params})
克隆=克隆(克隆(模型)。设置参数(**参数))
打印(“参数后:”,{k:v代表k,v在克隆中。get_Params().items(),如果k在Params})
>前面的参数:{'features\uuuuu datetime\uuuu encode\uuuu components':['year'],'model\uuuuu iterations':100}
>>以下参数:{'features_uudatetime_uencode_ucomponents':['year','month','model_uiterations':95}
而且
GridSearchCV
似乎也能起作用:

params={
“模型迭代”:[100200],
“模型学习率”:[0.2,0.3],
}
搜索=网格搜索cv(模型,参数网格=参数,cv=5)
search.fit(X,y)
打印(搜索最佳参数)
打印(search.best_estimator.get_params()[“model__迭代”])
>>{'model\u iterations':100,'model\u learning\u rate':0.2}
>> 100
所以。。。我的问题是,这种设计是否还有其他可能出错的方式,例如,任何未决的弃用或计划的更改可能会破坏
get_-params
set_-params
的使用,例如。?据我所见,拥有这样一个任意构造函数所需的唯一技巧(违反了官方的开发人员准则)是
get_-params(deep=True)
应该返回所有可设置的参数,而
get_-params(deep=False)
base.clone()使用
仅限,需要返回调用构造函数并制作(正确)副本所需的所有参数

我知道这是一个相当长的“问题”,但我很高兴知道关于建议模式的任何注意事项