Compreso Scaling e PCA come parametro di GridSearchCV

Oct 02 2020

Voglio eseguire una regressione logistica utilizzando GridSearchCV, ma desidero confrontare le prestazioni quando vengono utilizzati Scaling e PCA, quindi non voglio utilizzarlo in tutti i casi.

Fondamentalmente vorrei includere PCA e Scaling come "parametri" di GridSearchCV

Sono consapevole di poter creare una pipeline come questa:

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]}

Il fatto è che, in questo caso, il ridimensionamento verrebbe applicato in tutte le pieghe, giusto? C'è un modo per farlo in modo che sia "incluso" nel gridsearch?

MODIFICARE:

Ho appena letto questa risposta e anche se è simile a quello che voglio, in realtà non lo è, perché in quel caso lo Scaler verrà applicato al miglior estimatore di GridSearch.

Quello che voglio fare è, ad esempio, diciamo

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

Voglio eseguire la regressione con Scaler + newton-cg, No Scaler + newton-cg, Scaler + lbfgs, No Scaler + lbfgs.

Risposte

4 jhihan Oct 02 2020 at 00:13

È possibile impostare i parametri with_meane with_stddi StandardScaler()come False per rappresentare non standerdization. In GirdSearchCV, il parametro para_gridpuò essere impostato come

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]}
]

Quindi il primo dict nell'elenco è "No Scaler + mnl" e il secondo è "Scaler + mnl"

Rif:

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

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

Modifica: Penso che sia complicato se si considera anche l'attivazione / disattivazione della PCA ... Forse è necessario definire un PCA personalizzato che derivi il PCA originale. E quindi definire un argomento booleano aggiuntivo che determina se il PCA deve essere eseguito o meno ...

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
1 BenReiniger Oct 02 2020 at 09:08

Dalla documentazione per Pipeline:

Lo stimatore di un gradino può essere sostituito interamente impostando il parametro con il suo nome su un altro stimatore, o un trasformatore rimosso impostandolo su "passthrough" o None.

Per esempio:

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]
}