[英]Python sklearn : fit_transform() does not work for 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.