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

时间:2019-06-05 23:28:44

标签: fast-ai

我用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是培训和测试数据中同时包含在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 个答案:

答案 0 :(得分:0)

我使用:

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是测试数据帧,dep_var是因变量,而learn是您的模型。 坦白地说,它在大多数情况下都有效,而其他时候却会产生奇怪的错误,然后我必须迭代每一行以获得预测。