有趣的问题。我对此的回答分为三个部分。
免责声明:没有免费的午餐。因此,如果不检查真实测试集标签上的性能,您永远无法确定。最坏的情况是你的问题中有一个概念漂移,这使得你无法预测你的目标类。但是,有一些解决方案可以提供很好的结果
符号:
特征用X表示,目标变量用Y表示,分类器用f(X) |-> Y表示。 D1中X中X的分布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') 很小。要检测问题,您可以监控此错误,一旦它增加,您可以说您不信任您的预测。
如果我在来自 versicolor 和 virginica 的所有数据上构建 PCA 并绘制二维重构误差(所有虹膜维度上的 PCA)我得到
但是,如果 versicolor 是新数据,则结果的说服力会降低。
但是,无论如何,PCA(或类似的)是针对数值数据完成的,因此,它可以在没有太多开销的情况下提供良好的指示。
我知道的第二种技术是基于所谓的一类支持向量机。正常的支持向量机将构建一个分类器,该分类器试图分离两个目标类Y。一类支持向量机试图将可见数据与不可见数据分开。如果您使用支持向量机进行分类,则使用此技术相当有吸引力。你基本上会得到两个分类。第一个表示目标数据,第二个表示是否曾经见过类似的数据。
如果我在 setosa 和 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()