Passen Sie die Verteilung jeder Gruppe in Python an

Hintergrund Zweck

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.

Methode

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

Umgebung

OS:Windows10 conda:4.8.3 python:3.8.3 pandas:0.25.3 matplotlib:3.3.1 seaborn:0.11.0

Implementierung

Datenerfassung

Holen Sie sich die Daten wie folgt.

load_dataset.py


import seaborn as sns
data = sns.load_dataset("titanic")

Bestätigung der Daten vor der Korrektur

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()

image.png

Altersverteilung passend

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 image.png     image.png

Ich konnte es sicher korrigieren.

Anwendung 1 (Querschnittsbreite ändern)

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 image.png     image.png

Anwendung 2 (Änderung des Anpassungsziels)

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 image.png     image.png

Anwendung 3 (Zielattribut ändern)

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 image.png     image.png

Das ist es. Danke für Ihren Besuch.

Recommended Posts

Passen Sie die Verteilung jeder Gruppe in Python an
Überprüfen Sie die atrophische Natur der Wahrscheinlichkeitsverteilung in Python
Überprüfen Sie die Funktionsweise von Python für .NET in jeder Umgebung
Ruft den Index jedes Elements der Verwirrungsmatrix in Python ab
Überprüfen Sie das Verhalten des Zerstörers in Python
Das Ergebnis der Installation von Python auf Anaconda
Grundlagen zum Ausführen von NoxPlayer in Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Status jedes Python-Verarbeitungssystems im Jahr 2020
Versuchen Sie, die stochastische Massenfunktion der Binomialverteilung in Python zu transkribieren
Geben Sie die Anzahl der CPU-Kerne in Python aus
Logistische Verteilung in Python
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Holen Sie sich den Aufrufer einer Funktion in Python
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
der Zen von Python
Kopieren Sie die Liste in Python
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Die Geschichte des Lesens von HSPICE-Daten in Python
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lösen von Bewegungsgleichungen in Python (odeint)
Ausgabe in Form eines Python-Arrays
Vergleichen Sie die Summe jedes Elements in zwei Listen mit dem in Python angegebenen Wert
Erleben Sie die gute Berechnungseffizienz der Vektorisierung in Python
So ermitteln Sie die Anzahl der Stellen in Python
[Python] Ruft die Liste der im Modul definierten Klassen ab
Verstehen Sie die Exponentialverteilung sorgfältig und zeichnen Sie in Python
Zeichnen und verstehen Sie die multivariate Normalverteilung in Python
Die Geschichte von FileNotFound im Python open () -Modus = 'w'
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Implementieren Sie die Lösung der Riccati-Algebra in Python
Verstehe die Poisson-Distribution sorgfältig und zeichne in Python
Ermitteln Sie die Größe (Anzahl der Elemente) von Union Find in Python
Den Inhalt der Daten in Python nicht kennen
Reproduzieren Sie das Ausführungsbeispiel von Kapitel 4 von Hajipata in Python
Verwenden wir die offenen Daten von "Mamebus" in Python
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Heap Sort Edition)
[Python] Gibt alle Kombinationen von Elementen in der Liste aus
Gruppieren Sie nach aufeinanderfolgenden Elementen einer Liste in Python
Rufen Sie die URL des HTTP-Umleitungsziels in Python ab
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Reproduzieren Sie das Ausführungsbeispiel von Kapitel 5 von Hajipata in Python
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Auf dem Weg zum Ruhestand von Python2
Finde Fehler in Python
Schreiben Sie die Beta-Distribution in Python
Objektäquivalenzbeurteilung in Python
Generieren Sie eine U-Verteilung in Python
Implementierung der schnellen Sortierung in Python
Über die Funktionen von Python
Die Kraft der Pandas: Python
Geben Sie für jede Datei die angegebene Tabelle der Oracle-Datenbank in Python in Excel aus
So zählen Sie die Anzahl der Vorkommen jedes Elements in der Liste in Python mit der Gewichtung
Überprüfen Sie die Verarbeitungszeit und die Anzahl der Aufrufe für jeden Prozess mit Python (cProfile).
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus