机器学习哲学:将模型应用于有偏见的数据
Machine learning philosophy: applying model to biased data
我有一个机器学习问题,不知道是否有理论上的解决方案。
我有标记的数据(我们称之为数据集D1)来构建随机森林class化模型,它表现不错
现在我的主要兴趣是将此模型应用于另一个标签为零的数据集 D2,这意味着我不能将其用于训练。衡量 D2 性能的唯一方法是检查从中预测的 classes 的比例。
问题:D2 与 D1 相比有偏差(特征不具有相同的均值或不符合相同的分布)。因此,应用于 D2 的模型给出的结果严重偏向 class。我知道这是正常的,因为大多数 D2 类似于 D1.
的一小部分
但是有什么方法可以纠正这种偏斜吗?从我的问题的性质来看,我知道预测的 classes 的比例应该不那么有偏见。我已经尝试过标准化,但它并没有真正帮助。
我觉得我的思路不清晰:3
可能有许多因素会导致这种扭曲的结果:
您似乎表明 D2 与 D1 相比存在偏差,因此严重偏差的结果可能是预期的结果(也许 D2 数据集主要关注问题的区域部分 space其中一个 class 占主导地位)。根据数据的性质,这可能是一个有效的结果。
也许 D1 在特定 class 上训练过度。您可以尝试对 class 中较少的案例进行训练,以鼓励 class 化为其他 class 之一来确定结果。我不知道你有多少训练或测试用例,但如果它很大并且训练数据中的 classes 标签比其他标签多,这可能会导致过度 class化.
也许您还可以操纵训练数据使其更接近 D2 的均值,以查看它对 classification 有何影响。不过我以前从未尝试过这个。
我希望这对您有所帮助。
一个棘手的问题。我对此的回答分为三个部分。
免责声明:天下没有免费的午餐。因此,如果不检查真实测试集标签上的性能,你永远无法确定。最坏的情况是你的问题有概念漂移,这使得无法预测你的目标 class。但是,有些解决方案可以提供很好的结果
表示法:
特征由 X
表示,目标变量由 Y
表示,class 表示由 f(X) |-> Y
学习。 X
在 D1
中的分布 P(X|D1)
(有点滥用符号)
Class 在测试集中的分布
你 "postulated that one could use the distribution in the predicted variables (" 检查从中预测的 classes 的比例。”)。然而,这只能是一个指示。我正在行业中构建 classifiers 来预测机器会发生故障(预测性维护)。有很多工程师试图使我的输入数据倾斜,这使生成数据的机器更加可靠。但是,这不是问题,因为 class基本上消失了。但是,classifiers 仍然有效。
关于 "how to fix" 测试集上目标标签分布的问题,有一个非常简单的方法。这个想法基本上是 class 根据预测的标签验证所有测试实例,并根据所需的目标变量分布对数据点进行采样(有替换)。然后您可以尝试检查特征 X
的分布,但这不会告诉您太多信息。
偏斜会是个问题吗?事实上,它可以作为一个 Classifier 通常试图最小化 F1
度量的 accuracy
或一些其他统计 属性。如果您事先知道 D2
中的分布,您可以提供一个成本函数,使该分布下的成本最小化。如其他答案中所述,这些成本可用于对训练数据进行重新采样,但是,一些学习算法也有更精细的技术来合并此信息。
异常检测
一个问题是您是否可以检测到输入中发生了某些变化 X
。这非常重要,因为这表明您的数据有误。您可以应用相当简单的测试,例如所有维度的均值和分布。但是,这忽略了变量之间的依赖关系。
下面两张图我用的是鸢尾花数据集
我想到了两种技术,可以让您检测到数据中的某些内容发生了变化。第一种技术依赖于 PCA 转换。仅针对数值,但对于分类特征也有类似的想法。 PCA 允许您将输入数据转换为低维 space。这是
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(或类似的东西)都是对数值数据进行的,因此,它可以在没有太多开销的情况下给出很好的指示。
我知道的第二种技术是基于所谓的 One class 支持向量机。一个普通的支持向量机会构建一个 class 试图分离两个目标 classes Y
的 ifier。一个 class 支持向量机试图将可见数据与不可见数据分开。如果您使用支持向量机进行 class 化,则使用此技术相当有吸引力。你基本上会得到两个 classifications。第一个说的是目标数据,第二个是有没有看过类似的数据。
如果我在 setosa
和 virginca
上构建一个 one-class classifier 并按新颖性着色,我得到以下图表:
可以看出,来自 versicolor
的数据似乎不再可疑。在那种情况下,它是一个新的 class。然而,如果我们假设这些是 virginica 的实例,它们就会危险地靠近超平面。
Semi-supervised 学习与转导
解决您的根本问题。 Transductive Learning 的想法,半监督学习的一个特例,可能很吸引人。在半监督学习中,训练集由两部分组成。标记数据和未标记数据。 Semi-sup-l 使用所有这些数据来构建 classifier。 Transductive Learning 是一种特殊情况,其中未标记的数据是您的测试数据 D2
。这个想法是由 Vapnik 提出的 "don't try to solve a more complicated problem [building a classifier for all possible data] when you want to solve a simpler problem [predicting labels for 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()
我有一个机器学习问题,不知道是否有理论上的解决方案。
我有标记的数据(我们称之为数据集D1)来构建随机森林class化模型,它表现不错
现在我的主要兴趣是将此模型应用于另一个标签为零的数据集 D2,这意味着我不能将其用于训练。衡量 D2 性能的唯一方法是检查从中预测的 classes 的比例。
问题:D2 与 D1 相比有偏差(特征不具有相同的均值或不符合相同的分布)。因此,应用于 D2 的模型给出的结果严重偏向 class。我知道这是正常的,因为大多数 D2 类似于 D1.
的一小部分但是有什么方法可以纠正这种偏斜吗?从我的问题的性质来看,我知道预测的 classes 的比例应该不那么有偏见。我已经尝试过标准化,但它并没有真正帮助。
我觉得我的思路不清晰:3
可能有许多因素会导致这种扭曲的结果:
您似乎表明 D2 与 D1 相比存在偏差,因此严重偏差的结果可能是预期的结果(也许 D2 数据集主要关注问题的区域部分 space其中一个 class 占主导地位)。根据数据的性质,这可能是一个有效的结果。
也许 D1 在特定 class 上训练过度。您可以尝试对 class 中较少的案例进行训练,以鼓励 class 化为其他 class 之一来确定结果。我不知道你有多少训练或测试用例,但如果它很大并且训练数据中的 classes 标签比其他标签多,这可能会导致过度 class化.
也许您还可以操纵训练数据使其更接近 D2 的均值,以查看它对 classification 有何影响。不过我以前从未尝试过这个。
我希望这对您有所帮助。
一个棘手的问题。我对此的回答分为三个部分。
免责声明:天下没有免费的午餐。因此,如果不检查真实测试集标签上的性能,你永远无法确定。最坏的情况是你的问题有概念漂移,这使得无法预测你的目标 class。但是,有些解决方案可以提供很好的结果
表示法:
特征由 X
表示,目标变量由 Y
表示,class 表示由 f(X) |-> Y
学习。 X
在 D1
中的分布 P(X|D1)
(有点滥用符号)
Class 在测试集中的分布
你 "postulated that one could use the distribution in the predicted variables (" 检查从中预测的 classes 的比例。”)。然而,这只能是一个指示。我正在行业中构建 classifiers 来预测机器会发生故障(预测性维护)。有很多工程师试图使我的输入数据倾斜,这使生成数据的机器更加可靠。但是,这不是问题,因为 class基本上消失了。但是,classifiers 仍然有效。
关于 "how to fix" 测试集上目标标签分布的问题,有一个非常简单的方法。这个想法基本上是 class 根据预测的标签验证所有测试实例,并根据所需的目标变量分布对数据点进行采样(有替换)。然后您可以尝试检查特征 X
的分布,但这不会告诉您太多信息。
偏斜会是个问题吗?事实上,它可以作为一个 Classifier 通常试图最小化 F1
度量的 accuracy
或一些其他统计 属性。如果您事先知道 D2
中的分布,您可以提供一个成本函数,使该分布下的成本最小化。如其他答案中所述,这些成本可用于对训练数据进行重新采样,但是,一些学习算法也有更精细的技术来合并此信息。
异常检测
一个问题是您是否可以检测到输入中发生了某些变化 X
。这非常重要,因为这表明您的数据有误。您可以应用相当简单的测试,例如所有维度的均值和分布。但是,这忽略了变量之间的依赖关系。
下面两张图我用的是鸢尾花数据集
我想到了两种技术,可以让您检测到数据中的某些内容发生了变化。第一种技术依赖于 PCA 转换。仅针对数值,但对于分类特征也有类似的想法。 PCA 允许您将输入数据转换为低维 space。这是
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(或类似的东西)都是对数值数据进行的,因此,它可以在没有太多开销的情况下给出很好的指示。
我知道的第二种技术是基于所谓的 One class 支持向量机。一个普通的支持向量机会构建一个 class 试图分离两个目标 classes Y
的 ifier。一个 class 支持向量机试图将可见数据与不可见数据分开。如果您使用支持向量机进行 class 化,则使用此技术相当有吸引力。你基本上会得到两个 classifications。第一个说的是目标数据,第二个是有没有看过类似的数据。
如果我在 setosa
和 virginca
上构建一个 one-class classifier 并按新颖性着色,我得到以下图表:
可以看出,来自 versicolor
的数据似乎不再可疑。在那种情况下,它是一个新的 class。然而,如果我们假设这些是 virginica 的实例,它们就会危险地靠近超平面。
Semi-supervised 学习与转导
解决您的根本问题。 Transductive Learning 的想法,半监督学习的一个特例,可能很吸引人。在半监督学习中,训练集由两部分组成。标记数据和未标记数据。 Semi-sup-l 使用所有这些数据来构建 classifier。 Transductive Learning 是一种特殊情况,其中未标记的数据是您的测试数据 D2
。这个想法是由 Vapnik 提出的 "don't try to solve a more complicated problem [building a classifier for all possible data] when you want to solve a simpler problem [predicting labels for 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()