我目前正在将 sklearn 用于学校项目,我对 GridsearchCV 如何应用预处理算法(如 PCA 或因子分析)有一些疑问。假设我执行了坚持:
X_tr, X_ts, y_tr, y_ts = train_test_split(X, y, test_size = 0.1, stratify = y)
然后,我声明一些超参数并执行 GridSearchCV(它与 RandomSearchCV 相同,但无论如何):
params = {
'linearsvc__C' : [...],
'linearsvc__tol' : [...],
'linearsvc__degree' : [...]
}
clf = make_pipeline(PCA(), SVC(kernel='linear'))
model = GridSearchCV(clf, params, cv = 5, verbose = 2, n_jobs = -1)
model.fit(X_tr, y_tr)
我的问题是:我的老师告诉我,在 ak fold cv 的情况下,你永远不应该在验证集上拟合预处理算法(这里是 PCA),而只能在火车分割上(这里火车分割和验证分割都是 X_tr 的子集,当然它们每次折叠都会改变)。因此,如果我在这里有 PCA(),它应该适合用于训练模型的折叠部分,最终当我针对验证拆分测试结果模型时,使用获得的 PCA 模型对其进行预处理,使其与训练集相匹配。这确保了无论如何都不会泄漏。
sklearn 是否考虑到这一点?
如果确实如此:假设现在我想使用 imblearn 对不平衡集执行过采样:
clf = make_pipeline(SMOTE(), SVC(kernel='linear'))
仍然根据我的老师的说法,您也不应该对验证拆分执行过采样,因为这可能会导致不准确的准确性。所以上面关于 PCA 的关于在第二时刻转换验证集的声明在这里不适用。sklearn/imblearn 是否也考虑了这一点?
提前谢谢了