【问题标题】:Machine learning philosophy: applying model to biased data机器学习哲学:将模型应用于有偏见的数据
【发布时间】:2016-04-12 11:59:19
【问题描述】:

我有一个机器学习问题,不知道有没有理论上的解决方案。

我有标记数据(我们称之为数据集D1)来构建一个随机森林分类模型,它表现良好。

现在我的主要兴趣是将此模型应用于另一个具有零标签的数据集 D2,这意味着我不能将其用于训练。衡量 D2 性能的唯一方法是检查从中预测的类的比例。

问题:D2D1 相比偏斜(特征不具有相同的均值或不适合相同的分布)。正因为如此,应用于 D2 的模型给出了严重偏向一类的结果。我知道这是正常的,因为大部分 D2 类似于 D1 的一小部分。

但是有什么方法可以纠正这种偏斜吗?我从我的问题的性质知道,预测的类的比例应该不那么有偏见。我已经尝试过标准化,但它并没有真正的帮助。

我觉得我的想法不正确:3

【问题讨论】:

    标签: machine-learning classification random-forest data-science


    【解决方案1】:

    有趣的问题。我对此的回答分为三个部分。

    免责声明:没有免费的午餐。因此,如果不检查真实测试集标签上的性能,您永远无法确定。最坏的情况是你的问题中有一个概念漂移,这使得你无法预测你的目标类。但是,有一些解决方案可以提供很好的结果

    符号:

    特征用X表示,目标变量用Y表示,分类器用f(X) |-> Y表示。 D1XX的分布P(X|D1)(有点滥用符号)

    测试集中的类分布

    您“假设可以使用预测变量中的分布(“检查从中预测的类的比例。”)。但这只是一个指示。我正在工业中构建分类器来预测机器将失败(预测性维护)。有很多工程师试图使我的输入数据倾斜,这使产生数据的机器更可靠。但是,这不是问题,因为一个类基本上消失了。但是,分类器仍然有效。

    关于“如何修复”测试集上目标标签的分布问题,有一个非常简单的方法。这个想法基本上是根据预测的标签对所有测试实例进行分类,并根据所需的目标变量分布对数据点进行采样(替换)。然后,您可以尝试检查 X 功能的分布,但这不会告诉您太多。

    偏度会是个问题吗?实际上,它可以作为分类器通常尝试最小化F1 度量的accuracy 或其他一些统计属性。如果您提前知道D2 中的分布,您可以提供一个成本函数来最小化此分布下的成本。如另一个答案中所述,这些成本可用于对训练数据进行重新采样,但是,一些学习算法也有更复杂的技术来整合这些信息。

    异常值检测

    一个问题是您是否可以检测到输入 X 中的某些内容发生了变化。这非常重要,因为这可能表明您有错误的数据。您可以应用相当简单的测试,例如所有维度的均值和分布。但是,这忽略了变量之间的依赖关系。

    对于以下两个插图,我使用了 iris 数据集

    我想到了两种技术,它们可以让您检测到数据中的某些内容发生了变化。第一种技术依赖于 PCA 转换。仅适用于数字,但对于分类特征也有类似的想法。 PCA 允许您将输入数据转换为低维空间。这是 PCA(X,t)=PCA([X1,...,Xn],t)=[Cond1,...,Condm]=Cond 带有投影t 通常使用n<<m,这种转换仍然是可逆的,因此PCA^1(Cond,t) = X' 和错误MSE(X,X') 很小。要检测问题,您可以监控此错误,一旦它增加,您可以说您不信任您的预测。

    如果我在来自 versicolorvirginica 的所有数据上构建 PCA 并绘制二维重构误差(所有虹膜维度上的 PCA)我得到

    但是,如果 versicolor 是新数据,则结果的说服力会降低。

    但是,无论如何,PCA(或类似的)是针对数值数据完成的,因此,它可以在没有太多开销的情况下提供良好的指示。

    我知道的第二种技术是基于所谓的一类支持向量机。正常的支持向量机将构建一个分类器,该分类器试图分离两个目标类Y。一类支持向量机试图将可见数据与不可见数据分开。如果您使用支持向量机进行分类,则使用此技术相当有吸引力。你基本上会得到两个分类。第一个表示目标数据,第二个表示是否曾经见过类似的数据。

    如果我在 setosavirginca 上构建一个分类器并按新奇着色,我会得到以下图表:

    可以看出来自versicolor 的数据似乎很可疑。在这种情况下,它是一个新类。然而,如果我们假设这些是弗吉尼亚的实例,它们正在危险地靠近超平面。

    半监督学习和转导

    解决您的根本问题。转导学习(半监督学习的一个特例)的想法可能很有趣。在半监督学习中,训练集由两部分组成。标记数据和未标记数据。 Semi-sup-l 使用所有这些数据来构建分类器。转导学习是一种特殊情况,其中未标记的数据是您的测试数据D2。 Vapnik 给出的想法是“当您想解决更简单的问题 [预测D2 的标签] 时,不要尝试解决更复杂的问题 [为所有可能的数据构建分类器]”

    附录

    地块的 RCODE

    ggplot(iris)+aes(x=Petal.Width,y=Petal.Length,color=Species)+geom_point()+stat_ellipse()
    library(e1071)
    iris[iris$Species %in% c("virginica","setosa"),]
    
    ocl <- svm(iris[iris$Species %in% c("virginica","setosa"),3:4],type="one-classification")
    coloring <- predict(ocl,iris[,3:4],decision.values=TRUE)
    
    ggplot(iris)+aes(x=Petal.Width,y=Petal.Length,color=coloring)+geom_point()+stat_ellipse()
    ggplot(iris)+aes(x=Petal.Width,y=Petal.Length)+geom_point(color=rgb(red=0.8+0.1*attr(coloring,"decision.values"),green=rep(0,150),blue=1-(0.8+0.1*attr(coloring,"decision.values"))))
    
    pca <- prcomp(iris[,3:4])
    
    #pca <- prcomp(iris[iris$Species %in% c("virginica","setosa"),1:4], retx = TRUE,  scale = TRUE)
    pca <- prcomp(iris[iris$Species %in% c("virginica","setosa"),1:4], retx = TRUE,  scale = TRUE,tol=0.2)
      pca <- prcomp(iris[iris$Species %in% c("virginica","versicolor"),1:4], retx = TRUE,  scale = TRUE,tol=0.4)
      predicted <-predict(pca,iris[,1:4])
      inverted <- t(t(predicted %*% t(pca$rotation)) * pca$scale + pca$center)
      ggplot(inverted[,3:4]-iris[,3:4])+aes(x=Petal.Width,y=Petal.Length,color=iris$
                                        Species)+geom_point()+stat_ellipse()
    

    【讨论】:

      【解决方案2】:

      可能有许多因素会导致这种扭曲的结果:

      您似乎表明 D2 与 D1 相比是偏斜的,因此严重偏斜的结果可能是预期的结果(也许 D2 数据集主要集中在一个类占主导地位的问题空间的区域部分) .根据数据的性质,这可能是一个有效的结果。

      也许 D1 在某个特定类上过度训练。您可以尝试对班级中较少的案例进行培训,以鼓励分类到其他班级之一以确定结果。我不知道你有多少训练或测试用例,但如果它很大并且训练数据中的类标签比其他的多,这可能会导致过度分类。

      也许您还可以操纵训练数据使其更接近 D2 的均值,看看它会对分类产生什么影响。不过我以前从未尝试过。

      我希望这在某种程度上有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-09
        • 2019-07-17
        • 2019-07-15
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-14
        相关资源
        最近更新 更多