Sobreamostragem Aleatória e Subamostragem para Classificação Desequilibrada

Tweet Share Share

Última atualização em 5 de janeiro de 2021

Dados desequilibrados são aqueles em que há uma grave distorção na distribuição de classes, tais como 1:100 ou 1:1000 exemplos na classe minoritária para a classe majoritária.

Este viés no conjunto de dados de treinamento pode influenciar muitos algoritmos de aprendizagem de máquinas, levando alguns a ignorar completamente a classe minoritária. Este é um problema, pois normalmente é a classe minoritária na qual as previsões são mais importantes.

Uma abordagem para abordar o problema do desequilíbrio de classe é fazer uma nova amostragem aleatória do conjunto de dados de treinamento. As duas principais abordagens para fazer uma resamostragem aleatória de um conjunto de dados desequilibrado são eliminar exemplos da classe majoritária, chamada subamostragem, e duplicar exemplos da classe minoritária, chamada sobreamostragem.

Neste tutorial, você descobrirá sobreamostragem aleatória e sub-amostragem para classificação de desequilíbrio

Após completar este tutorial, você saberá:

  • Reamostragem aleatória fornece uma técnica ingênua para reequilibrar a distribuição de classes para um conjunto de dados desequilibrado.
  • Amostras aleatórias duplicam exemplos da classe minoritária no conjunto de dados de treinamento e podem resultar em sobreajustes para alguns modelos.
  • Amostras aleatórias eliminam exemplos da classe majoritária e podem resultar na perda de informações inestimáveis para um modelo.

Pick start your project with my new book Imbalanced Classification with Python, including step-by-step tutorials and the Python source code files for all examples.

Let’s get started.

  • Updated Jan/2021: Links atualizados para a documentação da API.
Sobre amostragem e subamostragem aleatória para classificação desequilibrada

Sobre amostragem e subamostragem aleatória para classificação desequilibrada
Foto de RichardBH, alguns direitos reservados.

Síntese tutorial

Este tutorial está dividido em cinco partes; elas são:

  1. Dados de Amostragem Aleatória Desequilibrada
  2. Desequilibrada…Biblioteca de aprendizagem
  3. Dados de sobreamostragem aleatória
  4. Dados de subamostragem aleatória
  5. Combinação de sobreamostragem e subamostragem aleatória

Dados de subamostragem aleatória

Reamostragem envolve a criação de uma nova versão transformada do conjunto de dados de treinamento na qual os exemplos selecionados têm uma distribuição de classe diferente.

Esta é uma estratégia simples e eficaz para problemas de classificação desequilibrada.

Aplicar estratégias de reamostragem para obter uma distribuição de dados mais equilibrada é uma solução eficaz para o problema do desequilíbrio

– Uma Pesquisa de Modelação Preditiva sob Distribuições Desequilibradas, 2015.

A estratégia mais simples é escolher exemplos para o conjunto de dados transformados aleatoriamente, chamados de reamostragem aleatória.

Há duas abordagens principais à reamostragem aleatória para classificação de desequilíbrios; são a sobreamostragem e a sub-amostragem.

  • Sobreamostragem aleatória: Exemplos duplicados aleatoriamente na classe minoritária.
  • Subamostragem aleatória: Apagar exemplos aleatoriamente na classe minoritária.

Sobreamostragem aleatória envolve selecionar aleatoriamente exemplos da classe minoritária, com substituição, e adicioná-los ao conjunto de dados de treinamento. A sub-amostragem aleatória envolve a seleção aleatória de exemplos da classe majoritária e sua exclusão do conjunto de dados de treinamento.

Na sub-amostragem aleatória, as instâncias da classe majoritária são descartadas aleatoriamente até atingir uma distribuição mais equilibrada.

– Página 45, Aprendizagem Desequilibrada: Foundations, Algorithms, and Applications, 2013

As duas abordagens podem ser repetidas até que a distribuição de classes desejada seja alcançada no conjunto de dados de treinamento, como uma divisão igual entre as classes.

São referidos como métodos de “re-amostragem ingênua” porque não assumem nada sobre os dados e nenhuma heurística é utilizada. Isso os torna simples de implementar e rápidos de executar, o que é desejável para conjuntos de dados muito grandes e complexos.

