Випадкові лісові ймовірнісні прогнози проти більшості голосів


10

Здається, Scikit використовує ймовірнісне прогнозування замість більшості голосів для методики моделювання агрегації без пояснення того, чому (1.9.2.1. Випадкові ліси).

Чи є чітке пояснення чому? Далі є хороша стаття чи огляд статей для різних методів агрегації моделей, які можна використовувати для випадкового розпалювання лісу?

Дякую!

Відповіді:


10

На такі питання завжди найкраще відповідати, дивлячись на код, якщо ви добре володієте Python.

RandomForestClassifier.predict, принаймні, у поточній версії 0.16.1, прогнозує клас з найбільшою оцінкою ймовірності, як дано predict_proba. ( цей рядок )

Документація для predict_proba:

Передбачувані ймовірності класу вхідного зразка обчислюються як середні прогнозовані ймовірності класів дерев у лісі. Імовірність класу одного дерева - частка зразків одного класу в листі.

Відмінність від початкового методу, ймовірно, якраз така, що predictдає прогнози, які відповідають predict_proba. Результат іноді називають "м'яким голосуванням", а не "жорстким" голосом більшості, який використовується в оригінальній статті Бреймана. Я не зміг у швидкому пошуку знайти відповідного порівняння ефективності двох методів, але вони обидва здаються досить розумними в цій ситуації.

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методом щоразу.


Чудова відповідь, Дугал! Дякуємо, що знайшли час для ретельного пояснення цього питання. Будь ласка, подумайте також про те, щоб скласти переповнення та відповісти на це питання там .
користувач1745038

1
Там також папір, тут , в якому розглядаються імовірнісні передбачення.
користувач1745038
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.