有趣的问题。我对此的回答分为三个部分。
免责声明:没有免费的午餐。因此,如果不检查真实测试集标签上的性能,您永远无法确定。最坏的情况是你的问题中有一个概念漂移,这使得你无法预测你的目标类。但是,有些解决方案可以提供很好的结果
对于符号:
特征由X
目标变量表示,Y
分类器由表示f(X) |-> Y
。X
in D1
by的分布P(X|D1)
(有点滥用符号)
测试集中的类分布
您“假设可以使用预测变量中的分布(“检查从中预测的类的比例。”)。但这只是一个指示。我正在工业中构建分类器来预测机器会出现故障(预测性维护)。有很多工程师试图使我的输入数据倾斜,这使生成数据的机器更可靠。但是,这不是问题,因为一个类基本上消失了。但是,分类器仍然有效.
关于“如何修复”测试集上目标标签的分布问题,有一种非常简单的方法。这个想法基本上是根据预测的标签对所有测试实例进行分类,并根据所需的目标变量分布对数据点进行采样(替换)。然后,您可以尝试检查功能的分布,X
但这不会告诉您太多。
偏度会是个问题吗?实际上,它可以作为分类器通常尝试最小化accuracy
度量F1
或其他一些统计属性。如果您事先知道分布中的分布,D2
您可以提供一个成本函数来最小化此分布下的成本。如另一个答案中所述,这些成本可用于对训练数据进行重新采样,但是,一些学习算法也具有更复杂的技术来整合这些信息。
异常值检测
一个问题是您是否可以检测到输入中的某些内容发生了变化X
。这非常重要,因为这可能表明您有错误的数据。您可以应用相当简单的测试,例如所有维度的均值和分布。但是,这忽略了变量之间的依赖关系。
对于以下两个插图,我使用 iris 数据集
![在此处输入图像描述](https://i.stack.imgur.com/ENZq7.png)
我想到了两种技术,它们可以让你检测到数据中的某些东西发生了变化。第一种技术依赖于 PCA 转换。仅适用于数值,但对于分类特征也有类似的想法。PCA 允许您将输入数据转换为低维空间。这是
PCA(X,t)=PCA([X1,...,Xn],t)=[Cond1,...,Condm]=Cond
一个投影t
,通常n<<m
这种转换仍然是可逆的,PCA^1(Cond,t) = X'
因此误差MSE(X,X')
很小。要检测问题,您可以监控此错误,一旦它增加,您可以说您不信任您的预测。
如果我在所有数据上构建 PCAversicolor
并virginica
绘制二维重建误差(所有虹膜维度上的 PCA)我得到
![在此处输入图像描述](https://i.stack.imgur.com/PjwY5.png)
但是,如果 versicolor 是新数据,那么结果就不那么令人信服了。
![在此处输入图像描述](https://i.stack.imgur.com/K239P.png)
然而,无论如何,PCA(或类似的)是为数值数据完成的,因此,它可以在没有太多开销的情况下给出很好的指示。
我知道的第二种技术是基于所谓的一类支持向量机。正常的支持向量机将构建一个分类器,试图分离两个目标类Y
。一类支持向量机试图将可见数据与不可见数据分开。如果您使用支持向量机进行分类,则使用此技术相当有吸引力。你基本上会得到两个分类。第一个表示目标数据,第二个表示以前是否见过类似的数据。
setosa
如果我通过新颖性在and和 color上构建一个类分类器,virginca
我会得到以下图表:
![在此处输入图像描述](https://i.stack.imgur.com/CUmqD.png)
可以看出,来自的数据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()