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:
- Regressão Linear no Python
- Regressão Logística em Python
- Introdução aos Pipelines no Scikit-Learn
- Pipeline usando Scikit-Learn: Exemplos Práticos
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!