Termasuk Scaling dan PCA sebagai parameter GridSearchCV

Oct 02 2020

Saya ingin menjalankan regresi logistik menggunakan GridSearchCV, tetapi saya ingin membandingkan kinerja saat Scaling dan PCA digunakan, jadi saya tidak ingin menggunakannya di semua kasus.

Saya pada dasarnya ingin memasukkan PCA dan Scaling sebagai "parameter" dari file GridSearchCV

Saya sadar saya bisa membuat pipeline seperti ini:

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

Masalahnya, dalam hal ini, penskalaan akan diterapkan di semua lipatan, bukan? Apakah ada cara untuk membuatnya agar "dimasukkan" dalam pencarian kisi?

EDIT:

Saya baru saja membaca jawaban ini dan meskipun mirip dengan yang saya inginkan, sebenarnya tidak demikian, karena dalam hal ini Scaler akan diterapkan ke estimator terbaik dari GridSearch.

Yang ingin saya lakukan adalah, misalnya

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

Saya ingin menjalankan regresi dengan Scaler + newton-cg, No Scaler + newton-cg, Scaler + lbfgs, No Scaler + lbfgs.

Jawaban

4 jhihan Oct 02 2020 at 00:13

Anda dapat mengatur parameter with_meandan with_stddari StandardScaler()sebagai False untuk mewakili tidak ada standerdization. Di GirdSearchCV, parameter para_griddapat diatur sebagai

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

Kemudian dikt pertama dalam daftar adalah "Tanpa Scaler + mnl" dan yang kedua adalah "Scaler + mnl"

Ref:

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

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

Sunting: Saya pikir ini rumit jika Anda juga mempertimbangkan untuk menghidupkan / mematikan PCA ... Mungkin Anda perlu menentukan PCA khusus yang mendapatkan PCA asli. Dan kemudian tentukan argumen boolean tambahan yang menentukan apakah PCA harus dijalankan atau tidak ...

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

Dari dokumentasi untuk Pipeline:

Estimator langkah dapat diganti seluruhnya dengan mengatur parameter dengan namanya menjadi estimator lain, atau trafo dilepas dengan mengaturnya ke 'passthrough' atau None.

Sebagai contoh:

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