Termasuk Scaling dan PCA sebagai parameter GridSearchCV
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
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
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]
}