Случайный лесной вероятностный прогноз против большинства голосов

10

Кажется, Scikit Learn использует вероятностный прогноз вместо большинства голосов за метод агрегации моделей без объяснения причин (1.9.2.1. Случайные леса).

Есть четкое объяснение почему? Кроме того, есть ли хорошая статья или обзорная статья о различных методах агрегации моделей, которые можно использовать для рандомизации по лесам?

Спасибо!

user1745038
источник

Ответы:

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каждый раз согласовывались с методом.

Дугал
источник
Отличный ответ, Дугал! Спасибо, что нашли время, чтобы объяснить это внимательно. Пожалуйста, рассмотрите возможность перехода к переполнению стека и ответа на этот вопрос .
user1745038
1
Там также бумага, здесь , в котором рассматриваются вероятностные предсказания.
user1745038