Sempre é melhor responder a essas perguntas olhando o código, se você é fluente em Python.
RandomForestClassifier.predict
, pelo menos na versão atual 0.16.1, prevê a classe com maior estimativa de probabilidade, conforme fornecido por predict_proba
. ( esta linha )
A documentação para predict_proba
diz:
As probabilidades de classe previstas de uma amostra de entrada são calculadas como as probabilidades médias de classe previstas das árvores na floresta. A probabilidade de classe de uma única árvore é a fração de amostras da mesma classe em uma folha.
A diferença do método original é provavelmente apenas para predict
fornecer previsões consistentes predict_proba
. O resultado às vezes é chamado de "votação branda", em vez do voto majoritário "rígido" usado no documento original de Breiman. Na pesquisa rápida, não consegui encontrar uma comparação apropriada do desempenho dos dois métodos, mas ambos parecem razoáveis nessa situação.
A predict
documentação é, na melhor das hipóteses, bastante enganadora; Enviei uma solicitação pull para corrigi-la.
Se você deseja fazer a predição por maioria dos votos, aqui está uma função para fazê-lo. Chame como predict_majvote(clf, X)
antes clf.predict(X)
. (Baseado em predict_proba
; apenas levemente testado, mas acho que deve funcionar.)
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
No caso sintético idiota que eu tentei, as previsões concordavam com o predict
método todas as vezes.