Es ist wünschenswert, die gleiche Anzahl von Stichproben zwischen Klassen für maschinelles Lernen zu haben. In der Realität werden jedoch häufig nicht nur solche sauberen Daten verwendet, sondern auch Daten mit unterschiedlicher Anzahl von Stichproben zwischen Klassen.
Beachten Sie diesmal, dass der Prozess zum Ausrichten der Anzahl der Stichproben zwischen den in den Etikettendaten beschriebenen Klassen in Python implementiert wurde.
Wenn das folgende Datenarray und seine Beschriftungsdaten vorhanden sind
#Datenarray
data = np.array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
#Beschriftungsarray
label = np.array([0, 0, 1, 1, 1, 2, 2, 2, 2, 2])
###############
#Datenverarbeitung...
###############
>>>data
[10 11 12 14 15 16]
>>>label
[0 0 1 1 2 2]
Details finden Sie in den Kommentaren. Einfach ausgedrückt, machen wir Folgendes für eine Klasse, die mehr Stichproben als die Mindestanzahl von Stichproben enthält.
import numpy as np
import random
#Datenarray
data = np.array(range(10,20))
print("data:", data)
#Beschriftungsarray
label = np.array([0, 0, 1, 1, 1, 2, 2, 2, 2, 2])
print("label:", label)
#Anzahl der Proben für alle Klassen
sample_nums = np.array([])
print("\n Berechnen Sie die Anzahl der Proben für jede Klasse")
for i in range(max(label)+1):
#Anzahl der Proben für jede Klasse
sample_num = np.sum(label == i)
#Zum Array zur Verwaltung von Probennummern hinzugefügt
sample_nums = np.append(sample_nums, sample_num)
print("sample_nums:", sample_nums)
#Mindestanzahl von Proben in allen Klassen
min_num = np.min(sample_nums)
print("min_num:", min_num)
print("\n Richten Sie die Anzahl der Proben für jede Klasse aus")
for i in range(len(sample_nums)):
#Unterschied zwischen der Anzahl der Stichproben in der Zielklasse und der Mindestanzahl der Stichproben
diff_num = int(sample_nums[i] - min_num)
print("Klasse%d Anzahl der gelöschten Proben: %d (%0.2f%)" % (i, diff_num, (diff_num/sample_nums[i])*100))
#Überspringen, wenn Sie nicht löschen müssen
if diff_num == 0:
continue
#Index der zu löschenden Elemente
#Da es sich um ein Taple handelt, konvertieren Sie es in eine Liste(Befindet sich am 0. Index)
indexes = list(np.where(label == i)[0])
print("\tindexes:", indexes)
#Index der zu löschenden Daten
del_indexes = random.sample(indexes, diff_num)
print("\tdel_indexes:", del_indexes)
#Aus Daten löschen
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]
Berechnen Sie die Anzahl der Proben für jede Klasse
sample_nums: [ 2. 3. 5.]
min_num: 2.0
Richten Sie die Anzahl der Proben für jede Klasse aus
Klasse 0 Anzahl gelöschter Proben: 0 (0.00%)
Klasse 1 Anzahl gelöschter Proben: 1 (33.33%)
indexes: [2, 3, 4]
del_indexes: [3]
Klasse 2 Anzahl gelöschter Proben: 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]
Wenn Sie mit Python vertraut sind, können Sie es effizienter gestalten.
Recommended Posts