Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning 机器学习哲学:将模型应用于有偏数据_Machine Learning_Classification_Random Forest_Data Science - Fatal编程技术网

Machine learning 机器学习哲学:将模型应用于有偏数据

Machine learning 机器学习哲学:将模型应用于有偏数据,machine-learning,classification,random-forest,data-science,Machine Learning,Classification,Random Forest,Data Science,我有一个机器学习的问题,我不知道是否有一个理论上的解决方案 我用标记了数据(我们称之为数据集D1)来构建一个随机森林分类模型,它的性能很好 现在我的主要兴趣是将此模型应用于另一个数据集D2,该数据集没有标签,这意味着我无法将其用于培训。衡量D2性能的唯一方法是检查从中预测的类的比例 问题:D2与D1相比是倾斜的(特征没有相同的平均值或适合相同的分布)。因此,应用于D2的模型给出了一个类的严重倾斜结果。我知道这是正常的,因为大多数D2类似于D1的一小部分 但有没有办法纠正这种偏斜?我知道,从我的问

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

我用标记了数据(我们称之为数据集D1)来构建一个随机森林分类模型,它的性能很好

现在我的主要兴趣是将此模型应用于另一个数据集D2,该数据集没有标签,这意味着我无法将其用于培训。衡量D2性能的唯一方法是检查从中预测的类的比例

问题:D2D1相比是倾斜的(特征没有相同的平均值或适合相同的分布)。因此,应用于D2的模型给出了一个类的严重倾斜结果。我知道这是正常的,因为大多数D2类似于D1的一小部分

但有没有办法纠正这种偏斜?我知道,从我的问题的性质来看,预测的班级比例应该少一些偏差。我试过正常化,但没有真正的帮助


我觉得我没有直截了当地思考:3

可能有很多因素会导致这种扭曲的结果:

您似乎指出D2与D1相比存在偏差,因此严重偏差的结果可能是预期结果(可能D2数据集主要集中在问题空间的某个区域,其中一个类占主导地位)。根据数据的性质,这可能是一个有效的结果

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

也许您还可以操纵训练数据,使其更接近D2的平均值,以查看其对分类的影响。不过我以前从没试过


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

回答这个问题。我的答案有三个部分

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

表示法:

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

测试集中的类分布

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

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

偏斜是否会成为一个问题?事实上,它可以作为一个分类器,通常试图最小化
F1
度量值的
准确性或一些其他统计特性。如果您事先知道
D2
中的分布,您可以提供一个成本函数,以最小化此分布下的成本。这些成本可以n可以用于对另一个答案中提到的训练数据进行重采样,但是,一些学习算法也有更复杂的技术来结合这些信息

异常值检测

一个问题是,您是否可以检测到输入
X
中发生了变化。这非常重要,因为这可能表明您有错误的数据。您可以应用相当简单的测试,例如所有维度的平均值和分布。但是,这忽略了变量之间的依赖关系

对于以下两个插图,我使用iris数据集

我想到了两种技术,可以让你检测到数据中的某些东西发生了变化。第一种技术依赖于PCA变换。仅用于数字,但对于分类特征有类似的想法。PCA允许你将输入数据变换到低维空间。这是
PCA(X,t)=PCA([X1,…,Xn],t)=[Cond1,…,Condm]=Cond
带有投影
t
其中,通常使用
n
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()