[PYTHON] Feature Quantity Engineering auf Reisen mit Pokemon-Numerical Version-

Vor kurzem hatte ich die Möglichkeit, an Datenanalyse-Wettbewerben teilzunehmen, aber in vielen Fällen waren die Ergebnisse nur dann wirksam, wenn je nach dem im Wettbewerb bereitgestellten Datensatz geeignete Merkmalsmengen extrahiert wurden. Um meine Gedanken zusammenzufassen, werde ich einen Artikel veröffentlichen, in der Hoffnung, dass er sowohl für Menschen in Schwierigkeiten als auch für mich bei der Extraktion von Merkmalsmengen nützlich ist. Dieses Mal werde ich einige Merkmale numerischer Daten schreiben.

In Bezug auf Nutzungsdaten habe ich Pokemon Dataset verwendet, da es einfacher ist, sich Trends bei Daten vorzustellen, wenn Sie damit vertraut sind. Die Daten bestehen aus Flaggen von Pokemon-Typen bis zur 6. Generation (X / Y), Aufwandswerten, Generationen und legendären Pokemon.

Bibliothekslast

import pandas as pd
import numpy as np

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns

#Für Feature Quantity Engineering
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.preprocessing import PowerTransformer

figsize  = (10, 7)

Daten gelesen

df = pd.read_csv('./data/121_280_bundle_archive.zip')

Daten

# Name Type 1 Type 2 Total HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
1 Bulbasaur Grass Poison 318 45 49 49 65 65 45 1 False
2 Ivysaur Grass Poison 405 60 62 63 80 80 60 1 False
3 Venusaur Grass Poison 525 80 82 83 100 100 80 1 False
3 VenusaurMega Venusaur Grass Poison 625 80 100 123 122 120 80 1 False
4 Charmander Fire NaN 309 39 52 43 60 50 65 1 False

Skalierung

Die Skalierung ist ein Bild, das die Merkmalsmenge in einen bestimmten Bereich verschiebt, ohne sie zu ändern (siehe Abbildung). Es gibt zwei typische Skalierungsmethoden: Standardisierung und Min-Max-Skalierung.

Standardisierung

Durch die Standardisierung wird die Merkmalsverteilung in eine Standardnormalverteilung mit einem Mittelwert von 0 und einer Varianz von 1 verschoben. Die Standardisierungsformel lautet wie folgt. Insbesondere wird es berechnet, indem der Durchschnitt aus der Merkmalsmenge berechnet und durch die Standardabweichung dividiert wird (wie weit er vom Durchschnitt entfernt ist). Es ist leichter vorstellbar, wenn Sie sich den Code und die Ergebnisse nach der Skalierung ansehen.

#Standardisierung
scaler = StandardScaler()
scaled_hp = scaler.fit_transform(df[['HP']])
scaled_hp = pd.DataFrame(scaled_hp, columns=['HP'])


#Vergleichen Sie vor und nach der Standardisierung
fig, ax = plt.subplots(1, 2, figsize=figsize)
sns.distplot(df['HP'], ax=ax[0])
ax[0].set_title('Untransformed')
sns.distplot(scaled_hp, ax=ax[1])
ax[1].set_title('Transformed')

plt.savefig('Standardisierung.png')

標準化.png

Min-Max-Skalierung

Die Min-Max-Skalierung wird verwendet, um Features von 0 auf 1 zu verschieben. Die Standardisierungsformel lautet wie folgt. Da die Maximal- und Minimalwerte der Merkmalsmenge verwendet werden, besteht die Gefahr, dass sie von Ausreißern leicht beeinflusst werden. Hier ist auch der Code und der skalierte. Sie können sehen, dass die Verteilung gleich bleibt und die Werte zwischen 0 und 1 verschoben werden.

# Min-Maximale Skalierung
scaler = MinMaxScaler()
scaled_hp = pd.DataFrame(scaler.fit_transform(df[['HP']]))

#Vergleichen Sie vor und nach der Skalierung
fig, ax = plt.subplots(1, 2, figsize=figsize)
sns.distplot(df['HP'], ax=ax[0])
ax[0].set_title('Untransformed')
sns.distplot(scaled_hp, ax=ax[1])
ax[1].set_title('Transformed')

plt.savefig('./Min-Maximale Skalierung.png')

Min-Maxスケーリング.png

Sollte ich Standardisierung oder Skalierung wählen?

Wenn Sie sich beim Feature-Quantity-Engineering fragen, ob Sie sich für Standardisierung oder Skalierung entscheiden, welche sollten Sie wählen? Grundsätzlich handelt es sich um eine Eisenplatte, die die Skalierung für Bilddaten und die Standardisierung für andere numerische Werte verwendet. Während die oberen und unteren Grenzen der Bilddaten auf 0 bis 255 festgelegt sind, können andere Daten einen weiten Bereich möglicher Werte aufweisen. Wenn daher eine Skalierung mit einer großen Anzahl von Ausreißern durchgeführt wird, kann die skalierte Verteilung von den Ausreißern beeinflusst werden.

Nichtlineare Umwandlung

Nichtlineare Transformationen ändern die Verteilung von Features im Vergleich zu Standardisierung und Min-Max-Skalierung. Hierbei handelt es sich um lineare Transformationen, die die Verteilung von Features beibehalten. Ich denke, es ist schneller, sich die konvertierte Distribution anzusehen, als die Erklärung zu hören. Ich werde zwei nichtlineare Transformationen einführen. Wenn die Verteilung der Daten nicht der Normalverteilung folgt, konvertieren Sie sie in eine Normalverteilung.

Leistungsumwandlung

