机器学习哲学:将模型应用于有偏见的数据

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

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

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

问题:D2D1相比是偏斜的(特征的均值不同或不符合相同的分布)。因此,应用于D2的模型会产生严重偏向一个类别的结果。我知道这是正常的,因为D2的大部分与D1的一个小子集相似。

但是,有没有办法纠正这种偏斜?我从问题的本质知道,预测的类别比例应该更不偏见。我尝试过归一化,但并没有真正帮助。

我觉得我没有想清楚 :3


回答:

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

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

关于符号的说明:

特征用X表示,目标变量用Y表示,学习到的分类器用f(X) |-> Y表示。D1X的分布用P(X|D1)表示(稍微滥用了一些符号)

测试集中的类别分布

你“假设可以使用预测变量中的分布(‘检查从中预测的类别的比例’)。然而,这仅仅是一个指示。我在工业中构建分类器来预测机器会发生故障(预测性维护)。有很多工程师试图使我的输入数据偏斜,这使得产生数据的机器更加可靠。然而,这不是问题,因为一个类别基本上消失了。然而,分类器仍然有效。

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

偏斜会成为问题吗?确实会,因为分类器通常试图最小化accuracyF1度量或其他统计属性。如果你提前知道D2中的分布,你可以提供一个在这种分布下最小化成本的成本函数。这些成本可以用来重新抽样训练数据,如另一个答案中提到的,然而,一些学习算法还有更复杂的技术来整合这些信息。

异常检测

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

在接下来的两个插图中,我使用了iris数据集enter image description here

我想到了两种技术,可以让你检测到数据中发生了变化。第一种技术依赖于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,并在两个维度上绘制重建误差(在所有iris维度上进行PCA),我得到

enter image description here

然而,如果versicolor是新数据,结果就不那么令人信服了。

enter image description here

然而,PCA(或类似的东西)无论如何都是为数值数据做的,因此,它可以在不增加太多开销的情况下提供很好的指示。

我知道的第二种技术是基于所谓的单类支持向量机。普通的支持向量机会构建一个试图分离两个目标类别Y的分类器。单类支持向量机试图分离已见和未见的数据。使用这种技术相当有吸引力,如果你使用支持向量机进行分类。你基本上会得到两个分类。第一个是目标数据,第二个是之前是否见过类似的数据。

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

enter image description here

如图所示,来自versicolor的数据似乎相当可疑。在这种情况下,它是一个新类别。然而,如果我们假设这些是virginica的实例,它们正危险地接近超平面。

半监督学习和传导学习

为了解决你的基本问题。传导学习的想法,即半监督学习的一个特殊情况,可能会很有趣。在半监督学习中,训练集由两部分组成。标记数据和未标记数据。半监督学习使用所有这些数据来构建分类器。传导学习是一个特殊情况,其中未标记数据是你的测试数据D2。这个想法是由Vapnik提出的“当你想解决一个简单的问题[为D2预测标签]时,不要试图解决一个更复杂的问题[为所有可能的数据构建分类器]”

附录

R代码用于绘图

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()

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注