Algumas técnicas podem ser usadas para problemas de classificação de duas classes (binárias) e problemas de classificação multiclasse com uma ou mais classes majoritárias ou minoritárias.

Importante, a mudança na distribuição de classes só é aplicada ao conjunto de dados de treinamento. A intenção é influenciar o ajuste dos modelos. A reamostragem não é aplicada ao conjunto de dados de teste ou de retenção usado para avaliar o desempenho de um modelo.

Geralmente, esses métodos ingênuos podem ser eficazes, embora isso dependa das especificidades do conjunto de dados e modelos envolvidos.

Vejamos mais de perto cada método e como utilizá-los na prática.

Biblioteca de aprendizagem desequilibrada

Nestes exemplos, vamos usar as implementações fornecidas pela biblioteca Python de aprendizagem desequilibrada, que pode ser instalada via pip da seguinte forma:

>1
sudo pip install imbalanced-learn

Você pode confirmar que a instalação foi bem sucedida imprimindo a versão da biblioteca instalada:

>1
2
3

# verificar número da versão
importar imblearn
imprimir(imblearn.__version__)

Executar o exemplo imprimirá o número da versão da biblioteca instalada; por exemplo:

1
0.5.0

Quer começar com a Classificação do Desequilíbrio?

Faça agora o meu curso crash de 7 dias grátis por e-mail (com código de amostra).

Clique para se inscrever e também obter uma versão PDF Ebook grátis do curso.

Download Your FREE Mini-Course

Dados Desequilibrados de Amostragem Aleatória

Amostragem aleatória envolve a duplicação aleatória de exemplos da classe minoritária e a sua adição ao conjunto de dados de treinamento.

Exemplos do conjunto de dados de treinamento são selecionados aleatoriamente com substituição. Isto significa que os exemplos da classe minoritária podem ser escolhidos e adicionados ao novo conjunto de dados de treinamento “mais equilibrado” várias vezes; eles são selecionados do conjunto de dados de treinamento original, adicionados ao novo conjunto de dados de treinamento, e então retornados ou “substituídos” no conjunto de dados original, permitindo que sejam selecionados novamente.

Esta técnica pode ser eficaz para aqueles algoritmos de aprendizagem da máquina que são afetados por uma distribuição distorcida e onde múltiplos exemplos duplicados para uma determinada classe podem influenciar o ajuste do modelo. Isso pode incluir algoritmos que iterativamente aprendem coeficientes, como redes neurais artificiais que usam descida de gradiente estocástico. Também pode afetar modelos que buscam boas divisões de dados, como máquinas vetoriais de suporte e árvores de decisão.

Pode ser útil afinar a distribuição da classe alvo. Em alguns casos, buscar uma distribuição equilibrada para um conjunto de dados severamente desequilibrado pode fazer com que os algoritmos afetados se sobreponham à classe minoritária, levando a um aumento do erro de generalização. O efeito pode ser melhor desempenho no conjunto de dados de treinamento, mas pior desempenho no conjunto de dados de retenção ou teste.

… a sobreamostragem aleatória pode aumentar a probabilidade de ocorrer sobreajuste, uma vez que faz cópias exatas dos exemplos da classe minoritária. Desta forma, um classificador simbólico, por exemplo, pode construir regras que são aparentemente precisas, mas na verdade cobrem um exemplo replicado.

– Página 83, Aprendendo com conjuntos de dados desequilibrados, 2018.

– Como tal, para obter uma visão do impacto do método, é uma boa idéia monitorar o desempenho em ambos os conjuntos de dados do trem e do teste após a sobreamostragem e comparar os resultados com o mesmo algoritmo no conjunto de dados original.

O aumento do número de exemplos para a classe minoritária, especialmente se a inclinação da classe foi severa, também pode resultar em um aumento acentuado no custo computacional ao ajustar o modelo, especialmente considerando que o modelo está vendo os mesmos exemplos no conjunto de dados de treinamento novamente e novamente.

… em sobreamostragem aleatória, um conjunto aleatório de cópias de exemplos de classe minoritária é adicionado aos dados. Isto pode aumentar a probabilidade de sobreajustamento, especialmente para maiores taxas de sobreamostragem. Além disso, pode diminuir o desempenho do classificador e aumentar o esforço computacional.

