Iterações de Redução Sucessiva

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, aprenderá a utilizar o método de busca por redução sucessiva para iterativamente selecionar a melhor combinação de parâmetros entre múltiplos candidatos. Este método é implementado nas classes HalvingGridSearchCV e HalvingRandomSearchCV da biblioteca Scikit-learn. A classe HalvingRandomSearchCV será utilizada neste laboratório.

Dicas da Máquina Virtual

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário aguardar alguns segundos para o Jupyter Notebook terminar o carregamento. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Importando Bibliotecas Necessárias

As seguintes bibliotecas serão utilizadas neste laboratório: pandas, numpy, matplotlib, sklearn.datasets, RandomForestClassifier, randint e HalvingRandomSearchCV. Importe-as utilizando o código seguinte:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from scipy.stats import randint
from sklearn.experimental import enable_halving_search_cv
from sklearn.model_selection import HalvingRandomSearchCV

Carregando o Conjunto de Dados

A função make_classification do módulo sklearn.datasets é utilizada para gerar um conjunto de dados de classificação. O conjunto de dados contém 400 amostras com 12 características. O código para carregar o conjunto de dados é o seguinte:

rng = np.random.RandomState(0)
X, y = datasets.make_classification(n_samples=400, n_features=12, random_state=rng)

Definindo o Espaço de Parâmetros

Defina um dicionário param_dist que contém os hiperparâmetros e seus respectivos valores para serem pesquisados. Os hiperparâmetros são max_depth, max_features, min_samples_split, bootstrap e criterion. O intervalo de busca para max_features e min_samples_split é definido usando a função randint do módulo scipy.stats. O código para definir o espaço de parâmetros é o seguinte:

param_dist = {
    "max_depth": [3, None],
    "max_features": randint(1, 6),
    "min_samples_split": randint(2, 11),
    "bootstrap": [True, False],
    "criterion": ["gini", "entropy"],
}

Crie um objeto HalvingRandomSearchCV para pesquisar no espaço de parâmetros. O objeto recebe os seguintes argumentos:

  • estimator: o estimador a ser otimizado
  • param_distributions: o espaço de parâmetros a ser pesquisado
  • factor: o fator pelo qual o número de candidatos é reduzido em cada iteração
  • random_state: o estado aleatório usado para a pesquisa

O código para criar o objeto é o seguinte:

clf = RandomForestClassifier(n_estimators=20, random_state=rng)
rsh = HalvingRandomSearchCV(
    estimator=clf, param_distributions=param_dist, factor=2, random_state=rng
)

Ajuste o objeto HalvingRandomSearchCV aos dados usando o método fit. O código para ajustar o objeto é o seguinte:

rsh.fit(X, y)

Analisando os Resultados

O atributo cv_results_ do objeto de pesquisa contém os resultados da pesquisa. Converta-o em um DataFrame pandas usando o código a seguir:

results = pd.DataFrame(rsh.cv_results_)

A coluna params_str é criada convertendo a coluna params para uma string. Remova as linhas duplicadas que possuem os mesmos valores para params_str e iter:

results["params_str"] = results.params.apply(str)
results.drop_duplicates(subset=("params_str", "iter"), inplace=True)

As pontuações médias de teste são então pivotadas em relação ao número da iteração e à combinação de parâmetros usando o método pivot:

mean_scores = results.pivot(
    index="iter", columns="params_str", values="mean_test_score"
)

Finalmente, plote as pontuações médias de teste ao longo das iterações usando o código a seguir:

ax = mean_scores.plot(legend=False, alpha=0.6)

labels = [
    f"iter={i}\nn_samples={rsh.n_resources_[i]}\nn_candidates={rsh.n_candidates_[i]}"
    for i in range(rsh.n_iterations_)
]

ax.set_xticks(range(rsh.n_iterations_))
ax.set_xticklabels(labels, rotation=45, multialignment="left")
ax.set_title("Pontuações dos candidatos ao longo das iterações")
ax.set_ylabel("pontuação média de teste", fontsize=15)
ax.set_xlabel("iterações", fontsize=15)
plt.tight_layout()
plt.show()

Interpretação dos Resultados

O gráfico mostra as pontuações médias de teste dos candidatos ao longo das iterações. Na primeira iteração, todos os candidatos são avaliados com uma pequena quantidade de recursos. Na segunda iteração, apenas a metade melhor dos candidatos é avaliada com o dobro da quantidade de recursos. Este processo é repetido até a última iteração, onde apenas 2 candidatos restam. O melhor candidato é aquele com a maior pontuação média de teste na última iteração.

Resumo

Neste laboratório, aprendeu como utilizar o método de busca sucessiva por redução para selecionar iterativamente a melhor combinação de parâmetros entre vários candidatos. A classe HalvingRandomSearchCV da biblioteca Scikit-learn foi utilizada para implementar o método de busca. Os resultados da busca foram analisados e interpretados através de um gráfico das pontuações médias de teste ao longo das iterações.