我有机器学习问题,我不知道是否有理论上的解决方案。
我有标记数据(我们称之为数据集 D1 )来构建随机森林分类模型并且效果很好。
现在我的主要兴趣是将此模型应用于另一个具有零标签的数据集 D2 ,这意味着我无法将其用于培训。衡量 D2 的效果的唯一方法是检查从中预测的类的比例。
问题:与 D1 相比, D2 有偏差(功能不具有相同的均值或适合相同的分布)。因此,应用于 D2 的模型会给一个类带来严重偏差的结果。我知道这是正常的,因为大多数 D2 类似于 D1 的一小部分。
但有没有办法纠正这种偏斜?我从问题的本质上知道预测的班级比例应该不那么偏颇。我已经尝试了规范化,但它并没有真正帮助。
我觉得我没有直接思考:3
答案 0 :(得分:7)
有疑问的问题。我对此的回答有三个部分。
免责声明:没有免费午餐。因此,如果不检查实际测试集标签上的性能,您永远无法确定。最糟糕的情况是,你的问题有一个概念漂移,这使得无法预测你的目标类。但是,有一些解决方案可以提供相当不错的结果
用于表示法:
功能由X
表示Y
目标变量和f(X) |-> Y
表示的分类器。 X
D1
P(X|D1)
X
的分布(略微滥用符号)
Testset中的类分布
你"假设可以在预测变量中使用分布("检查从中预测的类的比例。")。然而,这仅仅是一个指示。我在工业中构建分类器以预测机器将失败(预测性维护)。有很多工程师试图使我的输入数据偏斜,这使得生产数据的机器更加可靠。然而,这不是问题,因为一个班级基本上消失了。但是,分类器仍然有效。
问题有一个非常简单的方法"如何修复"测试集上目标标签的分布。该想法基本上是根据预测的标签对所有测试实例进行分类,并根据期望的目标变量分布对数据点进行采样(替换)。然后,您可以尝试检查功能accuracy
上的分布,但这不会告诉您太多。
偏斜是一个问题吗?实际上,它可以作为分类器通常尝试最小化F1
度量或其他统计属性D2
。如果您事先知道X
中的分布,则可以提供成本函数,从而最大限度地降低此分布下的成本。这些成本可用于重新采样其他答案中提到的训练数据,但是,一些学习算法也有更复杂的技术来整合这些信息。
离群值检测
一个问题是,您是否可以检测到输入PCA(X,t)=PCA([X1,...,Xn],t)=[Cond1,...,Condm]=Cond
中的某些内容已发生变化。这非常重要,因为这可能表明您输入了错误的数据。您可以应用相当简单的测试,例如所有维度的均值和分布。但是,这会忽略变量之间的依赖关系。
我想到了两种技术,可以让您检测到数据中的某些内容已经发生了变化。第一种技术依赖于PCA转换。仅用于数字,但对于分类特征有类似的想法。 PCA允许您将输入数据转换为较低维度的空间。这是
t
投影n<<m
通常使用PCA^1(Cond,t) = X'
的情况下,此转换仍然是可逆的,因此MSE(X,X')
和错误versicolor
很小。要检测问题,您可以监控此错误,一旦增加,您可以说您不信任您的预测。
如果我在virginica
和Y
的所有数据上构建PCA,并在重建二维(所有虹膜尺寸上的PCA)上绘制错误,我得到
然而,如果杂色是新数据,结果就不那么令人信服了。
然而,无论如何都会为数字数据完成PCA(或类似的smth),因此,它可以提供良好的指示而没有太多的开销。
我所知道的第二种技术是基于所谓的一类支持向量机。普通支持向量机将构建一个尝试分离两个目标类setosa
的分类器。一类支持向量机试图将看不见的数据分开。如果使用支持向量机进行分类,使用这种技术是相当有吸引力的。你基本上会得到两个分类。第一个是目标数据,第二个是先前是否看过类似数据。
如果我在virginca
和versicolor
上构建一个分类器并按照新颖性进行着色,我会得到以下图表:
可以看出来自D2
的数据似乎已经不再可疑了。在那种情况下,它是一个新的类。然而,如果我们假设这些是弗吉尼亚的实例,它们就会危险地靠近超平面漂移。
半监督学习和转导
解决您的潜在问题。转导学习的概念,半监督学习的特例可能是咄咄逼人的。在Semi监督学习中,训练集由两部分组成。标记数据和未标记数据。 Semi-sup-l使用所有这些数据来构建分类器。转换学习是一种特殊情况,其中未标记的数据是您的测试数据D2
。 Vapnik给出了这个想法,当你想要解决一个更简单的问题时,不要试图解决一个更复杂的问题[为所有可能的数据建立一个分类器] [预测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()
的标签] &#34;
<强> APENDIX 强>
用于绘图的RCODE
{{1}}
答案 1 :(得分:2)
可能有许多因素可能导致这种扭曲的结果:
您似乎表明D2与D1相比有所偏差,因此严重偏差的结果可能是预期结果(也许D2数据集主要集中在问题空间的区域部分,其中一个类占主导地位) 。根据数据的性质,这可能是一个有效的结果。
也许D1在特定班级上受到过度训练。您可以尝试在课堂上减少案例训练,以鼓励对其他课程中的一个进行分类以确定结果。我不知道你有多少训练或测试用例,但是如果它很大并且训练数据中的类标签比其他标签多,那么这可能会导致过度分类。
也许你也可以操纵训练数据,使其更接近D2的手段,看看它对分类有什么影响。我以前从未尝试过这个。
我希望这会有所帮助。