随机森林分类 - SciKit 与 Weka 的 100 个特征预测

Posted

技术标签:

【中文标题】随机森林分类 - SciKit 与 Weka 的 100 个特征预测【英文标题】:Random Forest Classification - SciKit vs Weka on prediction with 100 features 【发布时间】: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 【参考方案1】:

结束 cmets 中的讨论,让 *** 将此问题标记为已回答:

显然,OP 能够通过删除具有缺失值的样本并使用GridSearchCV 网格搜索最佳超参数值来达到相当的准确度。

在这种情况下,单热编码分类特征显然不会对结果产生太大影响。

【讨论】:

【参考方案2】:

我还与使用相同数据和相同配置的 Weka 和 Scikit-learn 随机森林实现有巨大的性能差异(?)。在尝试了所有可能的解决方案后,我注意到它实际上非常简单。 Weka 默认打乱数据,但 Scikit-learn 不会。即使设置了Weka的配置选项:按顺序使用数据,还是一样。所以,这就是我的处理方式。在 Scikit-learn 中使用 random_state=1(它是 Weka 中的默认值),在交叉验证器中使用 shuffle=True,在分类器中使用 bootstrap=True。它与 Weka 产生了非常相似的结果。例如。

classifier = ensemble.RandomForestClassifier(n_estimators=300,  max_depth=30, min_samples_leaf=1, min_samples_split=1, random_state=1, bootstrap=True, criterion='entropy', n_jobs=-1)

cv = StratifiedKFold(n_splits=num_folds, shuffle=True, random_state=1)
grid_search = GridSearchCV(classifier, param_grid=param_grid, cv=cv)

【讨论】:

以上是关于随机森林分类 - SciKit 与 Weka 的 100 个特征预测的主要内容,如果未能解决你的问题,请参考以下文章

[机器学习与scikit-learn-17]:算法-随机森林分类与集成算法概述

偏移随机森林分类器 scikit 学习

关于决策树和随机森林分类器(scikit)的疑问

scikit学习随机森林分类器概率阈值

scikit-learn随机森林调参小结

转载:scikit-learn随机森林调参小结