【发布时间】:2020-03-04 09:24:22
【问题描述】:
我正在编写一个脚本,该脚本使用“局部异常因子”算法进行“新奇检测”。 在这种情况下,我们需要在进行预测之前“拟合”一个“干净/训练”的数据框。 为了使算法正常工作,我们需要对数据帧中的值进行编码,例如将“vrrp”编码为“0”,将“udp”编码为“2”,依此类推。 为此,我使用了 sklearn 的 LabelEncoder(),它使我能够将编码的数据帧传递给算法。
encoder = LabelEncoder()
dataEnc = dataEnc.apply(encoder.fit_transform)
...
dataframeEnc = dataframeEnc.apply(encoder.fit_transform)
其中“dataEnc”是训练数据集,“dataframeEnc”是用于进行预测的数据集。
当我尝试使用新数据帧进行预测时出现问题:对于相同的原始值,“训练”的编码值与“预测”数据帧的编码值不同。
我的目标是在编码新数据帧时保持生成的编码值参考原始值。
在对“Training”数据帧进行编码时,例如,在对值“10.67.21.254”进行编码时,它总是编码为“23”。 然而,当编码一个新的数据帧(验证数据帧)时,相同的值会产生不同的编码值,在我的例子中是'1'。
作为我所期望的一个例子是:
10.67.21.254 234.1.2.88 0 0 udp 3.472 KB 62
编码为:
23 153 0 0 4 1254 61 0
预计,对于相同的原始值,它会编码 到相同的编码值,但是,我再次编码后得到的是:
1 1 0 0 1 2 2 0
我认为它所做的是基于同一数据集的其他值为数据集上的每一行赋予新值。
然后我的问题是:如何确保在对新数据集(预测)的值进行编码时,我得到与前一个(训练)数据集相同的编码值?
【问题讨论】:
-
你应该只对测试数据使用 .tranform(),而不是 .fit_transform()。
-
@KRKirov 在测试数据上使用
dataframeEnc = dataframeEnc.apply(encoder.transform)时,它可能是一个新的、非种子值,然后会导致ValueError: ("y contains previously unseen labels: '11.31.77.119'",:( -
是的,这是通常的痛苦。在你的训练中引入一个“unk”类别并将数据中任何以前看不见的值设置为“unk”可以帮助解决这个问题。或者,您可以使用 scikit-learn 的 OneHotEncoder 和 handle_unknown='ignore' 来自动处理这个问题。发布十行训练数据和几个验证数据也会有所帮助。
-
@KRKirov 它会解决它引发错误是的。但是,它会破坏我的目标:检测新奇事物。我想要发生的是:有 200 个不同的 IP,每个都从 0 编码到 199。当看到一个新 IP 时,它应该编码为 200 而不是 0 或无:使用 handle_unknown='ignore' 会发生什么是每个非-known 值变为 0 并将其反转为无(null),这对我的用例无用:\ TLDR:应该将新的未知值“添加”到编码中,而不是全部变为 0 (忽略)。
标签: python pandas scikit-learn sklearn-pandas