– Uma Pesquisa de Modelagem Preditiva sob Distribuições Desequilibradas, 2015.

A sobreamostragem aleatória pode ser implementada usando a classe RandomOverSampler.

A classe pode ser definida e toma um argumento de estratégia de amostragem que pode ser definido como “minoritário” para equilibrar automaticamente a classe minoritária com a classe ou classes majoritárias.

Por exemplo:

1
2
3

# definir estratégia de sobreamostragem
sobreamostragem = RandomOverSampler(sampling_strategy=’minority’)

Isto significa que se a classe majoritária tivesse 1.000 exemplos e a classe minoritária tivesse 100, esta estratégia iria sobreamostragem da classe minoritária de modo a ter 1.000 exemplos.

Um valor de ponto flutuante pode ser especificado para indicar a proporção de exemplos majoritários da classe minoritária no conjunto de dados transformados. Por exemplo:

1
2
3

# Definir estratégia de sobreamostragem
Sobreamostra = RandomOverSampler(sampling_strategy=0,5)

Isso garantiria que a classe minoritária fosse sobreamostragem para ter metade do número de exemplos como a classe majoritária, para problemas de classificação binária. Isto significa que se a classe majoritária tivesse 1.000 exemplos e a classe minoritária tivesse 100, o conjunto de dados transformado teria 500 exemplos da classe minoritária.

A classe é como um objeto de transformação scikit-learn em que se encaixa em um conjunto de dados, então usado para gerar um conjunto de dados novo ou transformado. Ao contrário da transformação scikit-learn, ela mudará o número de exemplos no conjunto de dados, não apenas os valores (como um escalador) ou o número de características (como uma projeção).

Por exemplo, ele pode ser ajustado e aplicado em um passo chamando a função fit_sample():

1
2

3

# encaixar e aplicar a transformação
X_over, y_over = oversample.fit_resample(X, y)

Podemos demonstrar isto num simples problema de classificação binária sintética com um desequilíbrio de classe 1:100.

1
2
3

# definir conjunto de dados
X, y = make_classification(n_samples=10000, weights=, flip_y=0)

O exemplo completo de definição do conjunto de dados e realização de sobreamostragem aleatória para equilibrar a distribuição de classes está listado abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

>

# exemplo de sobreamostragem aleatória para equilibrar a distribuição de classes
do contador de importação de colecções
do sklearn.datasets import make_classification
de imblearn.over_sampling import RandomOverSampler
# definir conjunto de dados
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# resumo da distribuição de classes
print(Counter(y))
# definir estratégia de sobreamostragem
sobreamostra = RandomOverSampler(sampling_strategy=’minority’)
# encaixar e aplicar a transformação
X_over, y_over = sobreamostra.fit_resample(X, y)
# resumir distribuição de classes
> print(Counter(y_over))

Executar o exemplo primeiro cria o conjunto de dados, depois resume a distribuição de classes. Podemos ver que existem quase 10K exemplos na classe majoritária e 100 exemplos na classe minoritária.

Então, a transformação aleatória da sobreamostra é definida para equilibrar a classe minoritária, em seguida, encaixar e aplicar ao conjunto de dados. A distribuição de classe para o conjunto de dados transformado é relatada mostrando que agora a classe minoritária tem o mesmo número de exemplos que a classe majoritária.

2

Contra({0: 9900, 1: 100})
Contra({0: 9900, 1: 9900})

>

Esta transformação pode ser usada como parte de um Pipeline para garantir que só é aplicada ao conjunto de dados de treinamento como parte de cada divisão em uma validação cruzada k-fold.

Um Pipeline de aprendizagem tradicional não pode ser usado; em vez disso, um Pipeline da biblioteca de aprendizagem desequilibrada pode ser usado. Por exemplo:

1
2
3
4

>

# pipeline
passos =
pipeline = Pipeline(passos=passos)

O exemplo abaixo fornece um exemplo completo de avaliação de uma árvore de decisão sobre um conjunto de dados desequilibrado com uma distribuição de classe 1:100.

