b84f-4778-e9ef-7fa4ceb1f42d"
# %%time
aml.train(x = df.columns[1:-1],
          y = "went_on_backorder", 
          training_frame = df
          )

# + [markdown] id="eBo3ujHzwrVn" colab_type="text"
#
#
# ---
#
#
#
# ---
#
#

# + [markdown] id="0zmKwxpkxPXu" colab_type="text"
# ## Comparando modelos

# + [markdown] id="ACOQcjwktQhD" colab_type="text"
# Na mesma documentação, você encontrará que o AutoML só trabalha com algoritmos "top de linha", e a verdade é que você **não precisa se preocupar por enquanto**, como esses modelos funcionam a fundo.
#
# 1. Random Forest (**DRF**)
# 2. Extremely-Randomized Forest (**DRF/XRT**)
# 3. Generalized Linear Models (**GLM**)
# 4. XGBoost (**XGBoost**)
# 5. Gradient Boosting Machines (**GBM**)
# 6. Deep Neural Nets (**DeepLearning**)
# 7. **Stacked Ensembles**: One of all the models
# 8. **Stacked Ensembles**: Only the best models of each kind

# + [markdown] id="a-wJ2Dh21B2i" colab_type="text"
# > Através do comando *get_leaderboard()* podemos visualizar uma tabela de resultado, e como o esperado os modelos de **StackedEnsemble**, tiveram a melhor performance em relacao ao **AUC**, mas é interessante também reparar na coluna *training_time_ms*.
#
#
# A termo de comparação o melhor modelo individual *XGBoost_model_1* é quase **4x mais lento** que que o *GBM_grid_model_3*, por uma diferenca de AUC de.948 vs.944, quase **insignificante**, dependendo da sua aplicação podemos preferir um ou outro.
#
#
# Obs: É importate frisar que os modelos *StackedEnsemble* usam as **predições dos outros modelos com entrada**, então na prática deveriam ter esse tempo acrescido ao seu tempo de processamento.
#
#

# + id="G0c2sMbfcV2j" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 586} outputId="324d9a91-d939-4594-ed98-6c79fc3dfaa0"
h2o.automl.get_leaderboard(aml, extra_columns = 'training_time_ms').head(30)

# + [markdown] id="8ocsjxi1zZ8n" colab_type="text"
# Por outro lado os modelos de DeepLearing não tiveram boa performance, além de demandarem muito tempo de processamento.

# + [markdown] id="zzzIhRI342r6" colab_type="text"
# > Algumas desvantagens dessa abordagem são:
#
#
#
# 1.  **Valores Nulos**: Alguns desses modelos como os de árvores, são robustos a valor nulo, porém outros como o GLM exigem que algum valor seja exigido, e não fica claro se o H2O usou a mesma abordagem em todos os modelos ou se possui uma técnica específica para cada família de modelos.
# 2.  **Categóricos**: Não se foi utiizado *One-Hot-Encoding*, *Label-Encoding* ou outra técnica para esse fim.

# + [markdown] id="e84AqAuz1eGW" colab_type="text"
#
#
# ---
#
#
#
# ---
#
#

# + [markdown] id="4WDLPvoVqlQY" colab_type="text"
# ## Avaliando o melhor modelo

# + [markdown] id="SQDdmuQ0q5O_" colab_type="text"
# > Uma vez que temos um modelo em mãos, podemos inclusive analisar mais a fundo suas previsões. Contudo o H2O gera **muitas informações** que **não são relevantes** para o problema em questão, então é importante saber os **conceitos** para interpretar a saída do modelo,

# + id="iYjzsp5iqBF2" colab_type="code" colab={}
# Get model ids for all models in the AutoML Leaderboard
model_ids = list(aml.leaderboard['model_id'].as_data_frame().iloc[:,0])
# Get the "All Models" Stacked Ensemble model
best = h2o.get_model([mid for mid in model_ids if "XGBoost_3_AutoML" in mid][0])

# + id="HWS9BTlUn5z8" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 1000} outputId="bde63b9a-5ac3-494c-80d2-af76b134121e"
best

# + [markdown] id="lnRFYixFqCHF" colab_type="text"
#
#
# ---
#
#
#
# ---
#
#

# + [markdown] id="AdHjcjzgx9qq" colab_type="text"
# ## Salvando o modelo
#
# Pronto!
#
# Apenas com alguns comandos (e muitos conceitos!!) ja estamos prontos para **serializar** o nosso **melhor modelo** no formato MOJO (padrão do H2O), e colocá-lo em produção se for o caso.

# + id="hrLvJ-IvyBzF" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 35} outputId="887ccd5e-ece4-4591-80fa-071820c152db"
h2o.save_model(best, path = "./model_bin")

# + [markdown] id="TM1W5JW533t-" colab_type="text"
# Se quiser baixar o modelo

# + id="4Iqy2hGryB9C" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 35} outputId="34542bfc-7463-44a2-a23b-94992dda5611"
best.download_mojo(path = "./")

# + [markdown] id="oPqBZxuMx0pu" colab_type="text"
#
#
# ---
#
#
#
# ---
#
#

# + [markdown] id="BFs8sC2w2CvD" colab_type="text"
# # Considerações

# + [markdown] id="jdmlkJ8Z68Xl" colab_type="text"
# Vimos que o H2O é uma ferramenta bastante poderosa, e pode nos poupar muitas horas de trabalho, mas ainda é essencial termos os conceitos muito bem assimilados para que se consiga fazer uma interpretação razoável.
#
# Um cientista de dados experiênte também poderia realizar essas tarefas em um tempo relativamente curto com *sklearn* ou equivalente, mantendo ainda uma maior flexibilidade. Contudo o H2O pode apontar o melhor caminho, trabalhando em segundo plano enquanto você executa outras tarefas do seu dia a dia.

# + [markdown] id="yKYAceTp7d4F" colab_type="text"
# Fontes:
#
# 1.   https://medium.com/data-hackers/automated-machine-learning-automl-70c1eab669ad
# 2.   https://www.youtube.com/watch?v=cMlZqpXsk