Website-Suche

Wie man Daten mit scikit-learn in Python normalisiert


Einführung

In diesem Artikel werden Sie verschiedene Methoden zur Normalisierung von Daten in Python mit scikit-learn, auch bekannt als sklearn, ausprobieren. Wenn Sie Daten normalisieren, ändern Sie den Maßstab der Daten. Daten werden häufig so umskaliert, dass sie zwischen 0 und 1 liegen, da maschinelle Lernalgorithmen tendenziell besser abschneiden oder schneller konvergieren, wenn die verschiedenen Merkmale auf einem kleineren Maßstab liegen. Bevor maschinelle Lernmodelle mit Daten trainiert werden, ist es gängige Praxis, die Daten zuerst zu normalisieren, um möglicherweise bessere, schnellere Ergebnisse zu erzielen. Die Normalisierung macht den Trainingsprozess auch weniger empfindlich gegenüber dem Maßstab der Merkmale, was nach dem Training zu besseren Koeffizienten führt.

Dieser Prozess, Merkmale durch Neuskalierung besser für das Training geeignet zu machen, wird als Merkmals-Skalierung bezeichnet.

Dieses Tutorial wurde mit Python-Version 3.9.13 und scikit-learn-Version 1.0.2 getestet.

Verwendung der scikit-learn preprocessing.normalize()-Funktion zur Normierung von Daten

Sie können die Funktion preprocessing.normalize() von scikit-learn verwenden, um ein array-ähnliches Datenset zu normalisieren.

Die normalize()-Funktion skaliert Vektoren einzeln auf eine Einheit-Norm, sodass der Vektor eine Länge von eins hat. Die Standardnorm für normalize() ist L2, auch bekannt als die euklidische Norm. Die Formel für die L2-Norm ist die Quadratwurzel aus der Summe der Quadrate der einzelnen Werte. Obwohl die Verwendung der normalize()-Funktion zu Werten zwischen 0 und 1 führt, ist es nicht dasselbe, als würden die Werte einfach auf einen Bereich zwischen 0 und 1 skaliert.

Normalisierung eines Arrays mit der normalize()-Funktion

Sie können ein eindimensionales NumPy-Array mit der Funktion normalize() normalisieren.

Importieren Sie das sklearn.preprocessing Modul:

from sklearn import preprocessing

Importiere NumPy und erstelle ein Array:

import numpy as np

x_array = np.array([2,3,5,6,7,4,8,7,6])

Verwenden Sie die normalize()-Funktion auf dem Array, um die Daten zeilenweise zu normalisieren, in diesem Fall ein eindimensionales Array:

normalized_arr = preprocessing.normalize([x_array])
print(normalized_arr)

Führen Sie den vollständigen Beispielcode aus, um zu demonstrieren, wie man ein NumPy-Array mit der normalize()-Funktion normalisiert:

from sklearn import preprocessing
import numpy as np

x_array = np.array([2,3,5,6,7,4,8,7,6])

normalized_arr = preprocessing.normalize([x_array])
print(normalized_arr)

Die Ausgabe ist:

[[0.11785113 0.1767767  0.29462783 0.35355339 0.41247896 0.23570226
  0.47140452 0.41247896 0.35355339]]

Die Ausgabe zeigt, dass alle Werte im Bereich von 0 bis 1 liegen. Wenn Sie jeden Wert in der Ausgabe quadrieren und dann zusammenzählen, ergibt das Ergebnis 1 oder liegt sehr nah bei 1.

Normalisierung von Spalten eines DataFrames mit der normalize()-Funktion

In einem pandas DataFrame sind Merkmale die Spalten und die Zeilen sind Proben. Sie können eine DataFrame-Spalte in ein NumPy-Array umwandeln und dann die Daten im Array normalisieren.

Die Beispiele in diesem und den folgenden Abschnitten verwenden den Kalifornischen Wohnungsdatensatz.

