【问题标题】:I'm getting negative values as output of IterativeImputer from sklearn我从 sklearn 得到负值作为 IterativeImputer 的输出
【发布时间】:2020-09-08 17:13:03
【问题描述】:

我正在使用 sklearn 库中的 Multiple Imputer 来估算降雨数据集中的一些缺失值,其中包含降雨站和降雨数据(每个站都是一列,索引是 DateTime)。我能够运行 IterativeImputer 并获得填充了所有缺失值的输出。问题是输出包含负值。可以更改他估算的 de min_value,但它为所有列设置了唯一值。我想根据插补前每列的最小值设置一个 min_value 。 There is a response here in Stack 对于那个答案,但我不知道该怎么做。

我正在使用的代码:

import pandas as pd
import numpy as np
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.compose import make_column_transformer
from sklearn.compose import make_column_selector


#Babitonga's region stations
babi_ana = pd.read_csv(all_csv_files[0]).set_index("Time") #Here a read the csv data

# Transforming my index to datetime
babi_ana.index = pd.to_datetime(babi_ana.index)
mask = (babi_ana.index > ini1) & (babi_ana.index <= fim1) #Selecting the date range 
babi_ana1 = babi_ana.loc[mask]

# Applying the imputer
imputer_data = IterativeImputer(random_state = 0,skip_complete=True,sample_posterior=True, max_iter = 10, missing_values = np.nan)
data = babi_ana1 
minimum = data.iloc[:,:].min(axis=0) #No negative values from the original
imputer_data.fit(data.iloc[:,:].values)
data_imputed = imputer_data.transform(data.iloc[:,:].values)

# Here I realize the output has negative values
data_imputed = pd.DataFrame(data_imputed)
minimun_after = data_imputed.iloc[:,:].min(axis=0) #several negative values, except for 2 stations

我希望能够根据插补前每个站点的最大值和最小值使用min_valuemax_value,如下所示:

max_imputer = data.iloc[:,:].max(axis = 0)
min_imputer = data.iloc[:,:].min(axis = 0)

【问题讨论】:

  • 请发布您的代码,而不是对其进行口头描述。
  • 很抱歉。
  • 布莱恩,欢迎来到 StackOverflow :)。我认为您的问题缺少对您尝试做的事情,目标是什么以及出了什么问题的一些描述。这些将有助于获得更多答案。我不熟悉 Imputers 或 sklearn 库,但我建议您查看这个问题:stackoverflow.com/questions/38150330/… 和答案。如果不出意外,它将向您显示格式正确的问题/答案。祝你好运!
  • 我在scikit-learn.org/stable/modules/impute.html 上阅读了一些关于 Imputer 的内容,并向您提出了一些问题:1) 您是否有不能使用 SimpleImputer 的原因?它使用起来更简单,如果你取缺失值的平均值,它们永远不会是负数(除非你的输入包含负整数,但不太可能用于降雨数据)。 2) 你能说明babi_ana1 的来源或数据的样子吗?我想知道data.iloc[:,:].values) 是否符合预期。
  • 嘿,谢谢你,Gabriel,我正在使用IterativeImputer来填补一个地区所有雨站的缺失数据,所以该函数将获取每个站的信息并输入一个值,做几次(他们称为循环方式),直到它有一个不错的结果。我没有使用SimpleImputer,因为我想基于多元特征插补获得更好的结果。我将编辑问题以提供更详细的解释。

标签: python scikit-learn imputation


【解决方案1】:

对这个问题有很大的改进:)。

我在这里阅读了更多关于IterativeImputer 的信息:https://scikit-learn.org/stable/modules/generated/sklearn.impute.IterativeImputer.html#sklearn.impute.IterativeImputer

它似乎可以在构造函数上使用min_value 参数,它需要一个浮点数或一个数组。如果您的数据的所有特征(列)都有最小值,则可以使用浮点替代方法。

例如,如果您希望所有特征(列)中的最小可能值为 0,您可以将代码更改为:

imputer_data = IterativeImputer(random_state = 0, skip_complete = True,sample_posterior = True, max_iter = 10, missing_values = np.nan, min_value = 0)

另一方面,如果你想为不同的特征设置不同的最小值,你需要使用一个数组,只要特征的数量。例如:如果您有 2 个特征并且最小值应分别为 0 和 5,您可以将代码更改为:

imputer_data = IterativeImputer(random_state = 0, skip_complete = True,sample_posterior = True, max_iter = 10, missing_values = np.nan, min_value = [0, 5])

您可以对max_value 参数执行相同的操作。

第一个更改应确保您不再获得任何负估算值。

如果您想根据已有的数据使用 minmax 值,第一步应该是编写代码,检查数据中的该特征并在其中获取最小值和最大值.它应该与在数组中获取最小值和最大值相同,如果您不确定如何做,您可能会找到很多 Python 示例。

作为最后一点,我仍然有点奇怪 Imputer 在仅拟合正数据后如何输出负数据。因此,我会仔细检查 data.iloc[:,:].values 是否真的是您想要的 Imputer 所期望格式的数据。

【讨论】:

  • 嗨,加布里埃尔,谢谢。它使用浮点数工作,但正如我所说,我想为每个站点使用最小值(如果这不起作用,我将使用浮点数来修复)。我试图使用你的替代方案。我用六个值(我的站数)创建了 `np.arange` 并尝试使用它们。当我运行 imputer_data.fit(data.iloc[:,:].values) 时,它返回一个错误:operands could not be broadcast together with shapes (3,) (6,)。所以我尝试使用np.arange(3),得到这个:NumPy boolean array indexing assignment cannot assign 3 input values to the 0 output values where the mask is true
猜你喜欢
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多