Conjunto de Cadeias de Classificadores

Beginner

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

Introdução

Este laboratório demonstra um exemplo de utilização de cadeias de classificadores num conjunto de dados multirótulo. O algoritmo de Cadeia de Classificadores é uma modificação do método de transformação de problemas para classificação multirótulo. Este método explora a correlação entre as classes construindo uma cadeia de classificadores binários. Cada modelo recebe as previsões dos modelos precedentes na cadeia como características. Usaremos o conjunto de dados yeast, que contém 2417 pontos de dados, cada um com 103 características e 14 rótulos possíveis. Cada ponto de dados tem pelo menos um rótulo. Como linha de base, primeiro treinamos um classificador de regressão logística para cada um dos 14 rótulos. Para avaliar o desempenho destes classificadores, prevemos num conjunto de teste reservado e calculamos a pontuação Jaccard para cada amostra.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, 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 a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Carregar o conjunto de dados yeast

X, Y = fetch_openml("yeast", version=4, return_X_y=True, parser="pandas")
Y = Y == "TRUE"
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

Treinar um modelo de regressão logística independente para cada classe

base_lr = LogisticRegression()
ovr = OneVsRestClassifier(base_lr)
ovr.fit(X_train, Y_train)
Y_pred_ovr = ovr.predict(X_test)
ovr_jaccard_score = jaccard_score(Y_test, Y_pred_ovr, average="samples")

Treinar um conjunto de classificadores de cadeia de regressão logística

chains = [ClassifierChain(base_lr, order="random", random_state=i) for i in range(10)]
for chain in chains:
    chain.fit(X_train, Y_train)

Y_pred_chains = np.array([chain.predict(X_test) for chain in chains])
chain_jaccard_scores = [
    jaccard_score(Y_test, Y_pred_chain >= 0.5, average="samples")
    for Y_pred_chain in Y_pred_chains
]

Calcular a previsão média de todas as cadeias

Y_pred_ensemble = Y_pred_chains.mean(axis=0)
ensemble_jaccard_score = jaccard_score(
    Y_test, Y_pred_ensemble >= 0.5, average="samples"
)

Plotar as pontuações de similaridade Jaccard

model_scores = [ovr_jaccard_score] + chain_jaccard_scores
model_scores.append(ensemble_jaccard_score)

model_names = (
    "Independente",
    "Cadeia 1",
    "Cadeia 2",
    "Cadeia 3",
    "Cadeia 4",
    "Cadeia 5",
    "Cadeia 6",
    "Cadeia 7",
    "Cadeia 8",
    "Cadeia 9",
    "Cadeia 10",
    "Conjunto",
)

x_pos = np.arange(len(model_names))

fig, ax = plt.subplots(figsize=(7, 4))
ax.grid(True)
ax.set_title("Comparação de Desempenho do Conjunto de Cadeias de Classificadores")
ax.set_xticks(x_pos)
ax.set_xticklabels(model_names, rotation="vertical")
ax.set_ylabel("Pontuação de Similaridade Jaccard")
ax.set_ylim([min(model_scores) * 0.9, max(model_scores) * 1.1])
colors = ["r"] + ["b"] * len(chain_jaccard_scores) + ["g"]
ax.bar(x_pos, model_scores, alpha=0.5, color=colors)
plt.tight_layout()
plt.show()

Resumo

Este laboratório demonstrou como usar o algoritmo Classifier Chain para construir um conjunto de cadeias de classificadores de regressão logística para explorar correlações entre as classes. A pontuação de similaridade Jaccard para cada cadeia tende a ser maior do que a do conjunto de modelos logísticos independentes. Finalmente, construímos um conjunto de votação de cadeias de classificadores, calculando a média das previsões binárias das cadeias e aplicando um limiar de 0,5. A pontuação de similaridade Jaccard do conjunto foi maior do que a dos modelos independentes e tendeu a exceder a pontuação de cada cadeia no conjunto.