O modelo é avaliado usando a validação cruzada repetida de 10 vezes com três repetições, e a sobreamostragem é realizada no conjunto de dados de treinamento dentro de cada dobra separadamente, garantindo que não haja vazamento de dados como poderia ocorrer se a sobreamostragem fosse realizada antes da validação cruzada.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>16
17
18

# exemplo de avaliação de uma árvore de decisão com sobreamostragem aleatória
da média de importação numérica
da sklearn.importação de conjuntos de dados make_classification
de sklearn.model_selection importação cross_val_score
de sklearn.model_selection importação repeatStratifiedKFold
de sklearn.tree importação DecisionTreeClassifier
de imblearn.pipeline importação Pipeline
de imblearn.over_sampling import RandomOverSampler
# definir conjunto de dados
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# definir pipeline
passos =
pipeline = Pipeline(steps=steps)
# avaliar pipeline
# definir pipeline
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
score = mean(scores)
print(‘F1 Score: %.3f’ % pontuação)

Executar o exemplo avalia o modelo da árvore de decisão no conjunto de dados desequilibrado com sobreamostragem.

O modelo escolhido e a configuração de re-amostragem são arbitrários, concebidos para fornecer um modelo que você pode usar para testar a sub-amostragem com o seu conjunto de dados e algoritmo de aprendizagem, em vez de resolver de forma ideal o conjunto de dados sintéticos.

Nota: Seus resultados podem variar, dada a natureza estocástica do algoritmo ou procedimento de avaliação, ou diferenças na precisão numérica. Considere executar o exemplo algumas vezes e compare o resultado médio.

É utilizada a estratégia padrão de sobreamostragem, que equilibra as classes minoritárias com a classe majoritária. A pontuação F1 média em cada dobra e cada repetição é relatada.

1
F1 Pontuação: 0.990

Agora estamos familiarizados com a sobreamostragem, vamos dar uma olhada na sub-amostragem.

Dados de sub-amostragem aleatórios

Amostras aleatórias envolve a seleção aleatória de exemplos da classe majoritária para excluir do conjunto de dados de treinamento.

Isso tem o efeito de reduzir o número de exemplos da classe majoritária na versão transformada do conjunto de dados de treinamento. Este processo pode ser repetido até que a distribuição de classe desejada seja alcançada, como um número igual de exemplos para cada classe.

Esta abordagem pode ser mais adequada para aqueles conjuntos de dados onde há um desequilíbrio de classe, embora um número suficiente de exemplos na classe minoritária, tal modelo útil pode ser ajustado.

Uma limitação da subamostragem é que os exemplos da classe majoritária são excluídos que podem ser úteis, importantes, ou talvez críticos para ajustar um limite de decisão robusto. Como os exemplos são excluídos aleatoriamente, não há como detectar ou preservar exemplos “bons” ou mais ricos em informações da classe majoritária.

… na sub-amostragem aleatória (potencialmente), grandes quantidades de dados são descartadas. Isso pode ser altamente problemático, pois a perda desses dados pode tornar a fronteira de decisão entre instâncias minoritárias e majoritárias mais difícil de aprender, resultando em uma perda no desempenho da classificação.

– Página 45, Aprendizagem Desequilibrada: Foundations, Algorithms, and Applications, 2013

A técnica de sub-amostragem aleatória pode ser implementada usando a classe RandomUnderSampler imbalanced-learn.

A classe pode ser usada exatamente como a classe RandomOverSampler na seção anterior, exceto que as estratégias impactam a classe majoritária em vez da classe minoritária. Por exemplo, definir o argumento sampling_strategy para “majority” irá subamostra a classe majoritária determinada pela classe com o maior número de exemplos.

1
2
3

# definir estratégia de subamostra
subamostra = RandomUnderSampler(sampling_strategy=’majority’)

Por exemplo, um conjunto de dados com 1.000 exemplos na classe majoritária e 100 exemplos na classe minoritária será subamostragem de tal forma que ambas as classes teriam 100 exemplos no conjunto de dados de treinamento transformado.

Também podemos definir o argumento de estratégia de amostragem para um valor de ponto flutuante que será uma porcentagem relativa à classe minoritária, especificamente o número de exemplos na classe minoritária dividido pelo número de exemplos na classe majoritária. Por exemplo, se definirmos a estratégia de amostragem como 0,5 em um conjunto de dados desequilibrado com 1.000 exemplos na classe majoritária e 100 exemplos na classe minoritária, então haveria 200 exemplos para a classe majoritária no conjunto de dados transformado (ou 100/200 = 0.5).

