[PYTHON] Versuchen Sie es mit Standard Scaler

Ich habe kurz nach [sklearn.preprocessing.StandardScaler] gesucht (https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html), daher werde ich es als Memo belassen.

StandardScaler bietet die Standardisierungsfunktion des Datensatzes. Durch Standardisierung kann das Verhältnis der Merkmalsmengen einheitlich gemacht werden.

Nehmen Sie zum Beispiel den Abweichungswert als Beispiel, wenn es einen Test mit einer perfekten Punktzahl von 100 und einen Test mit einer perfekten Punktzahl von 50 gibt. Auch wenn das Verhältnis und die Einheit der Punkte unterschiedlich sind, können Sie die Punkte bewerten, ohne von der Standardisierung betroffen zu sein.

Die Standardisierung kann erhalten werden, indem der Durchschnitt von allen Daten im Satz subtrahiert und durch die Standardabweichung dividiert wird.

z_i = \large{\frac{x_i- \mu}{\sigma}}

"μ" ist der Mittelwert, "σ" ist die Standardabweichung und "i" ist eine beliebige natürliche Zahl.

Der Durchschnitt wird berechnet, indem die Summe der Sätze durch die Zahl dividiert wird.

\mu = \frac{1}{n}\sum ^n_{i}x_i

Die Standardabweichung wird berechnet, indem die Varianz durch die Quadratwurzel geteilt wird.

\sigma = \sqrt{s^2}

Die Varianz wird berechnet, indem der Durchschnitt von allen Daten in der Menge subtrahiert, die Quadrate summiert und durch die Zahl dividiert werden.

s^2 = \dfrac 1n\sum ^n_{i}(x_i - \mu)^2

Zunächst möchte ich es selbst implementieren, ohne eine Bibliothek für maschinelles Lernen zu verwenden. Verwenden Sie den "Iris" -Datensatz als Ziel für die Standardisierung.

from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
print(X[:1]) # array([[5.1, 3.5, 1.4, 0.2]])

import math

def standardize(x):
    """
    Parameters
    ----------
    x:Erwarten Sie ein standardisiertes Array, einen eindimensionalen Vektor.

    Returns
    -------
    mean:durchschnittlich
    var:Verteilt
    std:Standardabweichung
    z:Standardisiertes Array
    """
    mean = None
    var = None
    std = None
    z = None

    #Berechnen Sie den Durchschnitt, die Summe der Sätze/Anzahl der Funktionen
    mean = sum(x) / len(x)

    #Berechnen Sie die Varianz, mitteln Sie die Menge-Teilen Sie die Summe der Quadrate der Merkmalsunterschiede durch die Zahl
    var = sum([(mean - x_i) ** 2 for x_i in x]) / len(x)

    #Teilen Sie die Varianz durch die Quadratwurzel
    std = math.sqrt(var)

    #Subtrahieren Sie den Durchschnitt von jedem Merkmal und dividieren Sie ihn durch die Standardabweichung
    z = [x_i / std for x_i in [x_i - mean for x_i in x]]
    
    return [mean, var, std, z]

#7 Daten vom Anfang der 1. Dimension des Datensatzes
sample_data = X[:, :1][:7] 
print(sample_data.tolist()) # [[5.1], [4.9], [4.7], [4.6], [5.0], [5.4], [4.6]]

mean, var, std, z = standardize(sample_data)

print(mean) # [4.9]
print(var)  # [0.07428571]
print(std)  # 0.2725540575476989
print(*z)   # [0.73379939] [3.25872389e-15] [-0.73379939] [-1.10069908] [0.36689969] [1.83449846] [-1.10069908]

Sie können sehen, dass die Variable "sample_data" verarbeitet und in Gleitkomma konvertiert wurde.

Versuchen Sie als nächstes, "sklearn.preprocessing.StandardScaler" zu verwenden.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(sample_data)

print(scaler.mean_) # [4.9]
print(scaler.var_)  # [0.07428571]
print(math.sqrt(scaler.var_)) # 0.2725540575476989
print(*scaler.transform(sample_data))  # [0.73379939] [3.25872389e-15] [-0.73379939] [-1.10069908] [0.36689969] [1.83449846] [-1.10069908]

#Die Werte sind gleich
print(scaler.mean_ == mean) # [ True]
print(scaler.var_ == var)   # [ True]
print(math.sqrt(scaler.var_) == std) # True
print(*(scaler.transform(sample_data) == z)) # [ True] [ True] [ True] [ True] [ True] [ True] [ True] 

Durch die Verwendung von "Standard Scaler" auf diese Weise kann eine Standardisierung mit einer geringen Menge erreicht werden.

Da die während der Standardisierung berechneten Werte wie "mean_" und "var_" beibehalten werden, wird "fit" beim Trainieren des maschinellen Lernmodells als Daten [^ 1] für die Modellinferenz verwendet. Andererseits kann process_query = (np.array (query) --scaler.mean_) --np.sqrt (scaler.var_) gesetzt werden, was sehr praktisch ist.

[^ 1]: Angenommen, der während der Modellinferenz angegebene Vektor gehört zu dem Datensatz, der während des Trainings verwendet wird.

Recommended Posts

Versuchen Sie es mit Standard Scaler
Versuchen Sie Python
versuchen Sie es mit pysdl2
Versuchen Sie PyOpenGL
Probieren Sie den erweiterten Standard-Lernalgorithmus PPO von OpenAI aus