랜덤 포레스트 확률 론적 예측 대 다수 투표


10

Scikit은 왜 (1.9.2.1. 랜덤 포레스트)에 대한 설명없이 모델 집계 기술에 대한 다수 투표 대신 확률 론적 예측 을 사용 하는 것으로 보입니다 .

이유에 대한 명확한 설명이 있습니까? 또한 Random Forest bagging에 사용될 수있는 다양한 모델 집계 기술에 대한 좋은 논문이나 리뷰 기사가 있습니까?

감사!

답변:


10

파이썬에 유창한 경우 이러한 질문은 항상 코드를 살펴 보는 것이 가장 좋습니다.

RandomForestClassifier.predict는 현재 버전 0.16.1 이상에서로 주어진 확률 확률이 가장 높은 클래스를 예측합니다 predict_proba. ( 이 라인 )

에 대한 설명서 predict_proba는 다음과 같습니다.

입력 샘플의 예측 된 클래스 확률은 숲에서 나무의 평균 예측 된 클래스 확률로 계산됩니다. 단일 트리의 클래스 확률은 잎에서 같은 클래스의 샘플 비율입니다.

원래 방법과의 차이는 아마도 predict예측과 일치하는 예측 을 제공 할 수 predict_proba있습니다. 그 결과는 원래 Breiman 논문에서 사용 된 "정확한"과반수 투표보다는 "소프트 투표"라고도합니다. 빠른 검색에서 두 가지 방법의 성능을 적절히 비교할 수는 없었지만이 상황에서는 둘 다 상당히 합리적입니다.

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매번 방법에 동의 했습니다.


큰 답변, Dougal! 시간을내어 신중하게 설명해 주셔서 감사합니다. 오버플로로 넘어 가서이 질문에 대답하는 것도 고려하십시오 .
user1745038

1
종이,도 있는데 여기에 확률 적 예측을 해결합니다.
user1745038
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.