Rasgele Orman Olasılık Tahminine karşı çoğunluk oyu


10

Scikit öğrenmesi , neden olduğu hakkında bir açıklama yapmadan model toplama tekniği için çoğunluk oyu yerine olasılıksal öngörü kullanıyor gibi görünmektedir (1.9.2.1. Rastgele Ormanlar).

Nedeninin açık bir açıklaması var mı? Ayrıca Rastgele Orman torbalaması için kullanılabilecek çeşitli model toplama teknikleri için iyi bir makale veya inceleme makalesi var mı?

Teşekkürler!

Yanıtlar:


11

Bu tür sorular her zaman en iyi Python'da akıcıysanız, koda bakarak cevaplanır.

RandomForestClassifier.predict, en azından mevcut sürüm 0.16.1'de, verildiği gibi en yüksek olasılık tahminine sahip sınıfı tahmin eder predict_proba. ( bu satır )

İçin belgeler predict_probadiyor:

Bir girdi örneğinin tahmini sınıf olasılıkları, ormandaki ağaçların ortalama tahmini sınıf olasılıkları olarak hesaplanır. Tek bir ağacın sınıf olasılığı, bir yapraktaki aynı sınıftaki örneklerin oranıdır.

Orijinal yöntemin farkı muhtemelen öyle ki predicttahminler tutarlı oluyor predict_proba. Sonuç, orijinal Breiman gazetesinde kullanılan "zor" çoğunluk oyu yerine bazen "yumuşak oylama" olarak adlandırılır. Hızlı aramada iki yöntemin performansıyla uygun bir karşılaştırma bulamadım, ancak ikisi de bu durumda oldukça makul görünüyor.

predictDokümantasyon oldukça yanıltıcı iyi altındadır; Düzeltmek için bir çekme isteği gönderdim .

Bunun yerine çoğunluk oy tahminini yapmak istiyorsanız, işte bunu yapacak bir işlev var. Öyle predict_majvote(clf, X)değil de clf.predict(X). (Dayalı predict_proba; sadece hafifçe test edildi, ancak işe yaraması gerektiğini düşünüyorum.)

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

Denediğim aptal sentetik vakada, tahminler predicther zaman yöntemle anlaştı .


Harika cevap, Dougal! Bunu dikkatlice açıklamak için zaman ayırdığınız için teşekkür ederiz. Lütfen taşmayı istiflemeyi ve bu soruyu orada yanıtlamayı da düşünün .
user1745038

1
Bir kağıt, de var burada olasılıksal tahmini giderir.
user1745038
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.