如何将fastai表格模型应用于新数据?

5

我使用fastai.tabular训练了一个模型。现在,我有一个配好的学习器。最终,模型应该是用于应用到新数据,而不仅仅是在训练集上拟合和在测试集上评估等。我尝试了不同的方法,但都导致错误或一些奇怪的问题。是否有一种方法可以将使用fastai训练的模型应用于之前无法使用的数据?还是我必须不断地训练模型并提供新的测试数据?这看起来不太可能。

df_test = pd.read_parquet('generated_test.parquet').head(100)
test_data = TabularList.from_df(df_test, cat_names=cat_names, cont_names=cont_names)
prediction = learn.predict(test_data)

KeyError: 'atomic_distance'(键错误:'atomic_distance')

atomic_distance 是训练数据和测试数据中都存在的一列,同时也包含在 cont_names 中。

prediction = learn.get_preds(kaggle_test_data)

这个功能会执行一些操作,但它会返回一些奇怪的东西:

[tensor([[136.0840],
         [ -2.0286],
         [ -2.0944],
         ...,
         [135.6165],
         [  2.7626],
         [  8.0316]]),
 tensor([ 84.8076, -11.2570, -11.2548,  ...,  81.0491,   0.8874,   4.1235])]

文档说明:

文档字符串: 返回在ds_type数据集中的预测值和目标值。

这是新的、未标记的数据。我不知道返回对象为什么应该有标签。它们从哪里来?另外,大小也不合理。我期望得到100个值的东西。

我发现了一种逐行传递数据帧的方法:

prediction = [float(learn.predict(df_test.loc[i])[0].data) for i in df_test.index]

还有可用的方法predict_batch,但似乎不接受数据框。有更好的方法吗?

1个回答

2

我使用:

data_test = (TabularList.from_df(DF_TEST, path=path, cat_names=cat_names,cont_names=cont_vars, procs=procs)
                           .split_none()
                           .label_from_df(cols=dep_var))
data_test.valid = data_test.train
data_test=data_test.databunch()

learn.data.valid_dl = data_test.valid_dl
pred = learn.get_preds(ds_type=DatasetType.Valid)[0]

DF_TEST 为测试数据框(DataFrame),dep_var 为被依赖变量,而 learn 是您的模型时。说实话,它在大多数情况下都可以正常工作,其他情况下会出现奇怪的错误,然后我必须迭代每一行来获取预测结果。


在我指定第一行以适应现有的学习器对象后,这对我起作用了。最终提供了一个相当不错的建议,可以预测多个实例,而无需使用predict()方法循环遍历。 - m_h

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接