假设要在包含某些分类参数的某些数据集上训练机器学习算法。 (这是机器学习的新手,但是我的想法是...)即使将所有分类数据都转换为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/,但在此发布是因为特别想知道如何处理此问题的实际代码实现。
答案 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 年发布的,但我在其他任何地方都没有找到这个解决方案,所以我认为它值得分享。