【发布时间】:2014-01-06 15:40:55
【问题描述】:
我想获得一个比 Weka 更快的随机森林分类器,我首先尝试了 C++ Shark 实现(结果:速度几乎没有提高,正确分类的实例下降),然后测试了 Python Scikit-learn。我在许多网站和论文上读到 Weka 与 Scikit、WiseRF 相比表现不佳......
在我第一次尝试拥有 100 棵树的森林之后:
Training time: Weka ~ 170s VS Scikit ~ 31s
Prediction results on the same test set: Weka ~ 90% correctly classified VS Scikit score ~ 45% !!!
=> Scikit RF 运行速度很快,但在第一次尝试时分类非常糟糕。
我调整了 Scikit RandomForestClassifier 的参数并设法获得接近 70% 的分数,但 scikit 的速度几乎下降到 Weka 的性能(bootstrap=False,min_samples_leaf=3,min_samples_split=1,criteria='entropy',最大特征=40,最大深度=6)。我确实有很多缺失值,而 scikit 不能开箱即用地处理它们,所以我尝试了很多不同的策略(Imputer 的所有策略,跳过缺失值的实例,替换为 0 或极值)并达到 75%。
因此,在这个阶段,Scikit RandomForestClassifier 的性能为 75%(相比之下,使用 weka 时为 90%)并在 78 秒内构建模型(使用 6 核与仅使用 1 核的 Weka 的 170 秒)。我对这些结果感到非常惊讶。我测试了 ExtraTrees,它在速度方面表现非常好,但仍然达到平均 75% 的正确分类。
你知道我错过了什么吗?
我的数据:~100 个特征、~100 000 个实例、缺失值、分类预测(价格预测)。
【问题讨论】:
-
这是回归问题还是分类问题?直觉上,价格预测听起来像是一种回归,但你说的是“90% 正确分类”之类的东西。您使用什么样的评分指标?
-
这是一个分类问题,因为价格来自费率列表。使用的评分指标很简单:正确分类的总数/实例总数。我真的不明白随机森林在准确性方面如何在 Weka 上表现得更好?我的第一个猜测是 Weka 会比任何 Scikit 缺失值策略更好地处理缺失值,但我也尝试跳过任何缺失值的实例,但我只达到了 77%(距离 weka 的 90% 还差得很远)。
-
@ogrisel 有什么想法吗?谢谢
-
可能是缺失值处理。还是某些特征是分类的,或者它们都是纯数字的?如果你有分类特征,它们的基数是什么?您是否尝试过对它们进行一次性编码,还是对它们使用整数编码?
-
获得的最优参数:bootstrap => True min_samples_leaf => 3 min_samples_split => 2 criterion => '熵' max_features => 无 max_depth => 7
标签: weka scikit-learn random-forest