scikit-learn RandomForestClassifier概率预测与多数投票

时间:2014-11-13 00:26:00

标签: scikit-learn

section 1.9.2.1中的scikit-learn文档中(摘录见下文),为什么随机森林的实现与Breiman的原始论文有所不同?据我所知,Breiman选择了多数投票(模式)进行分类和平均回归(由Liaw和Wiener编写的论文,原始R代码的维护者,下面引用了下文)汇总了集合。分类

  1. 为什么scikit-learn使用概率预测而不是多数投票?
  2. 使用概率预测有什么优势吗?
  3. 有问题的部分:

      

    与原始出版物[B2001]相比,scikit-learn   实现通过平均其概率来组合分类器   预测,而不是让每个分类器投票给一个人   类。

    资料来源:Liaw,A。,& Wiener,M。(2002)。 randomForest的分类和回归。 R news,2(3),18-22。

2 个答案:

答案 0 :(得分:1)

Breiman在Bagging预测器(http://statistics.berkeley.edu/sites/default/files/tech-reports/421.pdf)中对此进行了研究。

这给出了几乎相同的结果,但使用软投票可以提供更平滑的概率。请注意,如果您使用完全开发的树,则没有任何区别。

答案 1 :(得分:1)

这个问题现在已经answered on Cross Validated了。此处包含以供参考:

  

通过查看代码,这些问题总能得到最好的回答   你能熟练掌握Python。

     

>>> Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/doug/Projects/my_project/src/test/test_foo.py", line 1, in <module> from my_project import foo ImportError: No module named 'my_project' >>> ,至少在当前版本中   0.16.1,预测具有最高概率估计的类,由RandomForestClassifier.predict给出。 (this line

     

predict_proba的文档说:

     
    

输入样本的预测类概率被计算为森林中树木的平均预测类概率。该     单个树的类概率是样本的一部分     叶子里的同一个班级。

  
     

与原始方法的区别可能就是这样   predict_proba提供与predict一致的预测。该   结果有时被称为&#34;软投票&#34;而不是&#34;硬&#34;   在布莱曼原始论文中使用的多数票。我不能快速   搜索找到两者的性能的适当比较   方法,但在这种情况下它们似乎都相当合理。

     

predict_proba文档充其量是误导性的;我&#39;已经   已提交a pull request   解决它。

     

如果你想做多数投票预测,那么这就是一个功能   去做吧。称之为predict而不是predict_majvote(clf, X)   clf.predict(X)。 (基于predict_proba;仅经过轻微测试,但是   我认为它应该有用。)

from scipy.stats import mode
from sklearn.ensemble.forest import _partition_estimators, _parallel_helper
from sklearn.tree._tree import DTYPE
from sklearn.externals.joblib import Parallel, delayed
from sklearn.utils import check_array
from sklearn.utils.validation import check_is_fitted

def predict_majvote(forest, X):
    """Predict class for X.

    Uses majority voting, rather than the soft voting scheme
    used by RandomForestClassifier.predict.

    Parameters
    ----------
    X : array-like or sparse matrix of shape = [n_samples, n_features]
        The input samples. Internally, it will be converted to
        ``dtype=np.float32`` and if a sparse matrix is provided
        to a sparse ``csr_matrix``.
    Returns
    -------
    y : array of shape = [n_samples] or [n_samples, n_outputs]
        The predicted classes.
    """
    check_is_fitted(forest, 'n_outputs_')

    # Check data
    X = check_array(X, dtype=DTYPE, accept_sparse="csr")

    # Assign chunk of trees to jobs
    n_jobs, n_trees, starts = _partition_estimators(forest.n_estimators,
                                                    forest.n_jobs)

    # Parallel loop
    all_preds = Parallel(n_jobs=n_jobs, verbose=forest.verbose,
                         backend="threading")(
        delayed(_parallel_helper)(e, 'predict', X, check_input=False)
        for e in forest.estimators_)

    # Reduce
    modes, counts = mode(all_preds, axis=0)

    if forest.n_outputs_ == 1:
        return forest.classes_.take(modes[0], axis=0)
    else:
        n_samples = all_preds[0].shape[0]
        preds = np.zeros((n_samples, forest.n_outputs_),
                         dtype=forest.classes_.dtype)
        for k in range(forest.n_outputs_):
            preds[:, k] = forest.classes_[k].take(modes[:, k], axis=0)
        return preds
     

在我试过的愚蠢的合成案例中,预测同意了   每次predict方法。