我从sklearn得到了作为迭代插补器输出的负值

2024-04-19 20:22:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用sklearn库中的多重插补器来插补雨水数据集中的一些缺失值,其中包含雨水站和雨水数据(每个站有一列,索引是DateTime)。我能够运行IterativeInputer并获得一个填充了所有缺失值的输出。问题是输出包含负值。可以更改他输入的de min_值,但会为所有列设置唯一值。我想在插补前根据每列的最小值设置一个最小值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)

Tags: thefromimportdataindexsklearnminmax
1条回答
网友
1楼 · 发布于 2024-04-19 20:22:11

在这个问题上有很大的改进:)

我在这里读了更多关于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示例

最后,对于我来说,在只使用正数据拟合后,插补器如何输出负数据仍然有点奇怪。因此,我要再次检查data.iloc[:,:].values是否确实是您想要的数据,其格式为插补器所期望的格式

相关问题 更多 >