Die Leistungstransformation ist eine typische Methode der nichtlinearen Transformation. Die Protokollkonvertierung funktioniert nicht, wenn die Daten 0 enthalten. Daher wird normalerweise das Protokoll (x + 1) für die Konvertierung verwendet. Ich werde die konvertierten Pokemon-Daten veröffentlichen.

#Leistungsumwandlung
log_hp = df['HP']
log_hp = pd.DataFrame(np.log1p(log_hp))

#Vergleichen Sie vor und nach der Standardisierung
fig, ax = plt.subplots(1, 2, figsize=figsize)
sns.distplot(df['HP'], ax=ax[0])
ax[0].set_title('Untransformed')
sns.distplot(log_hp, ax=ax[1])
ax[1].set_title('Transformed')

plt.savefig('Leistungsumwandlung.png')

べき変換.png

Box-Cox-Konvertierung

Die Box-Cox-Konvertierung ist nur verfügbar, wenn die Daten positiv sind, und konvertiert zwangsweise die Daten, die nicht der Normalverteilung folgen, in die Normalverteilung. Es gibt keinen großen Unterschied, aber hier ist ein Vergleich des Box-Cox-Konvertierungscodes und der Verteilung vor und nach der Konvertierung.

# Box-Cox-Konvertierung
#Überprüfen Sie, ob die Daten eine negative Zahl annehmen
check = df['Speed'].min()
if check > 0:
    pt = PowerTransformer(method='box-cox')
    boxcox = pd.DataFrame(pt.fit_transform(df[['Speed']]), columns=['Speed'])

    # Box-Vergleichen Sie Cox-Transformationen
    fig, ax = plt.subplots(1, 2, figsize=figsize)
    sns.distplot(df['Speed'], ax=ax[0])
    ax[0].set_title('Untransformed')
    sns.distplot(boxcox, ax=ax[1])
    ax[1].set_title('Transformed')

    #Vergleich von Dehnung und Schärfe
    print(f'Verzerrung vor der Konvertierung: {df["Speed"].skew(): .2f},Kurtosis: {df["Speed"].kurtosis(): .2f}')
    print(f'Verzerrung nach der Konvertierung: {boxcox["Speed"].skew(): .2f},Kurtosis: {boxcox["Speed"].kurtosis(): .2f}')

    #Ausgabeergebnis
    #Verzerrung vor der Konvertierung:  0.36,Kurtosis: -0.24
    #Verzerrung nach der Konvertierung: -0.05,Kurtosis: -0.40
    
    plt.savefig('Box-Cox-Konvertierung.png')

Box-Cox変換.png

Clipping Das Abschneiden ist buchstäblich eine Technik zum Abschneiden von Daten bei einem bestimmten Schwellenwert. Daten, die größer oder kleiner als der Schwellenwert sind (Ausreißer), können ausgeschlossen werden. Nehmen wir das Beispiel von Pokemon. Schneidet Daten mit einer Geschwindigkeit von 10 oder weniger und 150 oder mehr.

# Clipping
# Clipping
clipping_hp = df['Speed'].clip(10, 130)

#Vergleiche vor und nach dem Clip
fig, ax = plt.subplots(1, 2, figsize=figsize)
sns.distplot(df['Speed'], ax=ax[0])
ax[0].set_title('Unclipped')
sns.distplot(clipping_hp, ax=ax[1])
ax[1].set_title('Clipped')

plt.savefig('Clipping.png')

Clipping.png

Binning Binning ist eine Technik, bei der Daten, die in ein bestimmtes Intervall fallen, durch einen Wert ersetzt werden, der dieses Intervall darstellt. Zum Beispiel, wenn Geschwindigkeitsdaten in Abschnitte von ~ 50, 50 ~ 100, 100 ~ 150, 150 ~ unterteilt und für jeden Abschnitt durch unterschiedliche Variablen (hier 4 von 0, 1, 2, 3) ersetzt werden. Werfen wir einen Blick auf den Code. Sie haben die Daten in einem bestimmten Abschnitt durch eine andere Variable ersetzt (in diesem Fall Kategoriedaten).

# Binning
binned = pd.cut(df['Speed'], 4, labels=False)

print('---------Vor dem Binning----------')
print(df['Speed'].head())
print('---------Nach dem Binning----------')
print(binned.head())

#Ausführungsergebnis
# ---------Vor dem Binning----------
# 0    45
# 1    60
# 2    80
# 3    80
# 4    65
# Name: Speed, dtype: int64
# ---------Nach dem Binning----------
# 0    0
# 1    1
# 2    1
# 3    1
# 4    1
# Name: Speed, dtype: int64

schließlich

Die anzuwendende Konvertierungsmethode hängt davon ab, ob es sich um Bilddaten handelt oder ob sie einer normalen Datenverteilung folgen. Es kann interessant sein, mit verschiedenen Daten zu experimentieren und zu sehen, wie die Daten transformiert werden. Bei Pokemon-Daten gab es nicht viele Daten, die von der Normalverteilung abwichen, sondern Datensatz zur Vorhersage des Immobilienpreises Sie können es mit Techniken versuchen)! IMG_9573.JPG

Recommended Posts

Feature Quantity Engineering auf Reisen mit Pokemon-Numerical Version-
Feature Quantity Engineering auf Reisen mit Pokemon-Kategorie-Variablen-
Hinweis "Features Engineering" von HJvanVeen
Feature Engineering für maschinelles Lernen ab Teil 3 Google Colaboratory-Scale
Seq2Seq (3) ~ CopyNet Edition ~ mit Chainer
Kaggle House Preise ~ ~ Feature Engineering ~