1
2
3

# definir a estratégia da sub-amostra
undersample = RandomUnderSampler(sampling_strategy=0.5)

Esta opção pode ser preferida para assegurar que o conjunto de dados resultante seja suficientemente grande para caber num modelo razoável, e que não seja descartada muita informação útil da classe maioritária.

Na sub-amostragem aleatória, pode-se tentar criar uma distribuição de classe balanceada selecionando 90 instâncias de classe majoritária ao acaso para serem removidas. O conjunto de dados resultante consistirá então em 20 instâncias: 10 (aleatoriamente restantes) instâncias de classe majoritária e (o original) 10 instâncias de classe minoritária.

– Página 45, Aprendizagem Desequilibrada: Foundations, Algorithms, and Applications, 2013

A transformação pode então ser cabida e aplicada a um conjunto de dados em um passo chamando a função fit_resample() e passando o conjunto de dados nãotransformado como argumentos.

1
2
3

# caber e aplicar a transformação
X_over, y_over = undersample.fit_resample(X, y)

Podemos demonstrar isto num conjunto de dados com um desequilíbrio de classe 1:100.

O exemplo completo está listado abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# exemplo de subamostragem aleatória para equilibrar a distribuição de classes
do contador de importação de colecções
do sklearn.datasets import make_classification
de imblearn.under_sampling import RandomUnderSampler
# definir conjunto de dados
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# resumo da distribuição de classes
print(Counter(y))
# definir a estratégia da subamostra
subamostra = RandomUnderSampler(sampling_strategy=’majority’)
# ajustar e aplicar a transformação
X_over, y_over = undersample.fit_resample(X, y)
# resumir a distribuição de classes
> print(Counter(y_over))

Executar o exemplo primeiro cria o conjunto de dados e relata a distribuição de classe desequilibrada.

A transformação é ajustada e aplicada no conjunto de dados e a nova distribuição de classe é relatada. Podemos ver que essa classe majoritária é subamostra para ter o mesmo número de exemplos que a classe minoritária.

Judgmento e resultados empíricos terão que ser usados para saber se um conjunto de dados de treinamento com apenas 200 exemplos seria suficiente para treinar um modelo.

>1
2

Conta({0: 9900, 1: 100})
Conta({0: 100, 1: 100})

Esta transformada de sub-amostragem também pode ser utilizada num Pipeline, tal como a transformada de sub-amostragem da secção anterior.

Esta permite que a transformação seja aplicada ao conjunto de dados de treinamento somente utilizando esquemas de avaliação, como a validação cruzada k-fold, evitando qualquer vazamento de dados na avaliação de um modelo.

1
2
3
4

# definir pipeline
passos =
pipeline = Pipeline(passos=passos)

Podemos definir um exemplo de ajuste de uma árvore de decisão num conjunto de dados de classificação desequilibrada com a transformação de subamostragem aplicada ao conjunto de dados de treino em cada divisão de uma validação cruzada repetida de 10 vezes.

O exemplo completo está listado abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# exemplo de avaliação de uma árvore de decisão com sub-amostragem aleatória
da média de importação numérica
da sklearn.dataets import make_classification
de sklearn.model_selection import cross_val_score
de sklearn.model_selection import repeatStratifiedKFold
de sklearn.tree import DecisionTreeClassifier
de imblearn.pipeline import Pipeline
de imblearn.under_sampling import RandomUnderSampler
# definir conjunto de dados
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# definir pipeline
passos =
pipeline = Pipeline(steps=steps)
# avaliar pipeline
# definir pipeline
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
score = mean(scores)
print(‘F1 Score: %.3f’ % pontuação)

>

Executar o exemplo avalia o modelo da árvore de decisão no conjunto de dados desequilibrado com sub-amostragem.

O modelo escolhido e a configuração de re-amostragem são arbitrários, concebidos para fornecer um modelo que você pode usar para testar a sub-amostragem com o seu conjunto de dados e algoritmo de aprendizagem, em vez de resolver de forma ideal o conjunto de dados sintéticos.

