簡體   English   中英

sklearn:如何在GridSearchCV中擬合和變換特征選擇器

[英]sklearn: how to make fit and transform a feature selector in a GridSearchCV

我正在對數據集進行特征選擇實驗,我注意到我得到了不同的結果:a)將特征選擇放入包裹在GridSearchCV對象中的管道中並調用“ fit”,b)在特征選擇器上調用fit_transform,然后將GridSearhCV應用於分類器,從特征選擇器中獲取fit_transformed特征矩陣。 是因為“ fit”和“ fit_transform”之間的區別嗎? 不知道我是否要說清楚,但這是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之外進行特征選擇的代碼:

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。 除此之外,我認為這兩個代碼段應該完成相同的任務。

任何建議高高興興地贊賞。

通常,由於數據泄漏 ,您應該預期會有不同的結果

在第二個片段中,gridsearch在X_train的切片上訓練svc,但是,特征選擇在所有X_train上訓練

在第一個示例中,您避免了此問題。

這會大大降低泛化性能。 但是,尚不清楚如何獲取有關P,R和F的信息。它們是否來自測試集?

但是,我不確定這是否可以解釋指標差異的大小。 至少您的代碼顯示了使用數據泄漏時的典型過擬合,並且在對功能選擇進行流水線處理時性能降低。

您可能還想看看有關嵌套交叉驗證scikit-learn文檔

讓我添加一個重要的說明:在第二種方法中,您將在一開始就修復傳遞給svc的功能。 因此,svc將在每個折疊上使用相同的功能。 而在第一個示例中,傳遞給網格搜索的要素可能會倍數變化!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM