Weka 随机森林和 Scikit-Learn 随机森林的区别

数据挖掘 scikit-学习 随机森林 威卡
2022-02-21 21:41:13

我在研究中同时使用了 weka 随机森林和 sklearn 随机森林,但我意识到它们使用不同的方法来结合基础学习者的预测,即决策树来做出最终预测。为了预测实例的类别,weka 随机森林使用多数投票将实例的类别预测为大多数决策树预测的类别。实例的类概率被计算为没有的分数。预测该类的树总数。随机森林的树。

sklearn 随机森林预测实例的类别如下。输入实例的预测类是在树中具有最高平均概率估计的类。输入实例的预测类别概率被计算为森林中树木的平均预测类别概率。一棵树的类概率是叶子中同一类的样本的分数。 https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.predict_proba

我认为 weka 随机森林的类别概率(多数票)是正确的,但 sklearn 随机森林的类别概率似乎不正确。因为对于sklearn随机森林,训练集的类大小决定了单棵树的类概率和随机森林的类概率。因此,从训练集中删除实例或向训练集中添加实例会改变随机森林的类概率,这似乎不正确。多数投票不受训练集类别大小的影响。

但是,weka 随机森林和 sklearn 随机森林的交叉验证性能是相似的。例如,这 2 种随机森林方法在 UCI 数据库的 5 个数据集上的 10 倍交叉验证结果如下:

数据集 weka 随机森林的 10 倍 CV AUC sklearn 随机森林的 10 倍 CV AUC
糖尿病 0.82 0.84
电离层 0.98 0.97
声纳 0.92 0.93
wdbc 0.99 0.99
光谱 0.99 0.97

我分别使用 weka 随机森林和 sklearn 随机森林对糖尿病和声纳数据集做了另一个实验:

  1. 使用分层抽样将数据集分成训练集(80%)和测试集(20%)。
  2. 使用带放回的随机抽样将训练集过采样成大小为 1000 的平衡数据集。
  3. 用 50 棵树训练一个随机森林
  4. 在测试集上测试随机森林
  5. 重复步骤 1 到 4 100 次

weka 随机森林和 sklearn 随机森林的结果在平均测试 AUC 超过 100 次方面非常相似。

数据集 weka随机森林的平均测试AUC sklearn随机森林的平均测试AUC
糖尿病 0.817 0.818
声纳 0.933 0.928

问:为什么 weka 随机森林和 sklearn 随机森林的性能相似,但它们使用不同的方法来计算输入实例的类概率?

另一个主要区别是 sklearn 随机森林不能应用于离散特征。在应用 sklearn 随机森林之前,必须通过 one-hot 编码或序数编码将离散特征转换为数字特征。Weka 随机森林可以直接应用于数值特征和离散特征。

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html#sklearn.preprocessing.OneHotEncoder

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OrdinalEncoder.html#sklearn.preprocessing.OrdinalEncoder

谢谢大卫

2个回答

对于这个问题 -

为什么 weka 随机森林和 sklearn 随机森林的性能相似,但它们使用不同的方法来计算输入实例的类概率?

通常不同的算法会有相似的结果。这并不奇怪。如果您通过 GBM 或逻辑回归(使用适当的特征工程)运行数据,您可能会得到非常相似的结果。在模型度量视图中。

数据是可分离的。许多算法会发现一些非常相似的东西。他们都在寻找分离。

但问题是你想在哪里使用模型,结果如何。例如,AUROC 可能非常相似,但 AUROC 对您要使用模型的位置和错误的相对大小不敏感。错误的大小可能是,如果您用金钱预测某事,那么在大笔交易中出错可能比在小额交易中出错要糟糕得多。有时,即使整体模型度量相同,不同的算法可能会在个别观察方面做得更好。

特定问题,例如 NLP 和图像分类,通常可以更好地使用针对该问题设计的算法。对于这些问题,具有适当架构的神经网络应该比 RF 或 GBM 更好。

关于这个主题的一篇有趣的论文是由 David J. Hand撰写的

向克雷格 +1 以回答实际问题。但我想谈谈你帖子中的另外两点。

... sklearn 随机森林的类别概率似乎不正确。因为对于sklearn随机森林,训练集的类大小决定了单棵树的类概率和随机森林的类概率。因此,从训练集中删除实例或向训练集中添加实例会改变随机森林的类概率,这似乎不正确。多数投票不受训练集类别大小的影响。

向训练集​​中删除/添加足够多的实例将打破某些叶子的平衡,从而导致随机森林的类概率也发生变化。所以 sklearn 方法只是比 weka 方法“更连续”。这两种方法有时被称为“软”和“硬”投票,例如,这两种方法都可以在VotingClassifiersklearn 类中使用。我怀疑大多数时候最终结果是相似的,尽管请注意,在高度不平衡的环境中,每棵树的硬投票可能永远不会产生少数类,因此软投票可能更适合作为提出的一种方式无偏概率。

另一个主要区别是 sklearn 随机森林不能应用于离散特征。在应用 sklearn 随机森林之前,必须通过 one-hot 编码或序数编码将离散特征转换为数字特征。Weka 随机森林可以直接应用于数值特征和离散特征。

这种差异实际上有两层。首先是两个主要树算法的历史发展,CART 和 Quinlan 家族(ID3 然后是 C4.5 和 C5.0)。Quinlan 家谱通过为每个类别创建一个孩子来拆分类别特征,而 CART 总是生成二叉树。但是,有一些 CART 的实现可以在没有编码的情况下生成分类数据的二进制分割;区别的第二层是 sklearn 没有在随机森林中实现。他们确实在他们的HistGradientBoosting类中实现了分类拆分,大概在某个时候也会被移植到随机森林设置中。