Olá, Matheus!
Excelente observação! Você está correto, o BaggingClassifier com árvores de decisão como base do estimador e com o parâmetro max_features diferente de 1 é, de fato, muito similar a uma RandomForest.
No entanto, há uma diferença fundamental entre eles. Na RandomForest, cada árvore é construída a partir de uma amostra bootstrap (uma amostra aleatória com reposição do conjunto de treinamento). Além disso, ao dividir cada nó durante a construção da árvore, a melhor divisão é encontrada dentre um subconjunto aleatório dos recursos, o que é especificado pelo parâmetro max_features.
Por outro lado, no BaggingClassifier, todas as features são consideradas para a divisão de cada nó na árvore de decisão. Ou seja, o parâmetro max_features é usado para determinar a quantidade de recursos fornecidos para cada árvore, mas todas as features são consideradas para cada divisão de nó.
Em resumo, a principal diferença é que a RandomForest realiza uma busca aleatória de features para as divisões de nós, o que pode resultar em árvores mais descorrelacionadas e, consequentemente, em um modelo com menor variância. Já o BaggingClassifier considera todas as features para cada divisão de nó.
Espero ter ajudado e bons estudos!