Nota: Seus resultados podem variar, dada a natureza estocástica do algoritmo ou procedimento de avaliação, ou diferenças na precisão numérica. Considere executar o exemplo algumas vezes e compare o resultado médio.

É utilizada a estratégia padrão de sub-amostragem, que equilibra as classes majoritárias com a classe minoritária. A pontuação F1 média em cada dobra e cada repetição é relatada.

1
F1 Pontuação: 0.889

Combinação de sobreamostragem e subamostragem aleatórias

Resultados de interesse podem ser obtidos combinando sobreamostragem e subamostragem aleatórias.

Por exemplo, uma quantidade modesta de sobreamostragem pode ser aplicada à classe minoritária para melhorar o viés em relação a estes exemplos, enquanto também se aplica uma quantidade modesta de subamostragem à classe majoritária para reduzir o viés nessa classe.

Isso pode resultar na melhoria do desempenho geral em comparação à execução de uma ou outra técnica isoladamente.

Por exemplo, se tivéssemos um conjunto de dados com uma distribuição de classe 1:100, poderíamos primeiro aplicar a sobreamostragem para aumentar a proporção para 1:10 duplicando exemplos da classe minoritária, depois aplicar a subamostragem para melhorar ainda mais a proporção para 1:2 eliminando exemplos da classe majoritária.

Isso poderia ser implementado usando o método de desaprendizagem por desequilíbrio, usando um RandomOverSampler com a estratégia sampling_strategy definida para 0,1 (10%), depois usando um RandomUnderSampler com a estratégia sampling_strategy definida para 0,5 (50%). Por exemplo, o RandomOverSampler:

1
2
3
4
5
6
7
8
9

# definir estratégia de sobreamostragem
over = RandomOverSampler(sampling_strategy=0,1)
# ajustar e aplicar a transformação
X, y = over.fit_resample(X, y)
# definir estratégia de subamostragem
under = RandomUnderSampler(sampling_strategy=0.5)
# ajuste e aplique a transformação
X, y = under.fit_resample(X, y)

Podemos demonstrar isto num conjunto de dados sintéticos com uma distribuição de classe 1:100. O exemplo completo está listado abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>18
19
20
21

# exemplo de combinação de sobreamostragem aleatória e subamostragem para dados desequilibrados
do contador de importação de colecções
do sklearn.importação de conjuntos de dados make_classification
de imblearn.over_sampling importação de RandomOverSampler
de imblearn.under_sampling import RandomUnderSampler
# define conjunto de dados
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# resume a distribuição de classes
print(Counter(y))
# definir estratégia de sobreamostragem
over = RandomOverSampler(sampling_strategy=0.1)
# ajustar e aplicar a transformação
X, y = over.fit_resample(X, y)
# resumo da distribuição de classes
impressão(Contador(y))
# definir estratégia de sub-amostragem
under = RandomUnderSampler(sampling_strategy=0.5)
# encaixar e aplicar a transformação
X, y = under.fit_resample(X, y)
# resumir distribuição de classes
imprimir(Counter(y))

Executar o exemplo primeiro cria o conjunto de dados sintéticos e resume a distribuição de classe, mostrando uma distribuição de classe aproximada de 1:100.

Então é aplicada a sobreamostragem, aumentando a distribuição de cerca de 1:100 para cerca de 1:10. Finalmente, sub-amostragem é aplicada, melhorando ainda mais a distribuição de classe de 1:10 para cerca de 1:2

1
2
3

Contra({0: 9900, 1: 100})
Counter({0: 9900, 1: 990})
Counter({0: 1980, 1: 990})

Tal vez, também podemos querer aplicar esta mesma abordagem híbrida ao avaliar um modelo usando a validação cruzada k-fold.

Isto pode ser conseguido usando um Pipeline com uma sequência de transformações e terminando com o modelo que está sendo avaliado; por exemplo:

1
2
3
4
5
6

# definir pipeline
sobre = RandomOverSampler(sampling_strategy=0.1)
under = RandomUnderSampler(sampling_strategy=0.5)
passos =
pipeline = Pipeline(passos=passos)

Podemos demonstrar isto com um modelo de árvore de decisão no mesmo conjunto de dados sintéticos.

