我正在我的数据集上试验特征选择,我注意到我得到了不同的结果: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。除此之外,我认为这两个代码片段应该执行相同的任务。在
非常感谢您的任何建议。在
一般来说,由于data leakage的原因,您可能会得到不同的结果
在您的第二个片段中,gridsearch在
X_train
的一个片段上训练svc,但是特性选择训练在X_train
的所有部分上在第一个例子中,您避免了这个问题。在
这会严重降低泛化性能。然而,目前还不清楚你是如何得到P,R和F的信息的。它们是否来自测试集?在
然而,我不确定这是否能解释这些指标之间的差异。至少您的代码在使用数据泄漏时显示了典型的过度拟合,并且在对特性选择进行管道化时性能会下降。在
您可能还想看看scikit-learn documentation on nested cross-validation
让我补充一句重要的话:在第二种方法中,您将修复在开始时传递给svc的特性。因此,svc将在每个折叠上使用相同的功能。而在第一个例子中,传递给网格搜索的特性可能会随着折叠而变化!在
相关问题 更多 >
编程相关推荐