【问题标题】:sklearn.impute SimpleImputer: why does transform() need fit_transform() first?sklearn.impute SimpleImputer:为什么 transform() 首先需要 fit_transform()?
【发布时间】:2019-09-25 22:07:53
【问题描述】:

sklearn 提供transform() 方法来应用one-hot encoder。

要使用transform()方法,在调用transform()方法之前需要fit_transform(),否则

np.array([[1, 1], [2, 1], [3, 2], [np.nan, 2]])
from sklearn.impute import SimpleImputer
my_imputer = SimpleImputer()
my_imputer.transform(df)

出现错误

NotFittedError:此 SimpleImputer 实例尚未安装。称呼 在使用此方法之前,“适合”适当的参数。

transform()之前调用fit_transform()

my_imputer.fit_transform(df)
my_imputer.transform(df)

修正这个错误。

问题是,为什么transform() 需要fit_transform()

【问题讨论】:

  • 如果您只调用fit_transform,则根本不需要调用transformfit_transform 首先拟合数据,然后对其进行转换。或者您可以先致电my_imputer.fit(df)my_imputer.transform(df)。两者都是一样的。
  • 基本上,你需要先拟合数据,然后再进行转换
  • 实际上 transform_fit 包含拟合和转换两个步骤,或者您可以说填充缺失值。对于您的问题,为什么我们首先需要转换,因为它是一种训练对数据的估算并推断平均值或中位数......以填补缺失值

标签: python scikit-learn


【解决方案1】:

fit() 期间,估算器了解数据的平均值、中位数等,然后在transform() 期间将其应用于缺失值。

fit_transform() 只是结合这两种方法的简写。所以本质上:

  • fit(X, y) :- 了解所提供数据的所需方面并返回具有学习参数的新对象。它不会以任何方式更改提供的数据。

  • transform() :- 实际上将提供的数据转换为新形式。

fit_transform(df) 不需要在转换之前调用。只需调用fit()。通常,您描述的序列是通过数据的训练和测试拆分完成的。比如:

# Combining the learning of parameters from training data and transforming into a single step.
X_train_new = my_imputer.fit_transform(X_train)

# We dont want to learn about test data, only change it according to previously learnt information
X_test_new = my_imputer.transform(X_test)

上面的代码sn-p可以分解成:

# It learns about the data and does nothing else
my_imputer.fit(X_train)

# Calling transform to apply the learnt information on supplied data
X_train_new = my_imputer.transform(X_train)
X_test_new = my_imputer.transform(X_test)

【讨论】:

  • 您不需要在测试数据上安装一个新的 imputer 以避免数据泄漏吗?
  • @Maths12 不。当您拟合(从中学习)整个数据并从中得出测试数据时,就会发生泄漏。从不适合测试数据。
  • 只是为了一目了然,所以当我用模式对我的数据进行 nans 或 infs 估算时,无论我从火车上得到什么模式值,我都会用这个填充我的测试和验证?
  • 一旦我应用了这个,我如何将它转换回保留索引的数据框?
  • @Maths12 很抱歉,我没有听懂你的问题。您想将训练和测试再次组合成一个数据帧吗?还是不同的数据框?你说的是哪个指数?你能举个例子或发布一个你想要的新问题吗?
猜你喜欢
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2020-04-27
  • 2014-07-13
  • 2016-12-06
  • 2022-08-20
  • 1970-01-01
相关资源
最近更新 更多