我在sklearn的IterativeImputer输出中得到负值。

问题描述 投票:-1回答:1

我正在使用sklearn库中的Multiple Imputer来推算雨量数据集的一些缺失值,其中包含雨量站和雨量数据(每个雨量站为一列,索引为DateTime)。我能够运行IterativeImputer,并得到一个输出,其中填充了所有的缺失值。问题是输出包含负值。可以改变他输入的min_value,但它为所有的列设置了一个唯一的值。我想在推算前根据每列的最小值设置一个min_value。在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)
python scikit-learn imputation
1个回答
0
投票

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

我读了一些关于 IterativeImputer 这里。https:/scikit-learn.orgstablemodulesgeneratedsklearn.impute.IterativeImputer.html#sklearn.impute.IterativeImputer。.

看来,它可以采取 min_value 参数,它期望是一个float或数组。如果你对数据的所有特征(列)都有一个最小值,你可以直接使用float替代。

例如,如果你希望最小的可能值是 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所期望的。

© www.soinside.com 2019 - 2024. All rights reserved.