2013-12-18 74 views
4

我想要得到比Weka更快的随机森林分类器,我首先尝试了C++ Shark实现(结果:几乎没有速度改进,放入正确的分类实例),然后测试了Python Scikit-learn。我读了很多网站和严重相比Scikit,WiseRF是Weka的执行文件...随机森林分类 - SciKit vs Weka预测100个特征

我第一次尝试后与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核心vs 170s,而Weka只有1个核心)。我对这些结果感到非常惊讶。我测试了ExtraTrees,在速度方面表现非常好,但仍达到75%的正确分类平均值。

你有什么想法我失踪?我的数据:〜100个特征,〜100 000个实例,缺失值,分类预测(价格预测)。

+1

这是回归还是分类问题?直观的价格预测听起来像一个回归,但你正在谈论的东西,如“90%正确分类”。你使用什么样的评分指标? – ogrisel

+0

这是一个分类问题,因为价格来自费率列表。评分指标使用简单:总分类正确/总实例。我真的不明白Random Forest在Weka上的准确性如何更好?我的第一个猜测是,Weka处理缺失值比任何Scikit缺失值策略更好,但我也尝试跳过任何缺少值的实例,但我只达到77%(仍远离weka的90%)。 – doxav

+0

@ogrisel任何想法?谢谢 – doxav

回答

2

结束语在评论中讨论做出的StackOverflow纪念这一问题的回答:

显然OP能够通过缺失值和网格搜索最优超参数值与GridSearchCV下降样本达到相当的精度。

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

0

我也有Weka和Scikit学习随机森林实现具有相同的数据和相同的配置(?)巨大的性能差异。在尝试了所有可能的解决方案之后,我注意到它实际上非常简单。 Weka在默认情况下洗牌数据,但Scikit-learn没有。即使在设置Weka的配置选项之后:按照有序使用数据,它仍然是相同的。所以,这是我如何处理它。使用random_state = 1(它是Weka中的默认值),在交叉验证器的Scikit-learn中,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) 
相关问题