具有柱式变压器和管道的 ML 模型的参数调整

Posted

技术标签:

【中文标题】具有柱式变压器和管道的 ML 模型的参数调整【英文标题】:Parameter Tuning for ML model with column transformer and pipeline 【发布时间】:2021-02-20 08:30:27 【问题描述】:

我的代码在最终模型拟合之前运行良好。但我不知道如何为管道执行 GridSearchCV 或 RandomizedSearchCV。请帮助我。

import pandas as pd
import numpy as np
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import make_pipeline


df = pd.read_csv('data/vehicle_dataset_v4A.csv')

X = df.drop('price', axis=1)
y = df['price']

numerical_ix = X.select_dtypes(include=['int64', 'float64']).columns
categorical_ix = X.select_dtypes(include=['object', 'bool']).columns

col_transform = make_column_transformer(
    (OneHotEncoder(), categorical_ix), 
    (StandardScaler(), numerical_ix),
    remainder='passthrough'
)

model = RandomForestRegressor()

pipe = make_pipeline(col_transform,model)

pipe.fit(X, y)

我尝试了以下代码。代码运行没有任何错误,但是当我尝试使用 Gridsearchcv 进行预测时,它会在不同的时间引发不同的错误。希望应该有一个解决方案。否则,如果我能知道网格搜索后的最佳参数是什么,我可以直接将这些参数应用到模型中。

lr = 
    'base_score':[0.4,0.45,0.5,0.55,0.6],
    'max_depth':[1,2,3,4,6,8,10],
    'subsample':[0.5,0.6,0.7,0.8,0.9,1],
    'n_estimators': [50,100,200,250,300],
    'learning_rate':  [0.05,0.1,0.4,0.5,0.8,0.9,1],
    'min_child_weight': [0.1,0.5,1,1.5,2,3],
    'gamma': [0,0.1,0.5,1,1.5,2,2.5,3]
    

clf = make_pipeline(OneHotEncoder(),
                    StandardScaler(with_mean=False),
                    GridSearchCV(RandomForestRegressor(),
                                 param_grid=lr,
                                 scoring='r2',cv=3,verbose=2))

【问题讨论】:

这是您要查找的best_estimator_ 属性吗? scikit-learn.org/stable/modules/generated/… 属性不起作用,因为 Gridsearch 是使用管道构建的。这就是我需要帮助的地方。我想知道如何在使用 gridsearch 搜索后知道最佳参数。或者,如果完成网格搜索的方式是错误的,我想知道我是否在这里做错了什么,并了解应该如何做。请帮忙 【参考方案1】:

关于您的应用程序的三个想法:

    不要将OneHotEncoder 用于RandomForestRegressor,你不需要它。 不要使用make_pipeline,这对您的问题来说太过分了。 首先对数据应用StandardScaler,然后运行GridSearchCV

请对此进行测试并给我们反馈。

【讨论】:

感谢您的回复。准确率和 r2 分数急剧下降。之前的 r2 分数是 86%,之后下降到 63%。但是,如果我们使用 XGBoost 之类的其他东西,而不是 RandomForestRegressor,我们仍然必须通过 OneHotEncoder 和 StandardScaler。你能建议另一种方法来解决这个问题吗?。 如果您不使用StandardScaler 并在没有网格搜索的情况下立即应用RandomForestRegressor,您的结果是什么? 不使用标准缩放器,我能够获得 76% 的 r2 分数,低于使用标准缩放器和 OneHotEncoder 的 86%。

以上是关于具有柱式变压器和管道的 ML 模型的参数调整的主要内容,如果未能解决你的问题,请参考以下文章

福州大学陈庆彬等:结合变压器 T 网络模型的具有可变恒压增益特性的补偿网络参数确定新方法

在 pyspark.ml 中运行多个功能的变压器

scikit-learn 管道:对变压器参数进行网格搜索以生成数据

Sklearn Pipeline:将参数传递给自定义变压器?

皮斯帕克。生成随机数的变压器总是生成相同的数字

在 Pipeline 上进行网格搜索后更新变压器参数