为啥 sklearn Imputer 需要适配?
Posted
技术标签:
【中文标题】为啥 sklearn Imputer 需要适配?【英文标题】:Why does sklearn Imputer need to fit?为什么 sklearn Imputer 需要适配? 【发布时间】:2018-03-23 07:52:27 【问题描述】:我在整个机器学习方面真的很陌生,我正在学习关于这个主题的在线课程。在本课程中,讲师展示了以下代码:
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 的文档,但它只是说明了如何使用这些方法,而不是为什么需要它们。
谢谢。
【问题讨论】:
【参考方案1】:Imputer 用数据的一些统计数据(例如平均值、中位数、...)填充缺失值。
为了避免交叉验证期间的数据泄露,它在fit
期间计算train 数据的统计量,将其存储并在test 数据上使用它,在@ 987654323@.
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 的更多信息,请参阅文档。
【讨论】:
好答案。请用一个例子解释一下,你很好。以上是关于为啥 sklearn Imputer 需要适配?的主要内容,如果未能解决你的问题,请参考以下文章
sklearn Imputer() 返回的特征不适合拟合函数