Introdução
Neste laboratório, iremos percorrer um processo passo a passo de implementação da Eliminação Recursiva de Recursos com Validação Cruzada (RFECV) utilizando o scikit-learn. O RFECV é usado para seleção de recursos, que é o processo de seleção de um subconjunto de recursos relevantes para uso na construção de modelos. Usaremos uma tarefa de classificação com 15 recursos, dos quais 3 são informativos, 2 são redundantes e 10 são não informativos.
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 esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se tiver problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.
Geração de Dados
Vamos gerar uma tarefa de classificação utilizando a função make_classification do scikit-learn. Vamos gerar 500 amostras com 15 recursos, dos quais 3 são informativos, 2 são redundantes e 10 são não informativos.
from sklearn.datasets import make_classification
X, y = make_classification(
n_samples=500,
n_features=15,
n_informative=3,
n_redundant=2,
n_repeated=0,
n_classes=8,
n_clusters_per_class=1,
class_sep=0.8,
random_state=0,
)
Treinamento e Seleção do Modelo
Criaremos o objeto RFECV e calculamos as pontuações validadas cruzadamente. A estratégia de pontuação "accuracy" otimiza a proporção de amostras classificadas corretamente. Usaremos regressão logística como estimador e validação cruzada estratificada k-fold com 5 dobras.
from sklearn.feature_selection import RFECV
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import LogisticRegression
min_features_to_select = 1 ## Número mínimo de recursos a considerar
clf = LogisticRegression()
cv = StratifiedKFold(5)
rfecv = RFECV(
estimator=clf,
step=1,
cv=cv,
scoring="accuracy",
min_features_to_select=min_features_to_select,
n_jobs=2,
)
rfecv.fit(X, y)
print(f"Número ótimo de recursos: {rfecv.n_features_}")
Plot number of features vs. cross-validation scores
We will plot the number of features selected against the cross-validation scores. We will use matplotlib to create the plot.
import matplotlib.pyplot as plt
n_scores = len(rfecv.cv_results_["mean_test_score"])
plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Mean test accuracy")
plt.errorbar(
range(min_features_to_select, n_scores + min_features_to_select),
rfecv.cv_results_["mean_test_score"],
yerr=rfecv.cv_results_["std_test_score"],
)
plt.title("Recursive Feature Elimination \nwith correlated features")
plt.show()
Resumo
Neste laboratório, percorremos o processo de implementação da Eliminação Recursiva de Recursos com Validação Cruzada (RFECV) usando o scikit-learn. Geramos uma tarefa de classificação com 15 recursos, dos quais 3 eram informativos, 2 redundantes e 10 não informativos. Usamos regressão logística como estimador e validação cruzada estratificada k-fold com 5 dobras. Plotamos o número de recursos selecionados contra as pontuações de validação cruzada. Descobrimos que o número ótimo de recursos era 3, o que correspondia ao verdadeiro modelo gerador. Também notamos um platô de pontuações equivalentes para 3 a 5 recursos selecionados devido à introdução de recursos correlacionados.