การทำนายความน่าจะเป็นป่าแบบสุ่มเทียบกับคะแนนโหวตส่วนใหญ่


10

Scikit เรียนรู้ดูเหมือนว่าจะใช้การทำนายความน่าจะเป็นแทนการลงคะแนนเสียงข้างมากสำหรับเทคนิคการรวมตัวแบบโดยไม่มีการอธิบายว่าทำไม (1.9.2.1. ป่าสุ่ม)

มีคำอธิบายที่ชัดเจนว่าเพราะเหตุใด นอกจากนี้ยังมีบทความหรือบทความทบทวนที่ดีสำหรับเทคนิคการรวมตัวแบบต่างๆที่สามารถนำมาใช้สำหรับการบรรจุถุงแบบฟอเรสต์?

ขอบคุณ!

คำตอบ:


10

คำถามดังกล่าวมักตอบได้ดีที่สุดโดยดูที่รหัสถ้าคุณพูดภาษา Python ได้ดี

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.