Der erste Teil des Beispielcodes importiert die Module, lädt den Datensatz, erstellt das DataFrame und gibt die Beschreibung des Datensatzes aus:

import numpy as np
from sklearn import preprocessing
from sklearn.datasets import fetch_california_housing

create the DataFrame
california_housing = fetch_california_housing(as_frame=True)

print the dataset description
print(california_housing.DESCR)

Bitte beachten Sie, dass der as_frame-Parameter auf True gesetzt ist, um das california_housing-Objekt als pandas DataFrame zu erstellen.

Die Ausgabe enthält den folgenden Auszug aus der Datensatzbeschreibung, den Sie verwenden können, um ein Merkmal zur Normalisierung auszuwählen:

.. _california_housing_dataset:

California Housing dataset
--------------------------

**Data Set Characteristics:**

    :Number of Instances: 20640

    :Number of Attributes: 8 numeric, predictive attributes and the target

    :Attribute Information:
        - MedInc        median income in block group
        - HouseAge      median house age in block group
        - AveRooms      average number of rooms per household
        - AveBedrms     average number of bedrooms per household
        - Population    block group population
        - AveOccup      average number of household members
        - Latitude      block group latitude
        - Longitude     block group longitude
...

Als Nächstes konvertieren Sie eine Spalte (Merkmal) in ein Array und drucken es aus. Dieses Beispiel verwendet die HouseAge-Spalte:

x_array = np.array(california_housing['HouseAge'])
print("HouseAge array: ",x_array)

Verwenden Sie schließlich die normalize()-Funktion, um die Daten zu normalisieren und das resultierende Array auszugeben:

normalized_arr = preprocessing.normalize([x_array])
print("Normalized HouseAge array: ",normalized_arr)

Führen Sie das vollständige Beispiel aus, um zu demonstrieren, wie man ein Merkmal mithilfe der normalize()-Funktion normalisiert:

from sklearn import preprocessing
import numpy as np
from sklearn.datasets import fetch_california_housing

california_housing = fetch_california_housing(as_frame=True)
print(california_housing.DESCR)

x_array = np.array(california_housing.data['HouseAge'])
print("HouseAge array: ",x_array)

normalized_arr = preprocessing.normalize([x_array])
print("Normalized HouseAge array: ",normalized_arr)

Die Ausgabe ist:

HouseAge array:  [41. 21. 52. ... 17. 18. 16.]
Normalized HouseAge array:  [[0.00912272 0.00467261 0.01157028 ... 0.00378259 0.0040051  0.00356009]]

Die Ausgabe zeigt, dass die normalize()-Funktion das Array der Median-Hausalter-Werte so geändert hat, dass die Quadratwurzel der Summe der Quadrate der Werte gleich eins ist. Mit anderen Worten, die Werte wurden mit der L2-Norm auf eine Einheitlänge skaliert.

Datensätze durch Zeilen oder Spalten mit der Funktion normalize() normalisieren

Wenn Sie einen Datensatz normalisieren, ohne Merkmale oder Spalten in Arrays zur Verarbeitung zu konvertieren, wird die Datenzeile normalisiert. Die Standardachse für die Funktion normalize() ist 1, was bedeutet, dass jede Probe oder Zeile normalisiert wird.

Das folgende Beispiel zeigt die Normalisierung des California Housing-Datensatzes unter Verwendung der Standardachse:

from sklearn import preprocessing
import pandas as pd

from sklearn.datasets import fetch_california_housing
california_housing = fetch_california_housing(as_frame=True)

d = preprocessing.normalize(california_housing.data)
scaled_df = pd.DataFrame(d, columns=california_housing.data.columns)
print(scaled_df)

Die Ausgabe ist:

         MedInc  HouseAge  AveRooms  ...  AveOccup  Latitude  Longitude
