sklearn:如何在 GridSearchCV 中拟合和转换特征选择器



我正在我的数据集上试验特征选择,我注意到我得到的结果不同:a( 将特征选择放在包装在 GridSearchCV 对象的管道中并调用"fit",以及 b( 在特征选择器上调用fit_transform,然后在分类器上应用 GridSearhCV,从特征选择器中获取fit_transformed特征矩阵。是因为"适合"和"fit_transform"之间的区别吗?不确定我是否说清楚,但这是网格搜索的代码:

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 之外执行功能选择的代码:

select = SelectFromModel(LogisticRegression(class_weight='balanced',penalty="l1",C=0.01))
X_ = select.fit_transform(X_train,y_train) #line A
classifier = svm.LinearSVC()
piped_classifier = GridSearchCV(classifier, param_grid=params, cv=10,
n_jobs=-1)
piped_classifier.fit(X_, y_train)
nfold_predictions=cross_val_predict(piped_classifier.best_estimator_, X_, 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

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

P=0.31  R=0.17  F1=0.22

而对于第二个,分数更好:

P=0.41  R=0.28  F=0.33

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

任何建议都非常感谢。

通常,由于数据泄漏,您应该期望不同的结果

在第二个代码段中,网格搜索在一片X_train上训练 svc,但是,特征选择在所有X_train上训练

在第一个示例中,您可以避免此问题。

这会大大降低泛化性能。但是,目前还不清楚您如何获得有关P,R和F的信息。它们来自测试集吗?

但是,我不确定这是否可以解释指标差异的大小。至少您的代码显示了使用数据泄漏时的典型过度拟合,并且在对功能选择进行流水线处理时性能会下降。

您可能还想查看有关嵌套交叉验证的scikit-learn文档

让我补充一个重要的评论:在第二种方法中,您将修复一开始传递给 svc 的功能。因此,svc 将在每个折叠上使用相同的功能。而在第一个示例中,传递给网格搜索的特征可能会从一个折叠到另一个折叠!

最新更新