您的直觉是正确的。该答案仅在示例中进行了说明。
确实,人们普遍认为CART / RF对异常值具有一定的鲁棒性。
为了说明RF对单个异常值的存在缺乏鲁棒性,我们可以(轻轻地)修改上述Soren Havelund Welling答案中使用的代码,以表明单个 ' y '异常值足以完全影响拟合的RF模型。例如,如果我们将未污染观测值的平均预测误差计算为离群值与其余数据之间距离的函数,则可以看到(下图)引入单个离群值(通过替换原始观测值之一)在``y''空间上的任意值)足以使RF模型的预测任意远离它们(如果对原始(未污染)数据进行计算将获得的值):
library(forestFloor)
library(randomForest)
library(rgl)
set.seed(1)
X = data.frame(replicate(2,runif(2000)-.5))
y = -sqrt((X[,1])^4+(X[,2])^4)
X[1,]=c(0,0);
y2<-y
rg<-randomForest(X,y) #RF model fitted without the outlier
outlier<-rel_prediction_error<-rep(NA,10)
for(i in 1:10){
y2[1]=100*i+2
rf=randomForest(X,y2) #RF model fitted with the outlier
rel_prediction_error[i]<-mean(abs(rf$predict[-1]-y2[-1]))/mean(abs(rg$predict[-1]-y[-1]))
outlier[i]<-y2[1]
}
plot(outlier,rel_prediction_error,type='l',ylab="Mean prediction error (on the uncontaminated observations) \\\ relative to the fit on clean data",xlab="Distance of the outlier")
多远?在上面的示例中,单个离群值已更改了拟合量,以至于如果将模型拟合到未污染的数据上,那么(未污染的)观测值的平均预测误差现在将比原值大1-2个数量级。
因此,单个异常值不能影响RF拟合是不正确的。
此外,正如我在其他地方指出的那样,当可能存在多个异常值时,异常值将很难处理(尽管并不需要在数据中占很大比例才能显示其影响)。当然,受污染的数据可以包含多个异常值;要测量多个异常值对RF拟合的影响,请将通过RF从未经污染的数据上获得的左侧图与通过任意移动5%响应值获得的右侧图进行比较(代码在答案下方) 。
最后,在回归环境中,必须指出,离群值可以在设计和响应空间中的大量数据中脱颖而出(1)。在RF的特定上下文中,设计异常值将影响超参数的估计。但是,当维数较大时,第二个效果更加明显。
我们在这里观察到的是更普遍结果的特殊情况。基于凸损失函数的多元数据拟合方法对异常值的极端敏感性已被重新发现多次。有关ML方法特定上下文的说明,请参见(2)。
编辑。
幸运的是,虽然基本的CART / RF算法着重于对离群值的鲁棒性不足,但有可能(且很容易实现)修改该过程,以将其对“ y”离群值的鲁棒性赋予优势。现在,我将集中讨论回归RF(因为这更是OP问题的对象)。更准确地说,将任意节点的分裂准则写为:Ť
s∗= arg最高s[ p大号VAR (Ť大号(s ))+ p[RVAR (Ť[R(s ))]
其中和是取决于的选择的新兴子节点(和是隐式函数),
表示落入左侧子节点的数据部分,而是份额的数据。然后,可以通过用健壮的替代方法替换原始定义中使用的方差函数,将“ y”空间的健壮性赋予回归树(从而得到RF)。从本质上讲,这是在(4)中使用的方法,其中方差被健壮的规模M估计器所取代。t R s ∗ t L t R s p L t L p R = 1 − p L t RŤ大号Ť[Rs∗Ť大号Ť[Rsp大号Ť大号p[R= 1 − p大号Ť[R
- (1)揭露多元离群值和杠杆点。Peter J. Rousseeuw和Bert C. van Zomeren。85,No.411(1990年9月),第633-639页
- (2)随机分类噪声击败了所有凸电位增强器。Philip M. Long和Rocco A. Servedio(2008)。http://dl.acm.org/citation.cfm?id=1390233
- (3)C. Becker和U. Gather(1999)。多元离群值识别规则的蒙版分解点。
- (4)Galimberti,G.,Pillati,M.和Soffritti,G.(2007)。基于M估计的稳健回归树。Statistica,LXVII,173-190。
library(forestFloor)
library(randomForest)
library(rgl)
set.seed(1)
X<-data.frame(replicate(2,runif(2000)-.5))
y<--sqrt((X[,1])^4+(X[,2])^4)
Col<-fcol(X,1:2) #make colour pallete by x1 and x2
#insert outlier2 and colour it black
y2<-y;Col2<-Col
y2[1:100]<-rnorm(100,200,1); #outliers
Col[1:100]="#000000FF" #black
#plot training set
plot3d(X[,1],X[,2],y,col=Col)
rf=randomForest(X,y) #RF on clean data
rg=randomForest(X,y2) #RF on contaminated data
vec.plot(rg,X,1:2,col=Col,grid.lines=200)
mean(abs(rf$predict[-c(1:100)]-y[-c(1:100)]))
mean(abs(rg$predict[-c(1:100)]-y2[-c(1:100)]))