我对机器学习这个领域非常新手,目前正在参加一个在线课程。在课程中,讲师展示了以下代码:
imputer = Inputer(missing_values = 'Nan', strategy = 'mean', axis=0)imputer = Imputer.fit(X[:, 1:3])X[:, 1:3] = imputer.transform(X[:, 1:3])
我不太明白为什么这个Imputer对象需要进行fit
。我的意思是,我只是想通过用列的平均值来替换缺失值来处理我的列。从我对编程的有限了解来看,这是一个非常简单的、迭代的过程,不需要一个必须在数据上训练的模型来完成。
能有人解释一下这个Imputer是如何工作的,以及为什么它需要训练来用列的平均值替换一些缺失值吗?我已经阅读了sci-kit的文档,但它只是展示了如何使用这些方法,而没有解释为什么需要这些方法。
谢谢你。
回答:
Imputer用数据的某些统计值(例如平均值、中位数等)来填补缺失值。为了避免在交叉验证期间发生数据泄露,它在fit
过程中计算训练数据的统计值,存储这些统计值,并在transform
过程中应用于测试数据。
from sklearn.preprocessing import Imputerobj = Imputer(strategy='mean')obj.fit([[1, 2, 3], [2, 3, 4]])print(obj.statistics_)# array([ 1.5, 2.5, 3.5])X = obj.transform([[4, np.nan, 6], [5, 6, np.nan]])print(X)# array([[ 4. , 2.5, 6. ],# [ 5. , 6. , 3.5]])
如果你训练数据和测试数据是相同的,你可以使用fit_transform
一次完成这两个步骤。
X = obj.fit_transform([[1, 2, np.nan], [2, 3, 4]])print(X)# array([[ 1. , 2. , 4. ],# [ 2. , 3. , 4. ]])
这个问题很重要,因为数据分布可能从训练数据到测试数据发生变化,你不希望测试数据的信息在fit过程中已经存在。
有关交叉验证的更多信息,请参阅文档。