训练后如何“记住”实际预测的分类编码?

时间:2018-07-26 21:54:36

标签: machine-learning keras

假设要在包含某些分类参数的某些数据集上训练机器学习算法。 (这是机器学习的新手,但是我的想法是...)即使将所有分类数据都转换为1-hot编码的矢量,在训练后如何“记住”该编码图?

例如。在训练之前将初始数据集转换为使用1-hot编码,例如

universe of categories for some column c is {"good","bad","ok"}, so convert rows to
[1, 2, "good"] ---> [1, 2, [1, 0, 0]],
[3, 4, "bad"]  ---> [3, 4, [0, 1, 0]],
... 

,在训练模型后,所有未来的预测输入都需要对列c使用相同的编码方案。

然后在将来的预测中,数据输入将如何记住映射(其中“好”映射到索引0等)(特别是在计划使用keras RNN或LSTM模型时)?我是否需要将其保存在某个地方(例如python pickle)(如果是,如何获取显式映射)?还是有一种方法可以让模型在内部自动处理分类输入,以便仅在训练和将来使用期间输入原始标签数据即可?

如果此问题中的任何内容显示出我对某件事的严重困惑,请让我知道(同样,这对ML非常新)。

**不确定是否属于https://stats.stackexchange.com/,但在此发布是因为特别想知道如何处理此问题的实际代码实现。

1 个答案:

答案 0 :(得分:1)

我一直在做的事情如下:

使用 StringIndexer.fit() 后,您可以保存其元数据(包括实际的编码器映射,例如“good”是第一列)

这是我使用的以下代码(使用java,但可以调整为python):

StringIndexerModel sim = new StringIndexer()
        .setInputCol(field)
        .setOutputCol(field + "_INDEX")
        .setHandleInvalid("skip")
        .fit(dataset);

sim.write().overwrite().save("IndexMappingModels/" + field + "_INDEX");

以后,当尝试对新数据集进行预测时,您可以加载存储的元数据:

StringIndexerModel sim = StringIndexerModel.load("IndexMappingModels/" + field + "_INDEX");

dataset = sim.transform(dataset);

我想你已经解决了这个问题,因为它是在 2018 年发布的,但我在其他任何地方都没有找到这个解决方案,所以我认为它值得分享。