Beim Erstellen eines maschinellen Lernmodells mit bestimmten Tabellendaten gab es eine Variable, mit der ich den Unterschied zwischen Klassen beseitigen wollte. Deshalb habe ich diesen Prozess implementiert.
Unterabtastung wird für jedes Attribut in jedem angegebenen Abschnitt durchgeführt. Dieses Mal haben wir Daten von Meerestitanen verwendet, um die Anzahl der Menschen in jedem Teenageralter zwischen den Gruppen "Ja" und "Nein" mit den Lebenden abzugleichen. ..
OS:Windows10 conda:4.8.3 python:3.8.3 pandas:0.25.3 matplotlib:3.3.1 seaborn:0.11.0
Holen Sie sich die Daten wie folgt.
load_dataset.py
import seaborn as sns
data = sns.load_dataset("titanic")
In Bezug auf die erfassten Daten ist die Altersverteilung für jeden lebenden Teenager (Überlebensstatus) wie folgt.
display_gragh.py
import matplotlib.pyplot as plt
sns.set_style(style='darkgrid')
fig, ax = plt.subplots(1,1, figsize=(4,4))
ax.set_xticks(range(0,100,10))
ax.set_ylim(0,150)
ax.set_ylabel('the number of people')
sns.distplot(data['age'][data['alive']=='yes'], kde=False, rug=False, bins=range(0,100,10),
label='alive', ax=ax)
sns.distplot(data['age'][data['alive']=='no'], kde=False, rug=False, bins=range(0,100,10),
label='dead', ax=ax)
ax.legend()
plt.show()
Ich habe die folgende Funktion für den Datenabgleich erstellt.
import pandas as pd
def adjust_number(data, target_column, attribute, period):
'''
target_column:Spaltenname angepasst werden
attribute :Zu justierendes Attribut (Passen Sie die Anzahl der Zielspalten zwischen diesen Attributen an)
period :Abschnittsbreite angepasst werden
'''
##Anfängliche Abschnittseinstellung
#Die Untergrenze beginnt bei 0, wenn der Mindestwert der Zieldatengruppe 0 oder mehr beträgt, und beginnt beim Mindestwert, wenn er kleiner als 0 ist.
lower = 0 if data[target_column].min() >= 0 else data[target_column].min()
#Die Obergrenze ist die Untergrenze + Abschnittsbreite-Beginnen Sie mit 1
upper = lower+period-1
data_adjusted = pd.DataFrame() #Zum Speichern von Daten nach der Anpassung
maximum = data[target_column].max() #Holen Sie sich den Maximalwert der Datengruppe, die angepasst werden soll
#Wiederholen, bis die Untergrenze den Maximalwert überschreitet
while lower <= maximum:
#Extrahieren Sie Daten für den Zielabschnitt
data_in_range = data[(lower<=data.loc[:,target_column]) & (data.loc[:,target_column]<=upper)]
#Wenn der Zielabschnitt keine Daten enthält oder ein Attribut vorhanden ist, für das der Zielabschnitt keine Daten enthält, fahren Sie mit dem nächsten Abschnitt fort
#(Wenn aufgrund der Unterabtastung die Anzahl der Daten eines Attributs 0 ist, sind alle 0)
if len(data_in_range) == 0 or set(data[attribute]) != set(data_in_range[attribute]):
lower += period
upper += period
continue
else:
#Erfassen Sie die Anzahl der Daten für jedes Attribut im Zielabschnitt
counts = data_in_range[attribute].value_counts()
#Unterabtastung für jedes Attribut
sample = pd.DataFrame()
for att in counts.index:
sample = data_in_range[data_in_range[attribute]==att].sample(n=counts.min(), random_state=42)
#Verketten Sie die angepassten Daten des Zielabschnitts mit den gespeicherten angepassten Daten
data_adjusted = pd.concat([data_adjusted, sample],axis=0, ignore_index=True)
#Zum nächsten Abschnitt
lower += period
upper += period
return data_adjusted
Die Altersverteilung für jeden Teenager nach der Verarbeitung mit dieser Funktion (nach Anpassung des Alters) ist wie folgt. Es wird vor der Korrektur erneut gebucht.
data_adjusted = adjust_number(data, target_column='age', attribute='alive', period=10)
fig, ax = plt.subplots(1,1, figsize=(4,4))
ax.set_xticks(range(0,100,10))
ax.set_ylim(0,150)
ax.set_ylabel('the number of people')
sns.distplot(data_adjusted['age'][data_adjusted['alive']=='yes'], kde=False, rug=False, bins=range(0,100,10),
label='alive', ax=ax)
sns.distplot(data_adjusted['age'][data_adjusted['alive']=='no'], kde=False, rug=False, bins=range(0,100,10),
label='dead', ax=ax)
ax.legend()
plt.show()
▼ Nach der Korrektur ▼ Vor der Korrektur
Ich konnte es sicher korrigieren.
Selbst wenn ich die Abschnittsbreite von 10 auf 5 geändert habe (entsprechend der Anzahl der Personen alle 5 Jahre), hat es ohne Probleme funktioniert.
data_adjusted = adjust_number(data, target_column='age', attribute='alive', period=5)
▼ Nach der Korrektur ▼ Vor der Korrektur
Es gibt kein Problem, selbst wenn das Anpassungsziel auf Tarif geändert wird.
data_adjusted = adjust_number(data, target_column='fare', attribute='alive', period=30)
▼ Nach der Korrektur ▼ Vor der Korrektur
Es gibt kein Problem, auch wenn das Zielattribut in Geschlecht (Geschlecht) geändert wird.
data_adjusted = adjust_number(data, target_column='age', attribute='sex', period=10)
▼ Nach der Korrektur ▼ Vor der Korrektur
Das ist es. Danke für Ihren Besuch.
Recommended Posts