Pontuação de Teste de Permutação para Classificação

Beginner

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

Introdução

Em aprendizagem de máquina, frequentemente avaliamos o desempenho de um modelo de classificação usando uma pontuação. No entanto, também precisamos testar a significância da pontuação para garantir que o desempenho do modelo não seja apenas por acaso. É aqui que entra o teste de permutação de pontuação. Ele gera uma distribuição nula calculando a precisão do classificador em 1000 permutações diferentes do conjunto de dados. Um valor p empírico é então calculado como a percentagem de permutações para as quais a pontuação obtida é maior que a pontuação obtida usando os dados originais. Neste laboratório, usaremos a função permutation_test_score de sklearn.model_selection para avaliar a significância de uma pontuação validada cruzadamente usando permutações.

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 praticar.

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 e gerar recursos aleatórios

Usaremos o conjunto de dados iris, que consiste em medições de 3 tipos de íris, e geraremos alguns dados de recursos aleatórios (ou seja, 20 recursos), não correlacionados com as etiquetas de classe no conjunto de dados iris.

from sklearn.datasets import load_iris
import numpy as np

iris = load_iris()
X = iris.data
y = iris.target

n_uncorrelated_features = 20
rng = np.random.RandomState(seed=0)
X_rand = rng.normal(size=(X.shape[0], n_uncorrelated_features))

Pontuação do Teste de Permutação nos Dados Originais

Em seguida, calculamos a permutation_test_score usando o conjunto de dados iris original e o classificador SVC com a pontuação accuracy para avaliar o modelo em cada rodada.

from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import permutation_test_score

clf = SVC(kernel="linear", random_state=7)
cv = StratifiedKFold(2, shuffle=True, random_state=0)

score_iris, perm_scores_iris, pvalue_iris = permutation_test_score(
    clf, X, y, scoring="accuracy", cv=cv, n_permutations=1000
)

Pontuação do Teste de Permutação em Dados Aleatórios

Em seguida, calculamos a permutation_test_score usando os recursos aleatoriamente gerados e as etiquetas de classe do conjunto de dados iris, que teoricamente não devem apresentar dependência entre os recursos e as etiquetas.

score_rand, perm_scores_rand, pvalue_rand = permutation_test_score(
    clf, X_rand, y, scoring="accuracy", cv=cv, n_permutations=1000
)

Plotar os Resultados

Plotamos um histograma das pontuações de permutação (a distribuição nula) para o conjunto de dados iris original e os dados aleatorizados. Também indicamos a pontuação obtida pelo classificador nos dados originais usando uma linha vermelha. O valor p é exibido em cada gráfico.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

## Dados originais
ax.hist(perm_scores_iris, bins=20, density=True)
ax.axvline(score_iris, ls="--", color="r")
score_label = f"Pontuação nos dados\noriginais: {score_iris:.2f}\n(valor-p: {pvalue_iris:.3f})"
ax.text(0.7, 10, score_label, fontsize=12)
ax.set_xlabel("Pontuação de precisão")
_ = ax.set_ylabel("Densidade de probabilidade")

plt.show()

fig, ax = plt.subplots()

## Dados aleatórios
ax.hist(perm_scores_rand, bins=20, density=True)
ax.set_xlim(0.13)
ax.axvline(score_rand, ls="--", color="r")
score_label = f"Pontuação nos dados\noriginais: {score_rand:.2f}\n(valor-p: {pvalue_rand:.3f})"
ax.text(0.14, 7.5, score_label, fontsize=12)
ax.set_xlabel("Pontuação de precisão")
ax.set_ylabel("Densidade de probabilidade")

plt.show()

Resumo

Neste laboratório, aprendemos a utilizar a função permutation_test_score do módulo sklearn.model_selection para avaliar a significância de uma pontuação validada cruzadamente usando permutações. Gerámos uma distribuição nula calculando a precisão do classificador em 1000 permutações diferentes do conjunto de dados e calculamos um valor p empírico como a percentagem de permutações para as quais a pontuação obtida é superior à pontuação obtida utilizando os dados originais. Também representámos os resultados para visualizar a distribuição nula e a pontuação obtida nos dados originais.