Python 如何使用预先训练的模型填充缺失值?

Python 如何使用预先训练的模型填充缺失值?,python,dataframe,machine-learning,data-cleaning,sklearn-pandas,Python,Dataframe,Machine Learning,Data Cleaning,Sklearn Pandas,我有一个带有少量变量和湿度读数的时间序列索引。我已经训练了一个ML模型来预测基于X、Y和Z的湿度值。现在,当我用泡菜加载保存的模型时,我想用X、Y和Z填充湿度缺失值。但是,应该考虑X、Y和Z本身不应该丢失的事实。p> Time X Y Z Humidity 1/2/2017 13:00 31 22 21 48 1/2/2017 14:00

我有一个带有少量变量和湿度读数的时间序列索引。我已经训练了一个ML模型来预测基于X、Y和Z的湿度值。现在,当我用泡菜加载保存的模型时,我想用X、Y和Z填充湿度缺失值。但是,应该考虑X、Y和Z本身不应该丢失的事实。p>
Time                    X        Y        Z       Humidity
1/2/2017 13:00          31       22       21           48
1/2/2017 14:00          NaN      12       NaN          NaN
1/2/2017 15:00          25       55       33           NaN
在本例中,将使用模型填充最后一行湿度。然而,第二行不应由模型预测,因为X和Z也缺失

到目前为止,我已经尝试过:

with open('model_pickle','rb') as f:
    mp = pickle.load(f)

for i, value in enumerate(df['Humidity'].values):
    if np.isnan(value):
        df['Humidity'][i] = mp.predict(df['X'][i],df['Y'][i],df['Z'][i])

这给了我一个错误的预测(),从2到5个位置参数,但给出了6个,而且我没有考虑x,y和z列值。下面是我用来训练模型并将其保存到文件中的代码:

df = df.dropna()

dfTest = df.loc['2017-01-01':'2019-02-28']
dfTrain = df.loc['2019-03-01':'2019-03-18'] 
features = [ 'X', 'Y', 'Z'] 
train_X = dfTrain[features]
train_y = dfTrain.Humidity
test_X = dfTest[features]
test_y = dfTest.Humidity

model = xgb.XGBRegressor(max_depth=10,learning_rate=0.07)
model.fit(train_X,train_y)
predXGB = model.predict(test_X)
mae = mean_absolute_error(predXGB,test_y)
import pickle
with open('model_pickle','wb') as f:
    pickle.dump(model,f)

我在培训和保存模型期间没有出现错误。

您能报告错误吗

无论如何,如果缺少值,则可以使用不同的选项来处理它们。您可以完全丢弃数据点,也可以尝试使用选择的方法推断缺失的部分:均值、插值等

Pandas文档提供了一个关于如何处理这些问题的很好的指南: 试试看

df['Humidity'][i] = mp.predict(df[['X', 'Y', 'Z']][i])  

通过这种方式,您可以按照函数的预期,将数据作为单个参数传递。按照您编写的方式,您可以将数据拆分为3个参数。

对于预测,由于您希望确保您拥有所有的X、Y、Z值,因此可以执行以下操作:

df=df.dropna(子集=[“X”、“Y”、“Z”])
现在您可以预测剩余有效示例的值,如下所示:

#其中特征=[“X”、“Y”、“Z”]
df[‘湿度’]=mp.预测(df[特征])
predict将返回所有行的预测,因此不需要迭代预测

编辑:

对于推断,假设您有一个数据帧
df
,您可以

#获取缺少湿度的行,以便预测湿度。
df_推断=df[df.湿度.isnull()]
#剩余行
df=df[df.weathy.notnull()]
#这可能仍然有缺少功能的行。
#由于无法推断缺少的特征,请将它们也删除并添加到其余行中
df=df.append(df_推断[df_推断[features].isnull().any(1)])
#并将其从df_推理中删除
df_推理=df_推理[~df_推理[特征].isnull().any(1)]
#现在,您可以根据这些行进行推断
df_推断['湿度]]=mp.预测(df_推断[特征])
#现在,您可以将其合并回剩余的行,以获得原始行数并按索引对行进行排序
df=df.append(df_推断)
df.sort_index()

我已编辑了报告错误的问题。我知道使用pandas插值时会出现各种缺失值,但在我的例子中,缺失的变量与其他变量密切相关,因此使用这种方法将提供准确的插补。您正在加载一个未指定的模型,因此我无法真正说明为什么它需要2-5个参数。不管怎样,如果不处理丢失的值,它将不起作用。再次,要么删除整行,要么用其他内容(插值、平均值、结转等)替换X、Y、Z NAN,在哪个数据集上训练模型?该数据集在X、Y、Z特征中是否也缺少值?如果是,您是如何处理它们的?是的,在同一数据集上,但使用其他年份的数据。该模型是使用完整数据(无缺失)进行训练的,因此这不是问题。好的,如果训练集中存在缺失值,那么在测试集中也必须使用相同的插补方法。你必须使用一种现有的插补方法,没有其他办法。当然,与交叉验证错误相比,您的模型的准确度应该更低。请澄清:您正在加载什么模型?您确定使用
.predict
有效吗?您向我们展示了一个关于您未提供的方法的错误,因此很难帮助您。此外,请解释您在评估过程中是否使用了任何插补方法training@Roim我对问题进行了编辑,以使问题更加清晰。谢谢@dumpy,该问题有效,没有出现任何错误。然而,现在所有的行都由模型预测,也就是说,没有丢失的原始数据也被预测。我知道这种没有循环的方法更快,但我也应该首先检查行是否丢失。有什么建议吗?我希望您已经将训练和测试数据与推断数据(缺少湿度值的数据)分开。将此添加到回答中,让我进一步澄清一下。这里不需要训练,因为我正在加载一个预先训练过的模型。现在让我们假设湿度列缺少15%的值,我只想在这15%的行上运行predict。剩下的将保持不变,希望这是有意义的。我上面定义的
df_推断
就是您需要的
df=df[df.weathy.isnull()]
将为您提供数据帧,以便所有行的湿度都为NaN。您可以通过
df['weathy']=mp.predict(df[features])
更新答案以反映您需要的一切。推断可推断的行,并将其合并回原始行以返回所有行。