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

标签: weka scikit-learn random-forest


【解决方案1】:

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

显然,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)
    

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 2013-09-22
      • 2017-04-24
      • 2019-01-28
      • 2014-08-07
      • 2015-03-28
      • 2020-05-16
      • 2015-12-16
      相关资源
      最近更新 更多