为啥 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() 返回的特征不适合拟合函数

Python - SkLearn Imputer 用法

为分类变量 sklearn 创建我的自定义 Imputer

使用sklearn中preprocessing.Imputer实现对缺失值的处理

为分类变量sklearn创建我的自定义Imputer

不能从pandas_ml的'sklearn.preprocessing'中导入名称'Imputer'。