【发布时间】:2021-12-21 06:55:53
【问题描述】:
我有一个分类任务,想使用重复的嵌套交叉验证来同时执行超参数调整和特征选择。为此,我正在使用 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)
有谁知道如何在不丢失我的 RandomizedSearchCV 和 RFECV 的嵌套的情况下将缩放和插补纳入 CV 框架?
非常感谢任何帮助!
【问题讨论】:
标签: python scikit-learn