0      0.023848  0.117447  0.020007  ...  0.007321  0.108510  -0.350136
1      0.003452  0.008734  0.002594  ...  0.000877  0.015745  -0.050829
2      0.014092  0.100971  0.016093  ...  0.005441  0.073495  -0.237359
3      0.009816  0.090449  0.010119  ...  0.004432  0.065837  -0.212643
4      0.006612  0.089394  0.010799  ...  0.003750  0.065069  -0.210162
...         ...       ...       ...  ...       ...       ...        ...
20635  0.001825  0.029242  0.005902  ...  0.002995  0.046179  -0.141637
20636  0.006753  0.047539  0.016147  ...  0.008247  0.104295  -0.320121
20637  0.001675  0.016746  0.005128  ...  0.002291  0.038840  -0.119405
20638  0.002483  0.023932  0.007086  ...  0.002823  0.052424  -0.161300
20639  0.001715  0.011486  0.003772  ...  0.001879  0.028264  -0.087038

[20640 rows x 8 columns]

Die Ausgabe zeigt, dass die Werte entlang der Zeilen normalisiert sind, sodass jede Probe normalisiert wird und nicht jedes Merkmal.

Sie können jedoch nach Merkmalen normalisieren, indem Sie die Achse angeben.

Das folgende Beispiel zeigt die Normalisierung des California Housing-Datensatzes mit axis=0, um nach Merkmalen zu normalisieren:

from sklearn import preprocessing
import pandas as pd

from sklearn.datasets import fetch_california_housing
california_housing = fetch_california_housing(as_frame=True)

d = preprocessing.normalize(california_housing.data, axis=0)
scaled_df = pd.DataFrame(d, columns=california_housing.data.columns)
print(scaled_df)

Die Ausgabe ist:

         MedInc  HouseAge  AveRooms  ...  AveOccup  Latitude  Longitude
0      0.013440  0.009123  0.008148  ...  0.001642  0.007386  -0.007114
1      0.013401  0.004673  0.007278  ...  0.001356  0.007383  -0.007114
2      0.011716  0.011570  0.009670  ...  0.001801  0.007381  -0.007115
3      0.009110  0.011570  0.006787  ...  0.001638  0.007381  -0.007116
4      0.006209  0.011570  0.007329  ...  0.001402  0.007381  -0.007116
...         ...       ...       ...  ...       ...       ...        ...
20635  0.002519  0.005563  0.005886  ...  0.001646  0.007698  -0.007048
20636  0.004128  0.004005  0.007133  ...  0.002007  0.007700  -0.007055
20637  0.002744  0.003783  0.006073  ...  0.001495  0.007689  -0.007056
20638  0.003014  0.004005  0.006218  ...  0.001365  0.007689  -0.007061
20639  0.003856  0.003560  0.006131  ...  0.001682  0.007677  -0.007057

[20640 rows x 8 columns]

Wenn Sie die Ausgabe überprüfen, werden Sie feststellen, dass die Ergebnisse für die HouseAge Spalte mit der Ausgabe übereinstimmen, die Sie erhalten haben, als Sie die HouseAge Spalte in ein Array umgewandelt und in einem vorhergehenden Beispiel normalisiert haben.

Verwendung der scikit-learn preprocessing.MinMaxScaler() Funktion zur Normalisierung von Daten

Sie können die preprocessing.MinMaxScaler() Funktion von scikit-learn verwenden, um jedes Merkmal zu normalisieren, indem Sie die Daten auf einen Bereich skalieren.

Die Funktion MinMaxScaler() skaliert jedes Merkmal einzeln, sodass die Werte einen vorgegebenen Mindest- und Höchstwert haben, standardmäßig 0 und 1.

Die Formel zum Skalieren von Attributwerten zwischen 0 und 1 lautet:

Subtrahiere den Mindestwert von jedem Eintrag und teile das Ergebnis dann durch den Bereich, wobei der Bereich die Differenz zwischen dem Maximalwert und dem Mindestwert ist.

