6

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

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

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

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

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

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

4

2 回答 2

6

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

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

对于符号:

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

测试集中的类分布

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

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

偏度会是个问题吗?实际上,它可以作为分类器通常尝试最小化accuracy度量F1或其他一些统计属性。如果您事先知道分布中的分布,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')很小。要检测问题,您可以监控此错误,一旦它增加,您可以说您不信任您的预测。

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

在此处输入图像描述

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

在此处输入图像描述

然而,无论如何,PCA(或类似的)是为数值数据完成的,因此,它可以在没有太多开销的情况下给出很好的指示。

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

setosa如果我通过新颖性在and和 color上构建一个类分类器,virginca我会得到以下图表:

在此处输入图像描述

可以看出,来自的数据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()
于 2016-01-08T10:48:43.267 回答
2

可能有许多因素可能导致这种倾斜的结果:

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

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

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

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

于 2016-01-07T22:54:29.490 回答