На такие вопросы всегда лучше всего ответить, посмотрев код, если вы свободно владеете 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
каждый раз согласовывались с методом.