什么时候使用scikit learn的train_test_split函数?

6
我有一个包含19个特征的数据集。现在我需要进行缺失值插补,然后使用scikit的OneHOtEncoder对分类变量进行编码,最后运行机器学习算法。我的问题是,在执行上述所有操作之前,我应该使用scikit的train_test_split方法拆分数据集,还是先将其拆分为训练集和测试集,然后在每个数据集上进行缺失值和编码处理。我的担忧是,如果我先拆分数据集,然后在生成的两个数据集上进行缺失值和其他编码处理,那么在测试集中进行变量编码时,该变量可能会缺少一些值,导致生成的哑变量数量较少。比如,原始数据集中分类变量有3个级别,虽然我们进行随机抽样,但测试集是否有可能没有该变量的全部三个级别,从而导致第一个级别仅生成两个哑变量,而不是三个?什么是正确的方法?是首先拆分,然后在训练集和测试集上执行所有上述操作,还是先在整个数据集上执行缺失值和编码处理,然后再拆分?

你应该先进行填补缺失值,然后再进行数据分割。否则对缺失值的填补可能会导致编码冲突,进而使得你的训练模型处于一种冲突状态。 - EdChum
1个回答

3
我会先将数据分成训练集和测试集。您的缺失值填充策略应该适用于训练数据,并且在训练和测试数据上都要应用。
例如,如果您打算用最常见的值或中位数替换缺失值,则必须在没有看到测试集的情况下获得这些信息(中位数,最常见值)。否则,您的缺失值填充将存在偏差。如果某些特征的值在训练数据中未被观察到,则可以增加整体样本数量或使用鲁棒性强的缺失值填充策略。 这里是一个示例,演示如何使用scikit-learn管道和填充器进行缺失值填充:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接