RandomForest - MDS 图解释

机器算法验证 r 分类 随机森林 多维尺度
2022-01-29 14:06:10

我使用 randomForest 根据 8 个变量(不同的身体姿势和运动)对 6 种动物行为(例如站立、行走、游泳等)进行分类。

randomForest 包中的 MDSplot 给了我这个输出,我在解释结果时遇到了问题。我对相同的数据进行了 PCA,并且已经在 PC1 和 PC2 中的所有类之间得到了很好的分离,但是这里的 Dim1 和 Dim2 似乎只是分离了 3 个行为。这是否意味着这三种行为比所有其他行为更不相似(因此 MDS 试图找到变量之间的最大差异,但不一定是第一步中的所有变量)?三个集群的定位(例如在 Dim1 和 Dim2 中)表明了什么?由于我对 RI 还很陌生,因此在为该图绘制图例时也遇到了问题(但是我知道不同颜色的含义),但也许有人可以提供帮助?非常感谢!!

6 种不同动物行为的 RandomForest MDSplot

我在 RandomForest 中添加了一个使用 ClassCenter 函数制作的图。此函数还使用邻近矩阵(与 MDS 图中相同)来绘制原型。但是仅仅通过查看六种不同行为的数据点,我无法理解为什么邻近矩阵会像它那样绘制我的原型。我还尝试了使用 iris 数据的 classcenter 函数,它可以工作。但它似乎不适用于我的数据......

这是我用于此图的代码

be.rf <- randomForest(Behaviour~., data=be, prox=TRUE, importance=TRUE)
class1 <- classCenter(be[,-1], be[,1], be.rf$prox)
Protoplot <- plot(be[,4], be[,7], pch=21, xlab=names(be)[4], ylab=names(be)[7], bg=c("red", "green", "blue", "yellow", "turquoise", "orange") [as.numeric(factor(be$Behaviour))])
points(class1[,4], class1[,7], pch=21, cex=2, bg=c("red", "green", "blue", "yellow", "turquoise", "orange"))

我的类列是第一个,然后是 8 个预测变量。我将两个最佳预测变量绘制为 x 和 y。

用于 6 种不同动物行为的 RandomForest ClassCenter 图

1个回答

函数 MDSplot 绘制邻近矩阵的(PCA)。从 randomForest 的文档中,接近矩阵是:

输入之间的邻近度量矩阵(基于数据点对在相同终端节点中的频率)。

根据这个描述,我们可以猜测不同的图是什么意思。您似乎指定了 k=4,这意味着将邻近矩阵分解为 4 个分量。对于该图矩阵中的每个条目 (i,j),绘制的是沿维度 i 的 PCA 分解与沿维度 j 的 PCA 分解。

我对相同的数据进行了 PCA,并且已经在 PC1 和 PC2 中的所有类之间得到了很好的分离,但是这里的 Dim1 和 Dim2 似乎只是分离了 3 个行为。这是否意味着这三种行为比所有其他行为更不相似(因此 MDS 试图找到变量之间的最大差异,但不一定是第一步中的所有变量)?

MDS 只能根据您的 randomForest 的输出进行分析。如果您期望更好的分离,那么您可能需要检查 randomForest 的分类性能。要记住的另一件事是,您的 PCA 是从 9 维数据映射到 2 维,但 MDS 是从 NxN 维接近矩阵映射到 2 维,其中 N 是数据点的数量。

三个集群的定位(例如在 Dim1 和 Dim2 中)表明了什么?

它只是告诉您这些集群彼此相距多远(相对)。这是一个可视化辅助工具,所以我不会过度解释它。

由于我对 RI 还很陌生,因此在为该图绘制图例时也遇到了问题(但是我知道不同颜色的含义),但也许有人可以提供帮助?

R 的工作方式,没有办法在事后绘制图例(不像在说 Matlab 中,此信息存储在图形对象中)。但是,查看 MDSplot 的代码,我们看到相关的代码块是:

palette <- if (require(RColorBrewer) && nlevs < 12) brewer.pal(nlevs, "Set1")

...

plot(rf.mds$points, col = palette[as.numeric(fac)], pch = pch, ...)

因此颜色将从该调色板中获取,并以您给它们的任何顺序映射到级别(行为)。所以如果你想绘制一个图例:

legend(x,y,levels(fac),col=brewer.pal(nlevs, 'Set1'), pch=pch)

可能会工作。