如何使用 Breiman 的代码执行无监督的随机森林分类?

机器算法验证 机器学习 分类 随机森林
2022-03-17 13:29:24

我正在使用 Breiman 的随机森林代码 ( http://stat-www.berkeley.edu/users/breiman/RandomForests/cc_manual.htm#c2 ) 对卫星数据进行分类(监督学习)。我正在使用一个样本大小为 2000 且可变大小为 10 的训练和测试数据集。数据分为两类,A 和 B。在监督学习模式下,算法表现良好,分类误差非常低(<2%) . 现在我想尝试在测试数据集中没有类标签的无监督分类,看看该算法如何能够预测类。有没有办法使用 Breiman 的代码实现无监督分类?这种方法的误差会高于监督分类吗?算法中的数据和运行参数设置如下

描述数据 1 mdim=10,ntrain=2000,nclass=2,maxcat=1, 1 ntest=2000,labelts=1,labeltr=1,

设置运行参数 2 mtry0=3,ndsize=1,jbt=500,look=100,lookcls=1, 2 jclasswt=0,mdim2nd=0,mselect=0,

3个回答

我怀疑无人监督会更好,但这可能是一个很酷的尝试。使用随机森林的无监督学习是通过根据您的自变量构建一个联合分布来完成的,该变量大致描述了您的数据。然后使用此分布模拟一定数量的观察。例如,如果您有 1000 个观察值,则可以再模拟 1000 个。然后给它们贴上标签,例如 1:= 真实观察,0:= 模拟观察。在此之后,您运行一个通常的随机森林分类器,试图将真实观察结果与模拟观察结果区分开来。请注意,您必须打开计算邻近度选项。真正有用的输出正是这个,即基于随机森林在尝试分配这些标签时所做的观察之间的接近度描述。你现在有一个描述如何“ 我的意思是将比某个阈值更接近的观察结果粘在一起。另一个简单的选择是进行层次聚类,但使用这个特定的距离矩阵。如果您可以使用 R,大多数层次聚类包都允许您为函数提供自定义距离矩阵。然后您选择一个截止点,您可以将其可视化为树状图等等。我的意思是将比某个阈值更接近的观察结果粘在一起。另一个简单的选择是进行层次聚类,但使用这个特定的距离矩阵。如果您可以使用 R,大多数层次聚类包都允许您为函数提供自定义距离矩阵。然后您选择一个截止点,您可以将其可视化为树状图等等。

曾经是一个非常好的关于随机森林聚类的教程,他们分享了一些他们为此目的编写的有用的 R 函数,但现在链接似乎已经失效了。也许它会在稍后恢复。如果您想检查一下,他们还编写了一个非常简洁的随机 glm R 包(类似于随机森林,但基于 duh...glms)。您可以随时写信给作者,索要过去在死链接上可用的随机森林分类材料。我有R代码,但是太大了不能贴在这里,如果你给我发私信我可以发给你。

如果您想在无人监督的环境中使用随机森林,您将专注于在 Breiman 所谓的“接近度”中获得的距离度量。这应该是一个 NxN 矩阵,表示样本在终端节点中同时出现的时间。在 R 的 randomForest 中,这是通过(我从未使用过 Breiman 的但我确信它可用)获得的:

rf = randomForest( ... )
1 - rf$proximities

现在,在无监督的环境中,随机森林不知道应该有多少类,所以这将是你的工作。这可以通过多种方式完成,例如,KNN、PAM 等,您选择 k = 2。

可以想象,这是一个完全不同的有监督随机森林,因此比较两个过程之间的分类准确度可能没有启发性。

鉴于您的模型表现出良好的准确性,您可以使用它来预测未标记数据集中记录的类标签。但是,您无法评估未标记数据的性能。

请注意,您应该通过交叉验证来评估模型在标记数据上的质量。仅检查训练错误率是不够的。

如果您的模型不够准确,您可能会考虑半监督学习未标记的数据用于通过归纳学习提高模型的质量。准确性应始终通过对标记数据的交叉验证来计算。

看看 [Crimisini 等人。决策森林:分类、回归、密度估计、流形学习和半监督学习的统一框架] 第 7 章关于半监督学习,第 7.4 章关于半监督学习的归纳。