Das folgende Beispiel zeigt, wie man die Funktion MinMaxScaler() verwendet, um den Kalifornischen Wohnungsdatensatz zu normalisieren:

from sklearn import preprocessing
import pandas as pd

from sklearn.datasets import fetch_california_housing
california_housing = fetch_california_housing(as_frame=True)

scaler = preprocessing.MinMaxScaler()
d = scaler.fit_transform(california_housing.data)
scaled_df = pd.DataFrame(d, columns=california_housing.data.columns)
print(scaled_df)

Die Ausgabe ist:

         MedInc  HouseAge  AveRooms  ...  AveOccup  Latitude  Longitude
0      0.539668  0.784314  0.043512  ...  0.001499  0.567481   0.211155
1      0.538027  0.392157  0.038224  ...  0.001141  0.565356   0.212151
2      0.466028  1.000000  0.052756  ...  0.001698  0.564293   0.210159
3      0.354699  1.000000  0.035241  ...  0.001493  0.564293   0.209163
4      0.230776  1.000000  0.038534  ...  0.001198  0.564293   0.209163
...         ...       ...       ...  ...       ...       ...        ...
20635  0.073130  0.470588  0.029769  ...  0.001503  0.737513   0.324701
20636  0.141853  0.333333  0.037344  ...  0.001956  0.738576   0.312749
20637  0.082764  0.313725  0.030904  ...  0.001314  0.732200   0.311753
20638  0.094295  0.333333  0.031783  ...  0.001152  0.732200   0.301793
20639  0.130253  0.294118  0.031252  ...  0.001549  0.725824   0.309761

[20640 rows x 8 columns]

Die Ausgabe zeigt, dass die Werte so skaliert sind, dass sie den Standardminimunwert von 0 und den Maximalwert von 1 haben.

Sie können auch verschiedene Mindest- und Höchstwerte für die Skalierung angeben. Im folgenden Beispiel beträgt der Mindestwert 0 und der Höchstwert 2:

from sklearn import preprocessing
import pandas as pd

from sklearn.datasets import fetch_california_housing
california_housing = fetch_california_housing(as_frame=True)

scaler = preprocessing.MinMaxScaler(feature_range=(0, 2))
d = scaler.fit_transform(california_housing.data)
scaled_df = pd.DataFrame(d, columns=california_housing.data.columns)
print(scaled_df)

Die Ausgabe ist:

         MedInc  HouseAge  AveRooms  ...  AveOccup  Latitude  Longitude
0      1.079337  1.568627  0.087025  ...  0.002999  1.134963   0.422311
1      1.076054  0.784314  0.076448  ...  0.002281  1.130712   0.424303
2      0.932056  2.000000  0.105513  ...  0.003396  1.128587   0.420319
3      0.709397  2.000000  0.070482  ...  0.002987  1.128587   0.418327
4      0.461552  2.000000  0.077068  ...  0.002397  1.128587   0.418327
...         ...       ...       ...  ...       ...       ...        ...
20635  0.146260  0.941176  0.059538  ...  0.003007  1.475027   0.649402
20636  0.283706  0.666667  0.074688  ...  0.003912  1.477152   0.625498
20637  0.165529  0.627451  0.061808  ...  0.002629  1.464400   0.623506
20638  0.188591  0.666667  0.063565  ...  0.002303  1.464400   0.603586
20639  0.260507  0.588235  0.062505  ...  0.003098  1.451647   0.619522

[20640 rows x 8 columns]

Die Ausgabe zeigt, dass die Werte so skaliert sind, dass der minimale Wert 0 und der maximale Wert 2 beträgt.

Schlussfolgerung

In diesem Artikel haben Sie zwei scikit-learn-Funktionen verwendet, um Daten auf unterschiedliche Weise nach Probe (Zeile) und nach Merkmal (Spalte) zu normalisieren. Setzen Sie Ihr Lernen über andere Themen im Bereich des maschinellen Lernens fort.