我拥有大约60个功能的数据,并且大多数时候我的训练数据中大多数都是零,只有2-3个cols可能有值(准确地说是其perf日志数据)。但是,我的测试数据在其他一些列中会有一些值。
我已完成标准化/标准化(单独尝试)并将其提供给PCA / SVD(单独尝试)。我使用这些功能来适应我的模型,但它给出了非常不准确的结果。
然而,如果我跳过标准化/标准化步骤并将我的数据直接输送到PCA / SVD然后再输送到模型,它会给出准确的结果(几乎高于90%的准确度)。
P.S。:我使用Isolation Forest算法进行异常检测。
为什么这些结果会有所不同?
答案 0 :(得分:2)
规范化和标准化(取决于它们有时被等同地使用的来源,因此我不确定在这种情况下每个人的确切含义,但这并不重要)是一般性建议,通常适用于数据或多或少是均匀分布的。然而,根据定义,异常检测不是那种问题。如果您有一个数据集,其中大多数示例属于类A
,并且只有少数属于类B
,则可能(如果没有必要)稀疏要素(几乎总是为零的要素) )实际上是非常歧视你的问题。归一化它们基本上会将它们变为零或几乎为零,这使得分类器(或PCA / SVD)难以真正掌握它们的重要性。因此,如果你跳过规范化,你会得到更好的准确性并不是没有道理的,你不应该因为你“应该这样做”而觉得你做错了“
我没有异常检测的经验,但我有一些不平衡的数据集。您可以考虑某种形式的“加权归一化”,其中每个要素的均值和方差的计算使用与该类中的示例数量成反比的值进行加权(例如examples_A ^ alpha / (examples_A ^ alpha + examples_B ^ alpha)
,{{1}一些小的负数)。如果您的稀疏特征具有非常不同的尺度(例如,一个在90%的情况下为0,在10%的情况下为3,在90%的情况下为0,在10%的情况下为80),您可以将它们缩放为共同范围(例如[0,1])。
在任何情况下,正如我所说,不要仅因为它们应该起作用而应用技术。如果某些内容对您的问题或特定数据集不起作用,那么您不应该使用它(并尝试理解为什么它不起作用可能会产生一些有用的见解)。
答案 1 :(得分:1)
训练集中只有零(或任何其他常量值)的任何特征都不能用于任何ML模型。你应该丢弃它们。模型无法从中学习任何信息,因此测试数据确实具有一些非零值无关紧要。
通常,在为PCA / SVD提供数据之前,您应该进行标准化或标准化,否则这些方法将捕获数据中的错误模式(例如,如果要素之间的特征不同)。
关于准确性差异背后的原因,我不确定。我想这与数据集的某些特性有关。