如何在GridSearchCV中调整和转换特征选择器

2024-05-16 23:58:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在我的数据集上试验特征选择,我注意到我得到了不同的结果:a)将特征选择放入包装在GridSearchCV对象中的管道中并调用“fit”;b)在特征选择器上调用fit_变换,然后在分类器上应用GridSearhCV,从特征选择器获取fit_变换后的特征矩阵。是因为“拟合”和“拟合变换”之间的区别吗?不确定我是否说得很清楚,但下面是gridsearch的代码:

fs=SelectFromModel(LogisticRegression(class_weight='balanced',penalty="l1",C=0.01))
fs_params = {} #deliberately leaving these empty for comparison
classifier = svm.LinearSVC()
cl_params = {} #deliberately leaving these empty for comparison
pipe = []
params=[]
pipe.append(('fs', fs))
params.append(fs_params)    
pipe.append(('classify', classifier))
params.append(cl_params)
pipeline=Pipeline(pipe)
piped_classifier = GridSearchCV(pipeline, param_grid=params, cv=10,
                              n_jobs=-1)
piped_classifier.fit(X_train, y_train)

nfold_predictions=cross_val_predict(piped_classifier.best_estimator_, X_train, y_train, cv=10)

best_estimator = piped_classifier.best_estimator_
best_param = piped_classifier.best_params_    
cv_score = piped_classifier.best_score_ 
#followed by code to print scores

以及在GridSearchCV之外进行功能选择的代码:

^{pr2}$

对于第一个代码,我得到的分数是:

P=0.31  R=0.17  F1=0.22

而对于第二种情况,分数更好:

P=0.41  R=0.28  F=0.33

我能想到的唯一可能导致这个问题的是第二个代码片段中的A行,它调用fit_transform。除此之外,我认为这两个代码片段应该执行相同的任务。在

非常感谢您的任何建议。在


Tags: 代码选择器train特征paramsfscvpiped
1条回答
网友
1楼 · 发布于 2024-05-16 23:58:44

一般来说,由于data leakage的原因,您可能会得到不同的结果

在您的第二个片段中,gridsearch在X_train的一个片段上训练svc,但是特性选择训练在X_train的所有部分上

在第一个例子中,您避免了这个问题。在

这会严重降低泛化性能。然而,目前还不清楚你是如何得到P,R和F的信息的。它们是否来自测试集?在

然而,我不确定这是否能解释这些指标之间的差异。至少您的代码在使用数据泄漏时显示了典型的过度拟合,并且在对特性选择进行管道化时性能会下降。在

您可能还想看看scikit-learn documentation on nested cross-validation

让我补充一句重要的话:在第二种方法中,您将修复在开始时传递给svc的特性。因此,svc将在每个折叠上使用相同的功能。而在第一个例子中,传递给网格搜索的特性可能会随着折叠而变化!在

相关问题 更多 >