gpt4 book ai didi

python - 使用随机搜索和递归特征消除将特征缩放添加到嵌套交叉验证

转载 作者:行者123 更新时间:2023-12-04 17:09:01 24 4
gpt4 key购买 nike

我有一个分类任务,想使用重复的嵌套交叉验证来同时执行超参数调整和特征选择。为此,我使用 Python 的 sklearn 库在 RFECV 上运行 RandomizedSearchCV,如 this SO answer 中所建议的那样.

但是,我还需要先缩放我的特征并估算一些缺失值。这两个步骤也应包含在 CV 框架中,以避免训练和测试折叠之间的信息泄漏。我试图创建一个管道到达那里,但我认为它“破坏”了我的 CV 嵌套(即,彼此分开执行 RFECV 和随机搜索):

import numpy as np    
from sklearn.datasets import make_classification
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.feature_selection import RFECV
import scipy.stats as stats
from sklearn.utils.fixes import loguniform
from sklearn.preprocessing import StandardScaler
from sklearn.impute import KNNImputer
from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import RandomizedSearchCV
from sklearn.pipeline import Pipeline

# create example data with missings
Xtrain, ytrain = make_classification(n_samples = 500,
n_features = 150,
n_informative = 25,
n_redundant = 125,
random_state = 1897)
c = 10000 # number of missings
Xtrain.ravel()[np.random.choice(Xtrain.size, c, replace = False)] = np.nan # introduce random missings

folds = 5
repeats = 5
rskfold = RepeatedStratifiedKFold(n_splits = folds, n_repeats = repeats, random_state = 1897)
n_iter = 100

scl = StandardScaler()
imp = KNNImputer(n_neighbors = 5, weights = 'uniform')
sgdc = SGDClassifier(loss = 'log', penalty = 'elasticnet', class_weight = 'balanced', random_state = 1897)
sel = RFECV(sgdc, cv = folds)
pipe = Pipeline([('scaler', scl),
('imputer', imp),
('selector', sel),
('clf', sgdc)])
param_rand = {'clf__l1_ratio': stats.uniform(0, 1),
'clf__alpha': loguniform(0.001, 1)}
rskfold_search = RandomizedSearchCV(pipe, param_rand, n_iter = n_iter, cv = rskfold, scoring = 'accuracy', random_state = 1897, verbose = 1, n_jobs = -1)
rskfold_search.fit(Xtrain, ytrain)

有谁知道如何在不丢失我的 RandomizedSearchCVRFECV 的嵌套的情况下将缩放和插补包含到 CV 框架中?

非常感谢任何帮助!

最佳答案

您没有丢失嵌套的简历。

您在顶层有一个搜索对象;当您调用 fit 时,它会将数据分成多个部分。让我们关注一个这样的火车折叠。你的管道安装在上面,所以你缩放和估算,然后 RFECV 让它 split 成内部折叠。最后,一个新的估计器安装在外部训练折叠上,并在外部测试折叠上评分。

这意味着 RFE 可能有一点泄漏,因为缩放和插补发生在它的 split 之前。您可以将它们添加到估算器之前的管道中,并将该管道用作 RFE 估算器。由于 RFECV 使用发现的最佳特征数量重新调整其估计器并将其公开用于 predict 等等,因此您实际上不需要 sgdc 的第二个副本;仅使用一个副本也会产生超参数调整选择的副作用:

scl = StandardScaler()
imp = KNNImputer(n_neighbors=5, weights='uniform')
sgdc = SGDClassifier(loss='log', penalty='elasticnet', class_weight='balanced', random_state=1897)
base_pipe = Pipeline([
('scaler', scl),
('imputer', imp),
('clf', sgdc),
])
sel = RFECV(base_pipe, cv=folds)

param_rand = {'estimator__clf__l1_ratio': stats.uniform(0, 1),
'estimator__clf__alpha': loguniform(0.001, 1)}
rskfold_search = RandomizedSearchCV(sel, param_rand, n_iter=n_iter, cv=rskfold, scoring='accuracy', random_state=1897, verbose=1, n_jobs=-1)

关于python - 使用随机搜索和递归特征消除将特征缩放添加到嵌套交叉验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69883401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com