随机森林分类 - SciKit vs Weka预测有100个特征

问题描述 投票:4回答:2

我想获得一个比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,criterion ='entropy',max_features = 40 ,max_depth = 6)。我确实有许多缺失值,scikit没有开箱即用,所以我尝试了许多不同的策略(Imputer的所有策略,跳过缺少值的实例,替换为0或极值)并达到75%。

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

你知道我错过了什么吗?

我的数据:~100个特征,~100000个实例,缺失值,分类预测(价格预测)。

weka scikit-learn random-forest
2个回答
3
投票

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

显然OP能够通过丢弃具有缺失值的样本和使用GridSearchCV搜索最佳超参数值的网格来达到可比性。

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


0
投票

我与Weka和Scikit-learn随机森林实现有着巨大的性能差异,具有相同的数据和相同的配置(?)。在尝试了所有可能的解决方案后,我注意到它实际上非常简单。 Weka在默认情况下将数据洗牌,但Scikit-learn没有。即使在设置Weka的配置选项后:按订购使用数据,它仍然是相同的。所以,这就是我处理它的方式。使用random_state = 1(它是Weka中的默认值),在Scikit中使用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)
© www.soinside.com 2019 - 2024. All rights reserved.