Pour l'apprentissage automatique, il est souhaitable d'avoir le même nombre d'échantillons entre les classes. Cependant, en réalité, non seulement de telles données propres, mais aussi des données avec différents nombres d'échantillons entre les classes sont souvent utilisées.
Cette fois, notez que le processus d'alignement du nombre d'échantillons entre les classes décrites dans les données d'étiquette a été implémenté en Python.
Lorsqu'il y a le tableau de données suivant et ses données d'étiquette
#Tableau de données
data = np.array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
#Tableau d'étiquettes
label = np.array([0, 0, 1, 1, 1, 2, 2, 2, 2, 2])
###############
#Traitement de l'information...
###############
>>>data
[10 11 12 14 15 16]
>>>label
[0 0 1 1 2 2]
Les détails sont dans les commentaires. En termes simples, nous faisons ce qui suit pour une classe qui a plus d'échantillons que le minimum.
import numpy as np
import random
#Tableau de données
data = np.array(range(10,20))
print("data:", data)
#Tableau d'étiquettes
label = np.array([0, 0, 1, 1, 1, 2, 2, 2, 2, 2])
print("label:", label)
#Nombre d'échantillons pour toutes les classes
sample_nums = np.array([])
print("\n Calculez le nombre d'échantillons pour chaque classe")
for i in range(max(label)+1):
#Nombre d'échantillons pour chaque classe
sample_num = np.sum(label == i)
#Ajouté au tableau de gestion du nombre d'échantillons
sample_nums = np.append(sample_nums, sample_num)
print("sample_nums:", sample_nums)
#Nombre minimum d'échantillons dans toutes les classes
min_num = np.min(sample_nums)
print("min_num:", min_num)
print("\n Alignez le nombre d'échantillons pour chaque classe")
for i in range(len(sample_nums)):
#Différence entre le nombre d'échantillons dans la classe cible et le nombre minimum d'échantillons
diff_num = int(sample_nums[i] - min_num)
print("classe%d Nombre d'échantillons supprimés: %d (%0.2f%)" % (i, diff_num, (diff_num/sample_nums[i])*100))
#Ignorer si vous n'avez pas besoin de supprimer
if diff_num == 0:
continue
#Index des éléments à supprimer
#Puisqu'il s'agit d'un taple, convertissez-le en liste(Situé au 0ème index)
indexes = list(np.where(label == i)[0])
print("\tindexes:", indexes)
#Index des données à supprimer
del_indexes = random.sample(indexes, diff_num)
print("\tdel_indexes:", del_indexes)
#Supprimer des données
data = np.delete(data, del_indexes)
label = np.delete(label, del_indexes)
print("\ndata:", data)
print("label:", label)
data: [10 11 12 13 14 15 16 17 18 19]
label: [0 0 1 1 1 2 2 2 2 2]
Calculez le nombre d'échantillons pour chaque classe
sample_nums: [ 2. 3. 5.]
min_num: 2.0
Alignez le nombre d'échantillons pour chaque classe
Classe 0 nombre d'échantillons supprimés: 0 (0.00%)
Nombre d'échantillons supprimés de classe 1: 1 (33.33%)
indexes: [2, 3, 4]
del_indexes: [3]
Nombre d'échantillons supprimés de classe 2: 3 (60.00%)
indexes: [4, 5, 6, 7, 8]
del_indexes: [7, 8, 6]
data: [10 11 12 14 15 16]
label: [0 0 1 1 2 2]
Si vous êtes familier avec Python, vous pouvez le rendre plus efficace.
Recommended Posts