【问题标题】:Imputer mean strategy removes NaN instead of replacingImputer mean 策略删除 NaN 而不是替换
【发布时间】:2017-11-27 09:49:12
【问题描述】:

我正在尝试使用sklearn.preprocessing.Imputer 将给定数据集中的 NaN 值替换为列均值。我没有替换NaN,而是发现它们正在被我的代码删除。这是一个简短的示例,展示了我面临的这个问题:

>>> test_data = np.array([float("NaN"), 1, 2, 3])
>>> imp = Imputer(missing_values=float("NaN"), strategy="mean")
>>> imp.fit_transform(test_data)
** Deprecation warning truncated **
array([[1., 2., 3.]])

我应该改变什么,而不是删除 NaN 它被替换为 2.

我试图从sklearn.preprocessing.Imputer user guide 改编,最初关注this answer 但我一定误解了他们。

编辑:

我还尝试了以下方法,它消除了弃用警告但不会改变最终结果:

>>> test_data = np.array([[float("NaN"), 1, 2, 3]])
>>> imp = Imputer(missing_values=float("NaN"), strategy="mean")
>>> imp.fit_transform(test_data)
array([[1., 2., 3.]])

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    Imputer 需要一个数据框。这按预期工作 -

    import pandas as pd
    from sklearn.preprocessing import Imputer
    
    test_series = pd.Series([float("NaN"), 1, 2, 3])
    test_data_frame = pd.DataFrame({"test_series": test_series})
    imp = Imputer(missing_values=float("NaN"), strategy="mean")
    test_data_frame = imp.fit_transform(test_data_frame)
    print(test_data_frame)
    

    【讨论】:

    • 有趣的是,无论轴设置为 0 还是 1,这似乎都有效,而我使用 numpy 数组的解决方案仅通过使用列或行来工作,具体取决于数据的排列方式。
    【解决方案2】:

    我通过重新阅读documentation for sklearn.preprocessing.Imputer 找到了我的问题的答案。事实证明,我忽略了Imputer()“构造函数”的axis 参数。默认情况下,它设置为 0(在列上应用策略)但我传递了一行数据,所以我应该使用 axis = 1。

    正如最初预期的那样,这是最终结果。

    >>> test_data = np.array([float("NaN"), 1, 2, 3])
    >>> imp = Imputer(missing_values=float("NaN"), strategy="mean", axis=1)
    >>> imp.fit_transform(test_data)
    array([[2., 1., 2., 3.]])
    

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 2014-05-22
      • 1970-01-01
      • 2019-06-03
      • 2021-07-14
      • 2016-09-16
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多