我在进行数据准备,以便使数据适合用于机器学习算法。目前,我正在处理缺失值。在下面的代码块中,我没有遇到错误,而是感到困惑。在两个代码块中,我对两个不同的数据集应用了相同的方法:train_x_e => 训练集 和 test_x => 测试集。在第一个代码块中,我使用 train_x_e
来填充 train_x_e
中的NaN值,这完全没问题。然而,在 test_x
中,我不确定应该使用 train_x_e
还是 test_x
来填充NaN值,如第二个代码块所示。如果有人能向我解释这一点,我将不胜感激!
检查键值是否大于0,以便我们可以将它们存储在nan_columns中
训练集
nan_columns = [] for keys, values in null_vals.items(): if values > 0: nan_columns.append(keys) train_x_b = train_x_e.fillna(train_x_e.median()) print(nan_columns)
测试集的相同程序
测试集
nan_columns = [] for keys, values in null_vals.items(): if values > 0: nan_columns.append(keys) test_x_b = test_x.fillna(test_x.median()) print(nan_columns)
回答:
你这样做是正确的。你应该始终分开训练和测试数据。你在测试模型时使用的是新的数据,因此只能使用从这些数据中得出的信息。
在测试时使用训练数据的中位数并不是一个严重的错误,但请注意,这两个数据集的准备过程是不同的。在第一个数据集中,使用的是相同数据集的中位数,而在第二个数据集中,则使用了与测试数据集无关的值。
此外,当使用训练集的中位数时,你需要将它与模型一起保存。如果你有1000个特征,你需要保存1000个值。如果你想要一个迭代模型,你是否也需要更新这些值呢?
使用来自其他数据集的信息污染一个数据集的现象被称为数据泄漏。