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.