Classificador Random Forest em Python

Conforme tenho dito nos últimos posts, estou entrando numa fase de voltar a escrever sobre Machine Learning. Logo, não poderia deixar de falar de um dos modelos que ainda vejo como um dos mais utilizados no mercado, que é a Random Forest. Se você nunca ouviu falar desse modelo, recomendo o vídeo do StatQuest Random Forest Part 1. Após ver o vídeo, volte para aprender como rodar uma random forest, como classificador, em Python!

CONTEXTUALIZANDO

Primeiramente, se você é novo, saiba que aqui você vai ter o esqueleto do código que precisa. Ou seja, você só precisará inserir seu dataset e rodar o script. Por um lado, o post é rápido e direto ao ponto. Por outro lado, não vou ficar explicando muito detalhadamente cada passo do script – embora eu vá explicar o que cada trecho faz. Sendo assim, bora pro código!

BIBLIOTECAS E TREINO/TESTE

Rodar uma random forest em Python é bem simples graças ao scikit-learn. Sendo assim, neste primeiro momento importaremos o classificador e o módulo que faz a divisão da base em treino e teste. Já aproveitaremos para fazer a divisão do seu dataset em treino e teste. Quase me esqueci de avisar, mas aqui eu assumo que você já tem as variáveis explicativas em X e a variável resposta em y (veja a linha comentada):

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
X, y, train_size=0.8, random_state=42
)

# vc deve ter seu X e y já definidos antes deste trecho. 
# Ex.: X = df['col1', 'col2']; y = df[['coln']]
TREINANDO A RANDOM FOREST

Antes de mais nada, você precisa instanciar o objeto do classificador e finalmente treinar seu modelo. É bem simples, veja só:

rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)

Em seguida, você pode aplicar o modelo treinado no teste e verificar qual o desempenho dele nestes dados ‘novos’ (não foram usados na construção do modelo):

y_pred=clf.predict(X_test)

Veja que salvamos a predição no objeto y_pred. Isto porque queremos compará-lo com y_test. Em outras palavras, queremos saber qual a diferença entre o que o modelo previu e o que realmente ocorreu. Abaixo, você obtém a acurácia, recall e matriz de confusão:

from sklearn.metrics import accuracy_score, recall_score, confusion_matrix

print(accuracy_score(y_test,y_pred))
print(recall_score(y_test,y_pred))
print(confusion_matrix(y_test,y_pred))

Novamente, note que você só precisou definir X e y até aqui. De resto, você só precisa copiar o código e correr para o abraço. Inclusive, se tiver dúvidas, não hesite em mandar um e-mail, chamar na DM do Twitter ou qualquer coisa.

TUNANDO PARÂMETROS

Bom, agora você já sabe como rodar o modelo na versão padrão. Entretanto, é interessante tunar os parâmetros. Afinal, dificilmente o modelo padrão vai ser o melhor. Não precisa ficar confuso, só estamos testando diferentes ‘coisas’ do modelo. Imagine que se você falar pro modelo que você quer que a profundidade da árvore seja menor, isso seja melhor do que uma profundidade maior. Ou limitar o número de estimadores. É isso, você está mudando os inputs do modelo, mas não as variáveis e sim os parâmetros dele. Veja abaixo um exemplo em que testamos mudanças nos inputs de 4 parâmetros:

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier

param_grid = {
    "max_depth": [4, 5, 6],
    "max_features": ["auto", "sqrt"],
    "n_estimators": [20, 50, 100]
}

cf = RandomForestClassifier()
cf_cv = GridSearchCV(estimator=cf, param_grid=param_grid, cv=3)
cf_cv.fit(X_train, y_train)

cf_cv.best_params_

A última linha se refere ao parâmetro que deu melhor resultado. No meu caso, a saída foi essa:

{'max_depth': 6,
 'max_features': 'sqrt',
 'n_estimators': 50}

O que eu preciso fazer agora é inserir isso no modelo:

rfc1=RandomForestClassifier(random_state=42, max_features='sqrt', n_estimators= 50, max_depth=6)

Se tiver dúvidas a respeito dos parâmetros, você pode descobrir quais são eles com o seguinte comando:

RandomForestClassifier().get_params().keys()
PIPELINES

Por fim, quero também mostrar um exemplo utilizando Pipelines. Já falei mais de uma vez da importância deles e aqui vou deixar um exemplo prático utilizando o dataset do enem:

# PARAMETROS DO PIPELINE (TRANSFORMACOES QUE QUEREMOS)
imputer = SimpleImputer(strategy="median")
scaler = StandardScaler()
rf = RandomForestClassifier()

# SELECAO DE VARIAVEIS
features = [
"NU_IDADE",
"TP_ESTADO_CIVIL",
"NU_NOTA_CN",
"NU_NOTA_CH",
"NU_NOTA_LC",
"NU_NOTA_MT",
"NU_NOTA_COMP1",
"NU_NOTA_COMP2",
"NU_NOTA_COMP3",
"NU_NOTA_COMP4",
"NU_NOTA_COMP5",
"NU_NOTA_REDACAO",
]

X = enem[features]
y = enem[["IN_TREINEIRO"]]

# DIVIDE EM TREINO E TESTE
X_train, X_test, y_train, y_test = train_test_split(
X, y, train_size=0.8, random_state=42
)

# CRIA PIPELINE
pipeline = make_pipeline(imputer, scaler, rf)

# PARAMETROS PARA TUNAR
pipe_params = {
"randomforestclassifier__n_estimators": [100, 500, 1000],
"randomforestclassifier__max_depth": [1, 5, 10, 25],
"randomforestclassifier__max_features": [*np.arange(0.1, 1.1, 0.1)],
}

APLICA GRIDSEARCH
gridsearch = GridSearchCV(
pipeline, param_grid=pipe_params, cv=3
)

# TREINA O MODELO PARA CHECAR QUAL MELHOR PARAMETRO
gridsearch.fit(X_train, y_train)

# SCORE DO MODELO
print(gridsearch.score(X_train, y_train))

Veja também:

E aí? Gostou do conteúdo? Se inscreva para receber as novidades! Deixe seu e-mail em INSCREVA-SE na barra à direita, logo abaixo de pesquisar. E, por favor, não deixe de comentar, dar seu feedback e, principalmente, compartilhar com seus amigos. De verdade, isso faz toda a diferença. Além disso, você também pode acompanhar mais do meu trabalho seguindo a conta de Twitter @EstatSite ou por alguma das redes que você encontra em Sobre o Estatsite / Contato, como meu canal de Youtube Canal do Yukio. E se você gosta de tecnologia, escute o Pitacotech!

Bons estudos!

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *