(machine_learning_basics.scaling=)

Skalierung#

Bei der Verwendung von Machine-Learning-Algorithmen zur Datenverarbeitung ist der Wertebereich der Parameter entscheidend. Um verschiedene Parameter in denselben Wertebereich zu bringen, kann eine Skalierung erforderlich sein.

Siehe auch

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# local import; this library is located in the same folder as the notebook
from data_generator import generate_biomodal_2d_data
data1 = generate_biomodal_2d_data()

plt.scatter(data1[:, 0], data1[:, 1], c='grey')
<matplotlib.collections.PathCollection at 0x7f79e40aeca0>
../_images/f745af080311ea1d1d7171bfd879e36b2be9b194c18ea5cdd7943a5220597f72.png
data2 = generate_biomodal_2d_data()
data2[:, 1] = data2[:, 1] * 0.1

plt.scatter(data2[:, 0], data2[:, 1], c='grey')
<matplotlib.collections.PathCollection at 0x7f7980026b80>
../_images/b4de18f1594eeba63421e15c266c64fea436be6116e0e162adb120748dac4b30.png

Clustering von Daten in verschiedenen Wertebereichen#

Wir werden nun die beiden scheinbar ähnlichen Datensätze mit k-means clustering clustern. Der Effekt kann auch bei Verwendung anderer Algorithmen beobachtet werden. Um sicherzustellen, dass wir den gleichen Algorithmus mit der gleichen Konfiguration auf beide Datensätze anwenden, kapseln wir ihn in eine Funktion und verwenden diese wieder.

def classify_and_plot(data):
    number_of_classes = 2
    classifier = KMeans(n_clusters=number_of_classes)
    classifier.fit(data)
    prediction = classifier.predict(data)

    colors = ['orange', 'blue']
    predicted_colors = [colors[i] for i in prediction]

    plt.scatter(data[:, 0], data[:, 1], c=predicted_colors)

Wenn wir die gleiche Methode auf beide Datensätze anwenden, können wir beobachten, dass die Datenpunkte in der Mitte unterschiedlich klassifiziert werden. Der einzige Unterschied zwischen den Datensätzen ist ihr Wertebereich. Die Datenpunkte sind entlang einer Achse unterschiedlich skaliert.

classify_and_plot(data1)
../_images/cf8b67538674d91521d77f07004b6fc6594d5a4410f6377e6e35906319ba278b.png
classify_and_plot(data2)
../_images/2034f0d6e320695ba2d091dbea92ad3c9f71e2d06c14a9e2dc0421994753beed.png

Standard-Skalierung#

Standard-Skalierung ist eine Technik, um den Wertebereich von Daten auf einen festen Bereich zu ändern, z.B. [0, 1]. Sie ermöglicht identische Ergebnisse bei Daten, die ursprünglich in unterschiedlichen Wertebereichen lagen.

def scale(data):
    scaler = StandardScaler().fit(data)
    return scaler.transform(data)
scaled_data1 = scale(data1)

classify_and_plot(scaled_data1)
../_images/ed826aad3000b07e84f342802452aa85391d31e09967961e5efc8dc2ae2a4869.png
scaled_data2 = scale(data2)

classify_and_plot(scaled_data2)
../_images/ed826aad3000b07e84f342802452aa85391d31e09967961e5efc8dc2ae2a4869.png