O exemplo completo está listado abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>18
19
20
21

# exemplo de avaliação de um modelo com sobreamostragem aleatória e sub-amostragem
a partir da média de importação numérica
a partir do sklearn.datasets import make_classification
da sklearn.model_selection import cross_val_score
da sklearn.model_selection import repeatStratifiedKFold
da sklearn.importação de árvore DecisionTreeClassifier
de imblearn.pipeline import Pipeline
de imblearn.over_sampling import RandomOverSampler
de imblearn.pipeline import.under_sampling import RandomUnderSampler
# define conjunto de dados
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# define pipeline
over = RandomOverSampler(sampling_strategy=0.1)
under = RandomUnderSampler(sampling_strategy=0.5)
passos =
pipeline = Pipeline(steps=steps)
# avaliar pipeline
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
score = mean(scores)
print(‘F1 Score: %.3f’ % pontuação)

Executar o exemplo avalia um modelo de árvore de decisão usando a validação cruzada de repetição k-fold onde o conjunto de dados de treinamento é transformado, primeiro usando sobreamostragem, depois sub-amostragem, para cada divisão e repetição executada. A média da pontuação F1 em cada dobra e cada repetição é relatada.

Nota: Seus resultados podem variar, dada a natureza estocástica do algoritmo ou procedimento de avaliação, ou diferenças na precisão numérica. Considere executar o exemplo algumas vezes e compare o resultado médio.

O modelo escolhido e a configuração de re-amostragem são arbitrários, projetados para fornecer um modelo que você pode usar para testar a sub-amostragem com seu conjunto de dados e algoritmo de aprendizagem, em vez de resolver de forma ótima o conjunto de dados sintéticos.

>1
F1 Pontuação: 0.985

Outra Leitura

Esta secção fornece mais recursos sobre o tópico se você estiver procurando ir mais fundo.

Livros

  • Capítulo 5 Métodos de Pré-processamento de Dados, Aprendendo com Conjuntos de Dados Desequilibrados, 2018.
  • Capítulo 3 Conjuntos de Dados Desequilibrados: Da Amostragem aos Classificadores, Aprendizado Desequilibrado: Foundations, Algorithms, and Applications, 2013.

Paper

  • Estudo do comportamento de vários métodos para balancear dados de treinamento de aprendizagem de máquinas, 2004.
  • Levantamento de Modelagem Preditiva em Distribuições Desequilibradas, 2015.

API

  • Documentação de Aprendizado Desequilibrado.
  • Aprendizado Desequilibrado, GitHub.
  • imblearn.over_sampling.RandomOverSampler API.
  • imblearn.pipeline.Pipeline API.
  • imblearn.under_sampling.RandomUnderSampler API.

Artigos

  • Sobreamostragem e sub-amostragem na análise de dados, Wikipedia.

Resumo

Neste tutorial, você descobriu a sobreamostragem aleatória e a sub-amostragem para classificação de desequilíbrio

Especificamente, você aprendeu:

  • Reamostragem aleatória fornece uma técnica ingênua para reequilibrar a distribuição de classes para um conjunto de dados desequilibrado.
  • Amostras aleatórias duplicam exemplos da classe minoritária no conjunto de dados de treinamento e podem resultar em sobreajustes para alguns modelos.
  • Amostras aleatórias elimina exemplos da classe minoritária e pode resultar na perda de informação inestimável para um modelo.

Você tem alguma dúvida?
Solicite suas dúvidas nos comentários abaixo e eu farei o meu melhor para responder.

Controle a Classificação Desequilibrada!

 Classificação Desequilibrada com Python

Desenvolver Modelos de Aprendizagem Desequilibrada em Minutos

…com apenas algumas linhas de código python

Descubra como no meu novo Ebook:
Classificação Desequilibrada com Python

Provê tutoriais de auto-estudo e projetos ponta a ponta em:
Métricas de Desempenho, Métodos de Subamostragem, SMOTE, Movimento de Limiar, Calibração de Probabilidade, Algoritmos Sensíveis ao Custo
e muito mais…

Bring Imbalanced Classification Methods to Your Machine Learning Projects

See What’s Inside

Tweet Share Share

Deixe uma resposta

O seu endereço de email não será publicado.