我在研究中同时使用了 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 随机森林对糖尿病和声纳数据集做了另一个实验:
- 使用分层抽样将数据集分成训练集(80%)和测试集(20%)。
- 使用带放回的随机抽样将训练集过采样成大小为 1000 的平衡数据集。
- 用 50 棵树训练一个随机森林
- 在测试集上测试随机森林
- 重复步骤 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 随机森林可以直接应用于数值特征和离散特征。
谢谢大卫