逻辑检查:构建 SKLearn 管道

数据挖掘 机器学习 scikit-学习 随机森林 交叉验证 管道
2022-02-13 17:20:47

我对在 SKLearn 中构建管道的概念不熟悉,并且希望进行一些意义检查,以确保我不会将训练集中的信息泄漏到我的测试集中。

背景:

我有一个以连续变量为目标的稀疏高维数据集 (370x1000)。目前,我一直在对所有特征进行 90/10 分割的随机森林回归,然后通过训练集上的网格搜索进行参数调整,然后在优化模型上进行 5 折交叉验证(使用整个数据集)。

这种方法的问题:

据我了解,我正在做的许多事情可能会损害模型并引入不受欢迎的偏见。具体来说,我的担忧是:

  1. 由于我仅在初始训练/测试拆分中调整参数,因此我没有考虑在 K-Fold CV 期间出现的其他拆分组合。折叠 1 的最佳设置可能与折叠 2 不同吗?直觉上我会这么认为。

  2. 我没有做任何可能删除其他冗余特征并缩短我的特征空间的特征选择(我知道 RF 通常在高维空间方面非常好,但我仍然想尝试)。我读过的一些建议包括删除方差非常低的特征。但我发现自己遇到了与上述相同的难题:如果我从原始训练集中删除低方差特征,我不会在 K 折期间考虑其他组合。相比之下,如果我在拆分数据之前删除所有低变量特征,我肯定会在训练/测试状态之间泄漏信息。

  3. 我见过的另一种方法是递归特征选择(根据 SKLearn 使用 CV)——这看起来很有希望,因为我认为这意味着它将数据集划分为折叠并在每个折叠上进行 RFE,大概给我一个平均分数保留的最佳特征数量。

我可能的解决方案:

我一直在阅读 SKLearn 中的 Pipelines 并认为这可能是要走的路。我的理解是,管道的一个优点是我可以将转换堆叠在一起,保留各个折叠并允许我解决上面详述的问题。我正在考虑的,以及我希望任何有更多经验的人进行感官检查的内容如下:

  1. 由于数据集很小,我不会传统的训练/测试拆分方式拆分数据集,而是在整个数据集上使用 K-Fold。

  2. 使用 K-Fold 运行 RF(使用默认参数)以获得基准性能水平。

  3. 创建一个管道,我(3.1)创建折叠,(3.2)然后在每个折叠中找到要保留的最佳特征数量,(3.3)调整该折叠的超参数,最后(3.4)预测测试中的值折叠。

正如您可能会说的那样,我正在努力掌握事情应该按什么顺序进行,以及第 3 步是否真的是管道所做的。如果有人可以提供指针/建议/更正,将不胜感激。

1个回答

你走在正确的道路上。看来你可能有分析麻痹。您应该开始构建,然后看看哪些有效,哪些无效。

这是帮助您入门的代码:

from sklearn.ensemble             import RandomForestRegressor 
from sklearn.feature_selection    import VarianceThreshold
from sklearn.model_selection      import GridSearchCV
from sklearn.pipeline             import Pipeline

regressor = Pipeline([('vt', VarianceThreshold(threshold=0.0)),
                      ('rf', RandomForestRegressor())])

gsvc = GridSearchCV(regressor, {'vt__threshold':    [0, .1, .5, .7, 1],
                                'rf__n_estimators': [10, 100, 1_000],
                                'rf__max_depth':    [2, 10, 100]})