我想获得比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个特征,~100 000个实例,缺失值,分类预测(价格预测)。
答案 0 :(得分:3)
结束评论中的讨论,使StackOverflow将此问题标记为已回答:
显然OP能够通过丢弃具有缺失值的样本并使用GridSearchCV
网格搜索最佳超参数值来达到可比性。
在这种情况下,单热编码分类功能显然不会对结果产生太大影响。
答案 1 :(得分: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)