使用管道和 GridSearchCV 的多维降维技术

Posted

技术标签:

【中文标题】使用管道和 GridSearchCV 的多维降维技术【英文标题】:Multiple dimensionality reduction techniques with pipeline and GridSearchCV 【发布时间】:2020-09-24 16:23:15 【问题描述】:

我们都知道使用降维技术定义管道的常用方法,然后是用于训练和测试的模型。然后我们可以应用 GridSearchCv 进行超参数调优。

grid = GridSearchCV(
Pipeline([
    ('reduce_dim', PCA()),
    ('classify', RandomForestClassifier(n_jobs = -1))
    ]),
param_grid=[
    
        'reduce_dim__n_components': range(0.7,0.9,0.1),
        'classify__n_estimators': range(10,50,5),
        'classify__max_features': ['auto', 0.2],
        'classify__min_samples_leaf': [40,50,60],
        'classify__criterion': ['gini', 'entropy']
    
],
cv=5, scoring='f1')
grid.fit(X,y)

上面的代码我能看懂。

今天我正在浏览documentation,在那里我发现了一个有点奇怪的部分代码。

pipe = Pipeline([
    # the reduce_dim stage is populated by the param_grid
    ('reduce_dim', 'passthrough'),                        # How does this work??
    ('classify', LinearSVC(dual=False, max_iter=10000))
])

N_FEATURES_OPTIONS = [2, 4, 8]
C_OPTIONS = [1, 10, 100, 1000]
param_grid = [
    
        'reduce_dim': [PCA(iterated_power=7), NMF()],
        'reduce_dim__n_components': N_FEATURES_OPTIONS,   ### No PCA is used..??
        'classify__C': C_OPTIONS
    ,
    
        'reduce_dim': [SelectKBest(chi2)],
        'reduce_dim__k': N_FEATURES_OPTIONS,
        'classify__C': C_OPTIONS
    ,
]
reducer_labels = ['PCA', 'NMF', 'KBest(chi2)']

grid = GridSearchCV(pipe, n_jobs=1, param_grid=param_grid)
X, y = load_digits(return_X_y=True)
grid.fit(X, y)

    首先在定义管道时,它使用字符串“passthrough”而不是对象。

        ('reduce_dim', 'passthrough'),  ```
    
    然后,在为网格搜索定义不同的降维技术时,它使用了不同的策略。 [PCA(iterated_power=7), NMF()] 这个是如何工作的?
            'reduce_dim': [PCA(iterated_power=7), NMF()],
            'reduce_dim__n_components': N_FEATURES_OPTIONS,  # here 
    

请有人向我解释一下代码。

已解决 - 在一行中,订单为['PCA', 'NMF', 'KBest(chi2)']

感谢 - seralouk(请参阅下面的答案)

参考如果有人寻找更多详细信息 123

【问题讨论】:

【参考方案1】:

据我所知是等价的。


在文档中你有这个:

pipe = Pipeline([
    # the reduce_dim stage is populated by the param_grid
    ('reduce_dim', 'passthrough'),
    ('classify', LinearSVC(dual=False, max_iter=10000))
])

N_FEATURES_OPTIONS = [2, 4, 8]
C_OPTIONS = [1, 10, 100, 1000]
param_grid = [
    
        'reduce_dim': [PCA(iterated_power=7), NMF()],
        'reduce_dim__n_components': N_FEATURES_OPTIONS,
        'classify__C': C_OPTIONS
    ,
    
        'reduce_dim': [SelectKBest(chi2)],
        'reduce_dim__k': N_FEATURES_OPTIONS,
        'classify__C': C_OPTIONS
    ,
]

最初我们有('reduce_dim', 'passthrough'),,然后是'reduce_dim': [PCA(iterated_power=7), NMF()]

PCA 的定义在第二行完成。


您可以另外定义:

pipe = Pipeline([
    # the reduce_dim stage is populated by the param_grid
    ('reduce_dim', PCA(iterated_power=7)),
    ('classify', LinearSVC(dual=False, max_iter=10000))
])

N_FEATURES_OPTIONS = [2, 4, 8]
C_OPTIONS = [1, 10, 100, 1000]
param_grid = [
    
        'reduce_dim__n_components': N_FEATURES_OPTIONS,
        'classify__C': C_OPTIONS
    ,
    
        'reduce_dim': [SelectKBest(chi2)],
        'reduce_dim__k': N_FEATURES_OPTIONS,
        'classify__C': C_OPTIONS
    ,
]

【讨论】:

所以,稍后它会分配一个对象来代替 passthrough。但是'reduce_dim': [PCA(iterated_power=7), NMF()] 这是如何工作的?网格搜索是否会一一尝试? 两者都用!缩小尺寸 所以它会首先将 PCA 然后 NMF 应用于数据集。然后它将检查 SelectKBest(chi2) 。哪个得分更高,它会选择那个..对吗? 没错。订单是['PCA', 'NMF', 'KBest(chi2)']

以上是关于使用管道和 GridSearchCV 的多维降维技术的主要内容,如果未能解决你的问题,请参考以下文章

管道和 GridSearchCV 的问题

sklearn - 如何从传递给 GridSearchCV 的管道中检索 PCA 组件和解释方差

在 Scikit Learn 中使用网格搜索 (GridSearchCV) 和管道的支持向量回归 (SVR) 中的系数

GridSearchCV 和 ValueError:估计器管道的参数 alpha 无效

如何使用 GridSearchCV 在嵌套管道中测试预处理组合?

如何使用 GridSearchCV 比较多个模型以及 python 中的管道和超参数调整