包括 Scaling 和 PCA 作为 GridSearchCV 的参数

Posted

技术标签:

【中文标题】包括 Scaling 和 PCA 作为 GridSearchCV 的参数【英文标题】:Including Scaling and PCA as parameter of GridSearchCV 【发布时间】:2021-01-17 09:46:52 【问题描述】:

我想使用GridSearchCV 运行逻辑回归,但我想对比使用 Scaling 和 PCA 时的性能,所以我不想在所有情况下都使用它。

我基本上想将 PCA 和 Scaling 包括为 GridSearchCV 的“参数”

我知道我可以制作这样的管道:

mnl = LogisticRegression(fit_intercept=True, multi_class="multinomial")

pipe = Pipeline([
    ('scale', StandardScaler()),
    ('mnl', mnl)])

params_mnl = 'mnl__solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
              'mnl__max_iter':[500,1000,2000,3000]

问题是,在这种情况下,缩放将应用于所有折叠,对吧? 有没有办法让它“包含”在网格搜索中?

编辑:

我刚刚阅读了this answer,尽管它与我想要的相似,但实际上并非如此,因为在这种情况下,Scaler 将应用于 GridSearch 中的最佳估计器。

我想做的是,例如,让我们说

params_mnl = 'mnl__solver': ['newton-cg', 'lbfgs']

我想使用 Scaler+newton-cg、No Scaler+newton-cg、Scaler+lbfgs、No Scaler+lbfgs 运行回归。

【问题讨论】:

另见***.com/q/19262621/10495893 【参考方案1】:

可以将StandardScaler()的参数with_meanwith_std设置为False,表示没有标准化。在GirdSearchCV中,参数para_grid可以设置为

param_grid = ['scale__with_mean': [False],
               'scale__with_std': [False],
               'mnl__solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
               'mnl__max_iter':[500,1000,2000,3000]
              ,
              'mnl__solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
              'mnl__max_iter':[500,1000,2000,3000]
]

那么列表中的第一个dict是“No Scaler+mnl”,第二个是“Scaler+mnl”

参考:

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html

https://scikit-learn.org/stable/tutorial/statistical_inference/putting_together.html

编辑: 如果您还考虑打开/关闭 PCA,我认为这很复杂......也许您需要定义一个派生原始 PCA 的自定义 PCA。然后定义额外的布尔参数来确定是否应该执行 PCA...

class MYPCA(PCA):
    def __init__(self, PCA_turn_on, *args):
        super().__init__(*args)
        self.PCA_turn_on = PCA_turn_on
    
    def fit(X, y=None):
        if (PCA_turn_on == True):
            return super().fit(X, y=None)
        else:
            pass

    # same for other methods defined in PCA

【讨论】:

看起来不错!谢谢!您对 PCA 有任何想法吗?我在其中找不到任何可以设置为 False 或任何参数的参数 实际上,我意识到它比这更复杂一些。要使用 PCA,我需要对数据进行缩放,所以我需要 PCA 的案例也必须使用 Scaling 我也认为这很复杂......也许您需要定义一个派生原始 PCA 的自定义 PCA。然后定义额外的布尔参数来确定是否应该执行 PCA... 尝试尽我所能...甚至尝试this 回答但并没有完全做到...不幸的是我没有太多时间弄清楚,所以我会做两个网格搜索,一个有pca,一个没有,然后得到两者之间的最佳模型【参考方案2】:

来自the documentation 为Pipeline

可以通过将参数及其名称设置为另一个估算器来完全替换步骤的估算器,或者通过将其设置为“passthrough”或None来删除转换器。

例如:

pipe = Pipeline([
    ('scale', StandardScaler()),
    ('mnl', mnl),
])

params = 
    'scale': ['passthrough', StandardScaler()],
    'mnl__solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
    'mnl__max_iter': [500, 1000, 2000, 3000],

【讨论】:

以上是关于包括 Scaling 和 PCA 作为 GridSearchCV 的参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 绘制 PCA 结果,包括带有散点图的原始数据

Grids for mac(Instagram客户端工具)v8.5.5免注册版

线性回归与特征归一化(feature scaling)

如何使用稳健的 PCA 输出作为传统 PCA 的主成分(特征)向量

lbp和pca用啥软件

Auto Scaling 生命周期