DATENVORVERARBEITUNG
Numerische Merkmale in Rohdatensätzen sind wie Erwachsene in einer Welt, die für Erwachsene geschaffen wurde. Einige ragen wie Wolkenkratzer empor (denken Sie an Milliardenumsätze), während andere kaum sichtbar sind (wie Wahrscheinlichkeiten von 0,001). Aber unsere Modelle für maschinelles Lernen? Sie sind Kinder, die sich bemühen, diese Welt der Erwachsenen zu verstehen.
Bei der Datenskalierung (auch „Normalisierung“ genannt) handelt es sich um den Prozess, diese Zahlen in Erwachsenengröße in kindgerechte Proportionen umzuwandeln. Es geht darum, gleiche Bedingungen zu schaffen, bei denen jedes Merkmal, ob groß oder klein, verstanden und angemessen bewertet werden kann.
Wir werden uns fünf verschiedene Skalierungstechniken ansehen, die alle anhand eines kleinen Datensatzes demonstriert werden (natürlich mit einigen visuellen Elementen). Von der sanften Normalisierung bis hin zur mathematischen Akrobatik der Field-Cox-Transformation werden Sie sehen, warum die Wahl der richtigen Skalierungsmethode die Geheimzutat für Ihr maschinelles Lernrezept sein kann.
Bevor wir auf die Einzelheiten der Skalierungstechniken eingehen, sollten wir verstehen, welche Datentypen von der Skalierung profitieren und welche nicht:
Daten, die normalerweise nicht skaliert werden müssen:
- Kategoriale Variablen: Diese sollten normalerweise kodiert und nicht skaliert werden. Dies umfasst sowohl nominale als auch ordinale kategorische Daten.
- Binäre Variablen: Options, die nur zwei Werte annehmen können (0 und 1 oder Wahr und Falsch), müssen im Allgemeinen nicht skaliert werden.
- Zähldaten: Ganzzahlige Zählungen sind oft so, wie sie sind, sinnvoll und durch Skalierung können sie schwerer verständlich werden. Behandeln Sie sie stattdessen als kategorisch. Es gibt einige Ausnahmen, insbesondere bei sehr großen Zählbereichen.
- Zyklische Merkmale: Daten mit zyklischer Natur (wie Wochentage oder Monate des Jahres) profitieren häufig mehr von der zyklischen Kodierung als von Standardskalierungstechniken.
Daten, die normalerweise skaliert werden müssen:
- Kontinuierliche numerische Merkmale mit großen Bereichen: Options, die einen weiten Wertebereich annehmen können, profitieren häufig von einer Skalierung, um zu verhindern, dass sie andere Options im Modell dominieren.
- In unterschiedlichen Einheiten gemessene Merkmale: Wenn Ihr Datensatz Merkmale enthält, die in unterschiedlichen Einheiten gemessen werden (z. B. Meter, Kilogramm, Jahre), hilft die Skalierung dabei, sie auf eine vergleichbare Skala zu bringen.
- Merkmale mit deutlich unterschiedlichen Ausmaßen: Wenn einige Options Werte im Tausenderbereich haben, während andere zwischen 0 und 1 liegen, kann die Skalierung dabei helfen, ihren Einfluss auf das Modell auszugleichen.
- Prozent- oder Verhältnisfunktionen: Obwohl diese bereits auf einer festen Skala basieren (normalerweise 0–100 oder 0–1), kann eine Skalierung dennoch von Vorteil sein, insbesondere wenn sie zusammen mit Funktionen mit viel größeren Bereichen verwendet wird.
- Begrenzte kontinuierliche Options: Options mit einem bekannten Minimal und Most profitieren häufig von der Skalierung, insbesondere wenn ihr Bereich sich erheblich von anderen Options im Datensatz unterscheidet.
- Schiefe Verteilungen: Options mit stark schiefen Verteilungen profitieren häufig von bestimmten Arten der Skalierung oder Transformation, um sie normaler zu verteilen und die Modellleistung zu verbessern.
Jetzt fragen Sie sich vielleicht: „Warum überhaupt skalieren? Können wir die Daten nicht einfach so lassen?“ Tatsächlich funktionieren viele Algorithmen des maschinellen Lernens am besten, wenn alle Merkmale auf einer ähnlichen Skala liegen. Aus diesen Gründen ist Skalierung erforderlich:
- Gleiche Merkmalswichtigkeit: Nicht skalierte Merkmale können das Modell versehentlich dominieren. Beispielsweise kann die Windgeschwindigkeit (0–50 km/h) die Temperatur (10–35 °C) überschatten, und zwar einfach aufgrund ihres größeren Maßstabs und nicht, weil sie wichtiger ist.
- Schnellere Konvergenz: Viele beim maschinellen Lernen verwendete Optimierungsalgorithmen konvergieren schneller, wenn die Merkmale eine ähnliche Größenordnung aufweisen.
- Verbesserte Algorithmusleistung: Einige Algorithmen, wie Okay-Nearest Neighbors und Neuronale Netzwerke, erfordern ausdrücklich skalierte Daten, um eine gute Leistung zu erzielen.
- Interpretierbarkeit: Skalierte Koeffizienten in linearen Modellen sind einfacher zu interpretieren und zu vergleichen.
- Vermeidung numerischer Instabilität: Sehr große oder sehr kleine Werte können bei einigen Algorithmen zu numerischer Instabilität führen.
Nachdem wir nun wissen, welche numerischen Daten skaliert werden müssen und warum, werfen wir einen Blick auf unseren Datensatz und sehen, wie wir seine numerischen Variablen mithilfe von fünf verschiedenen Skalierungsmethoden skalieren können. Es geht nicht nur um Skalierung – es geht darum, richtig zu skalieren.
Bevor wir uns mit den Skalierungstechniken befassen, sehen wir uns unseren Datensatz an. Wir werden mit Daten von diesem fiktiven Golfclub arbeiten.
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
from scipy import stats# Learn the info
information = {
'Temperature_Celsius': (15, 18, 22, 25, 28, 30, 32, 29, 26, 23, 20, 17),
'Humidity_Percent': (50, 55, 60, 65, 70, 75, 80, 72, 68, 62, 58, 52),
'Wind_Speed_kmh': (5, 8, 12, 15, 10, 7, 20, 18, 14, 9, 6, 11),
'Golfers_Count': (20, 35, 50, 75, 100, 120, 90, 110, 85, 60, 40, 25),
'Green_Speed': (8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 11.0, 10.5, 10.0, 9.5, 9.0)
}
df = pd.DataFrame(information)
Dieser Datensatz ist perfekt für unsere Skalierungsaufgaben, da er Options mit unterschiedlichen Einheiten, Skalen und Verteilungen enthält.
Lassen Sie uns jetzt auf alle Skalierungsmethoden eingehen.
Die Min-Max-Skalierung transformiert alle Werte in einen festen Bereich, normalerweise zwischen 0 und 1, indem der Minimalwert subtrahiert und durch den Bereich dividiert wird.
📊 Gängige Datentypen: Options mit einem breiten Wertebereich, für die ein bestimmter Bereich gewünscht wird.
🎯 Ziele:
– Beschränken Sie Funktionen auf einen bestimmten Bereich (z. B. 0 bis 1).
– Bewahren Sie die ursprünglichen Beziehungen zwischen den Datenpunkten.
– Sicherstellung der Interpretierbarkeit skalierter Werte.
In unserem Fall: Wir wenden dies auf die Temperatur an, da die Temperatur in unserem Golfkontext ein natürliches Minimal und Most hat. Dabei bleiben die relativen Unterschiede zwischen den Temperaturen erhalten, sodass 0 der kälteste Tag, 1 der heißeste und 0,5 ein Tag mit durchschnittlicher Temperatur ist.
# 1. Min-Max Scaling for Temperature_Celsius
min_max_scaler = MinMaxScaler()
df('Temperature_MinMax') = min_max_scaler.fit_transform(df(('Temperature_Celsius')))
Bei der Standardskalierung werden die Daten um einen Mittelwert von 0 zentriert und auf eine Standardabweichung von 1 skaliert. Dies wird durch Subtrahieren des Mittelwerts und Division durch die Standardabweichung erreicht.
📊 Gängige Datentypen: Merkmale mit unterschiedlichen Maßstäben und Verteilungen.
🎯 Ziele:
– Standardisieren Sie die Merkmale so, dass sie einen Mittelwert von 0 und eine Standardabweichung von 1 haben.
– Stellen Sie sicher, dass Options mit unterschiedlichen Maßstäben gleichermaßen zu einem Modell beitragen.
– Bereiten Sie Daten für Algorithmen vor, die auf Merkmalsskalen reagieren (z. B. SVM, KNN).
In unserem Fall: Wir verwenden dies für die Windgeschwindigkeit, da die Windgeschwindigkeit häufig einer annähernd normalen Verteilung folgt. So können wir außergewöhnlich ruhige oder windige Tage ganz einfach anhand der Anzahl ihrer Standardabweichungen vom Mittelwert identifizieren.
# 2. Normal Scaling for Wind_Speed_kmh
std_scaler = StandardScaler()
df('Wind_Speed_Standardized') = std_scaler.fit_transform(df(('Wind_Speed_kmh')))
Bei der robusten Skalierung werden die Daten um den Median zentriert und mithilfe des Interquartilsabstands (IQR) skaliert.
📊 Gängige Datentypen: Options mit Ausreißern oder verrauschten Daten.
🎯 Ziele:
– Gehen Sie effektiv mit Ausreißern um, ohne sich zu sehr von ihnen beeinflussen zu lassen.
– Behalten Sie die relative Reihenfolge der Datenpunkte bei.
– Erreichen Sie eine stabile Skalierung bei verrauschten Daten.
In unserem Fall: Wir wenden dies auf die Luftfeuchtigkeit an, da Luftfeuchtigkeitswerte aufgrund extremer Wetterbedingungen oder Messfehler Ausreißer aufweisen können. Diese Skalierung stellt sicher, dass unsere Messungen weniger empfindlich auf diese Ausreißer reagieren.
# 3. Sturdy Scaling for Humidity_Percent
robust_scaler = RobustScaler()
df('Humidity_Robust') = robust_scaler.fit_transform(df(('Humidity_Percent')))
Bisher haben wir uns einige Möglichkeiten zum Skalieren von Daten angesehen. Lassen Sie uns nun einen anderen Ansatz untersuchen – die Verwendung von Transformationen zum Skalieren, beginnend mit der gängigen Technik der Log-Transformation.
Dabei wird eine logarithmische Funktion auf die Daten angewendet, die den Maßstab sehr großer Werte komprimiert.
📊 Gängige Datentypen:
– Rechtsschiefe Daten (Lengthy Tail).
– Daten zählen.
– Daten mit multiplikativen Beziehungen.
🎯 Ziele:
– Beheben Sie die Rechtsschiefe und normalisieren Sie die Verteilung.
– Stabilisieren Sie die Varianz über den gesamten Funktionsbereich.
– Verbessern Sie die Modellleistung für Daten mit diesen Eigenschaften.
In unserem Fall: Wir verwenden dies für die Anzahl der Golfer, da die Zähldaten häufig einer rechtsschiefen Verteilung folgen. Dadurch ist der Unterschied zwischen 10 und 20 Golfern signifikanter als zwischen 100 und 110, was den tatsächlichen Auswirkungen dieser Unterschiede entspricht.
# 4. Log Transformation for Golfers_Count
df('Golfers_Log') = np.log1p(df('Golfers_Count'))
Hierbei handelt es sich um eine Familie von Potenztransformationen (zu der als Spezialfall auch die Log-Transformation gehört), deren Ziel die Normalisierung der Datenverteilung durch die Anwendung einer Potenztransformation mit dem Parameter Lambda (λ) ist, der zur Erreichung der gewünschten Normalität optimiert ist.
Allgemeine Datentypen: Merkmale, die normalisiert werden müssen, um eine Normalverteilung anzunähern.
🎯 Ziele:
– Normalisieren Sie die Verteilung eines Options.
– Verbessern Sie die Leistung von Modellen, die regular verteilte Daten voraussetzen.
– Varianz stabilisieren und möglicherweise die Linearität verbessern.
In unserem Fall: Wir wenden dies auf Inexperienced Pace an, da es eine komplexe Verteilung haben könnte, die sich mit einfacheren Methoden nicht leicht normalisieren lässt. So können uns die Daten zur am besten geeigneten Transformation führen und möglicherweise ihre Beziehungen zu anderen Variablen verbessern.
# 5. Field-Cox Transformation for Green_Speed
df('Green_Speed_BoxCox'), lambda_param = stats.boxcox(df('Green_Speed'))
Nach der Durchführung der Transformation ist es auch üblich, sie weiter zu skalieren, damit sie einer bestimmten Verteilung folgt (wie regular). Wir können dies mit beiden transformierten Spalten tun, die wir hatten.
df('Golfers_Count_Log') = np.log1p(df('Golfers_Count'))
df('Golfers_Count_Log_std') = standard_scaler.fit_transform(df(('Golfers_Count_Log')))box_cox_transformer = PowerTransformer(methodology='box-cox') # By default already has standardizing
df('Green_Speed_BoxCox') = box_cox_transformer.fit_transform(df(('Green_Speed')))print("nBox-Cox lambda parameter:", lambda_param)
print("nBox-Cox lambda parameter:", lambda_param)
Das warfare’s additionally. Fünf verschiedene Skalierungstechniken, alle auf unseren Golfplatz-Datensatz angewendet. Jetzt sind alle numerischen Merkmale transformiert und bereit für maschinelle Lernmodelle.
Hier ist eine kurze Zusammenfassung jeder Methode und ihrer Anwendung:
- Min-Max-Skalierung: Auf die Temperatur angewendet, wobei die Werte für eine bessere Interpretierbarkeit des Modells auf einen Bereich von 0–1 normalisiert werden.
- Standardskalierung: Wird für die Windgeschwindigkeit verwendet. Die Verteilung wird standardisiert, um die Auswirkungen extremer Werte zu reduzieren.
- Robuste Skalierung: Wird auf die Luftfeuchtigkeit angewendet, um potenzielle Ausreißer zu verarbeiten und ihre Auswirkungen auf die Modellleistung zu reduzieren.
- Log-Transformation: Wird für „Golfers Depend“ verwendet, um rechtsschiefe Zähldaten zu normalisieren und die Modellstabilität zu verbessern.
- Field-Cox-Transformation: Wird auf Inexperienced Pace angewendet, um die Verteilung normalähnlicher zu gestalten, was häufig von Algorithmen des maschinellen Lernens gefordert wird.
Jede Skalierungsmethode dient einem bestimmten Zweck und wird basierend auf der Artwork der Daten und den Anforderungen des maschinellen Lernalgorithmus ausgewählt. Durch die Anwendung dieser Techniken haben wir unsere numerischen Merkmale für die Verwendung in verschiedenen Modellen des maschinellen Lernens vorbereitet und so möglicherweise deren Leistung und Zuverlässigkeit verbessert.
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler, PowerTransformer# Learn the info
information = {
'Temperature_Celsius': (15, 18, 22, 25, 28, 30, 32, 29, 26, 23, 20, 17),
'Humidity_Percent': (50, 55, 60, 65, 70, 75, 80, 72, 68, 62, 58, 52),
'Wind_Speed_kmh': (5, 8, 12, 15, 10, 7, 20, 18, 14, 9, 6, 11),
'Golfers_Count': (20, 35, 50, 75, 100, 120, 90, 110, 85, 60, 40, 25),
'Green_Speed': (8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 11.0, 10.5, 10.0, 9.5, 9.0)
}
df = pd.DataFrame(information)
# 1. Min-Max Scaling for Temperature_Celsius
min_max_scaler = MinMaxScaler()
df('Temperature_MinMax') = min_max_scaler.fit_transform(df(('Temperature_Celsius')))
# 2. Normal Scaling for Wind_Speed_kmh
std_scaler = StandardScaler()
df('Wind_Speed_Standardized') = std_scaler.fit_transform(df(('Wind_Speed_kmh')))
# 3. Sturdy Scaling for Humidity_Percent
robust_scaler = RobustScaler()
df('Humidity_Robust') = robust_scaler.fit_transform(df(('Humidity_Percent')))
# 4. Log Transformation for Golfers_Count
df('Golfers_Log') = np.log1p(df('Golfers_Count'))
df('Golfers_Log_std') = standard_scaler.fit_transform(df(('Golfers_Log')))
# 5. Field-Cox Transformation for Green_Speed
box_cox_transformer = PowerTransformer(methodology='box-cox') # By default already has standardizing
df('Green_Speed_BoxCox') = box_cox_transformer.fit_transform(df(('Green_Speed')))
# Show the outcomes
transformed_data = df((
'Temperature_MinMax',
'Humidity_Robust',
'Wind_Speed_Standardized',
'Green_Speed_BoxCox',
'Golfers_Log_std',
))
transformed_data = transformed_data.spherical(2)
print(transformed_data)