为什么sklearn Imputer需要适合?

时间:2017-10-11 15:00:58

标签: machine-learning scikit-learn

我是整个机器学习的新手,我正在上这个主题的在线课程。在本课程中,教师展示了以下代码:

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。我的意思是,我只是试图通过用列平均值替换它来消除我的列中的缺失值。从我对编程的了解很少,这是一个非常简单的迭代过程,并且不需要一个必须训练数据才能完成的模型。

有人可以解释一下这个不可思议的东西是如何工作的,以及为什么需要培训来用列平均值替换一些缺失值? 我已经阅读过sci-kit的文档,但它只是展示了如何使用这些方法,而不是为什么需要它们。

谢谢。

2 个答案:

答案 0 :(得分:23)

Imputer使用数据的某些统计信息(例如,均值,中位数......)填充缺失值。 为了避免交叉验证期间的数据泄漏,它会计算fit期间列车数据的统计数据,将其存储并在测试数据上使用它, transform

from sklearn.preprocessing import Imputer
obj = 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. ]])

此数据泄漏问题很重要,因为数据分布可能会从训练数据变为测试数据,并且您不希望在拟合期间已经存在测试数据的信息。

有关cross-validation的更多信息,请参阅文档。

答案 1 :(得分:0)

from sklearn.preprocessing impot Imputer

imputer=Imputer(missing_values='nan',strategy="mean",axis=0) 

X[:,1:3]=imputer.fit_transform(X[:,1:3])   #Train the imputer using fit and test data using transform. This is how it works.*