如何在TransformedTargetRegressor中引用参数?结合GridSearchCV用Sklearn新特性
如何在TransformedTargetRegressor内部引用参数?
嘿,刚好熟悉这个Sklearn的新特性!sklearn.compose.TransformedTargetRegressor的核心是包装了一个回归器和一个目标转换器,要访问它内部的参数,得遵循Sklearn统一的嵌套参数命名规则——用双下划线__来逐层穿透嵌套对象的层级。
核心命名规则
- 访问内部回归器的参数:以
regressor__作为前缀,后面接回归器自身的参数名(如果回归器是Pipeline,还要继续用__深入Pipeline的步骤参数) - 访问目标转换器的参数:以
transformer__作为前缀,后面接转换器的参数名
基础示例:包装单一回归器
假设你用TransformedTargetRegressor直接包装了决策树回归器和标准化转换器,参数引用方式如下:
from sklearn.compose import TransformedTargetRegressor from sklearn.tree import DecisionTreeRegressor from sklearn.preprocessing import StandardScaler from sklearn.model_selection import GridSearchCV # 初始化TransformedTargetRegressor ttr = TransformedTargetRegressor( regressor=DecisionTreeRegressor(random_state=42), transformer=StandardScaler() ) # 构建网格搜索参数网格 param_grid = { # 访问内部决策树的max_depth参数 'regressor__max_depth': [5, 15, 45, 135], # 固定决策树的random_state 'regressor__random_state': [42], # 访问目标转换器的with_mean参数 'transformer__with_mean': [True, False] } # 结合GridSearchCV调优 grid_search = GridSearchCV(ttr, param_grid, cv=5) grid_search.fit(X, y)
进阶示例:结合Pipeline作为内部回归器
如果你的回归逻辑是包含预处理、特征编码的完整Pipeline(就像你给出的片段那样),只需在参数名前多套一层regressor__前缀,再按Pipeline的步骤逐层深入:
from sklearn.pipeline import Pipeline from sklearn.preprocessing import FunctionTransformer # 定义你的预处理+回归Pipeline my_pipeline = Pipeline([ ('preprocessing', FunctionTransformer(my_preprocessing_function)), ('feature_encoder', YourFeatureEncoder()), # 替换为你实际的特征编码器 ('DecisionTreeRegr', DecisionTreeRegressor(random_state=42)) ]) # 用TransformedTargetRegressor包装这个Pipeline ttr = TransformedTargetRegressor( regressor=my_pipeline, transformer=StandardScaler() # 可选的目标转换器 ) # 对应的参数网格写法 param_grid = { # 访问Pipeline中feature_encoder的handle_unknown参数 'regressor__feature_encoder__handle_unknown': ['ignore'], # 访问Pipeline中DecisionTreeRegr的max_depth参数 'regressor__DecisionTreeRegr__max_depth': [5, 15, 45, 135], # 固定决策树的random_state 'regressor__DecisionTreeRegr__random_state': [42], # 访问预处理步骤的validate参数 'regressor__preprocessing__validate': [False] } # 执行网格搜索 grid_search = GridSearchCV(ttr, param_grid, cv=5) grid_search.fit(X, y)
关键提醒
这个双下划线的命名规则是Sklearn通用的,不管是嵌套Pipeline、还是TransformedTargetRegressor这类包装器,都可以用外层对象名__内层对象名__参数名的方式逐层访问内部参数。只要理清了对象的嵌套结构,参数命名就不会出错~
内容的提问来源于stack exchange,提问作者user267817
相关产品推荐
相关产品推荐

