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是训练和测试数据中存在的列的名称,也包含在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])]

文档说:

Docstring:返回ds_type数据集上的预测和目标。

这是新的、未标记的数据。我不知道为什么返回的对象应该有标签。他们来自哪里?大小也没有意义。我期待有 100 个值的东西。

我通过逐行传递数据框找到了一种方法:

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

也有predict_batch可用的方法,但它似乎确实接受数据名。有没有更好的方法来做到这一点?

4

1 回答 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是测试数据框,dep_var是因变量,learn是你的模型。老实说,它在大多数情况下都有效,有时它会给出奇怪的错误,然后我必须迭代每一行以获得预测。

于 2019-11-26T17:20:43.797 回答