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



我想得到一个比Weka更快的随机森林分类器,我首先尝试了C++ Shark实现(结果:速度改进很少,正确分类的实例下降),然后测试了Python Scikit-learn。我在许多网站和报纸上读到,与Scikit,WiseRF相比,Weka的表现很差......

在我第一次尝试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',max_features=40,max_depth=6)。我确实有很多缺失值,scikit 不会开箱即用地处理它们,所以我尝试了许多不同的策略(Imputer 的所有策略,跳过具有缺失值的实例,替换为 0 或极值)并达到了 75%。

因此,在这个阶段,Scikit RandomForestClassifier的性能为75%(而weka为90%),并在78s内构建模型(使用6个内核与170s,只有1个内核使用Weka)。我对这些结果感到非常惊讶。我测试了ExtraTrees,它在速度方面表现非常好,但仍然达到了平均75%的正确分类。

你知道我错过了什么吗?

我的数据:~100 个

特征,~100 000 个实例,缺失值,分类预测(价格预测)。

评论中结束讨论以使 StackOverflow 将此问题标记为已回答:

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

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

我与

具有相同数据和相同配置(?)的Weka和Scikit-learn随机森林实现也有很大的性能差异。在尝试了所有可能的解决方案后,我注意到它实际上非常简单。Weka默认打乱数据,但Scikit-learn不会。即使设置了Weka的配置选项:按顺序使用数据,它仍然是一样的。所以,这是我的处理方式。使用 random_state=1(这是 Weka 中的默认值),shuffle=True 在 Scikit-learn 中用于交叉验证器,引导程序=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)

相关内容

  • 没有找到相关文章

最新更新