
Wyjaśnienie teoretyczne
Standaryzacja danych do modeli machine learning polega na przekształceniu danych pierwotnych, aby ich rozkład miał średnią wartość równą 0 i odchylenie standardowe równe 1. Od każdej wartość w kolumnie danych będzie odejmowana średnia wartość kolumny, a następnie to co wyjdzie będzie podzielona przez odchylenie standardowe kolumny danych. Opisany proces dotyczy każdej kolumny oddzielnie.
Standaryzacja danych do modeli machine learning jest krokiem niezbędnym
W naszym przykładzie mamy kolumnę z poziomem glukozy we krwi, gdzie poziom ten w większości znajduje się w okolicach 100-120 jednostek. Obok mamy kolumnę z ciśnieniem krwi, obok grubością skóry na brzuchu – tam wartości wahają się między 10 a 40 mm.
Ponieważ te dwie kolumny różnią się skalą, są standaryzowane, aby mieć wspólną skalę podczas budowania modelu. Standaryzacja jest więc sposobem na przyporządkowania danych posiadających różne jednostki i różne zakresy wartości do wspólnej skali.
Przykład standaryzacja danych do modeli machine learning
Otwieram bazę:
from sklearn.preprocessing import StandardScaler import numpy as np import pandas as pd df = pd.read_csv('c:/1/diabetes.csv') df.head()
Tworzony z powyższej tabeli szereg.
a = np.array(df) a
Średnia z kolumn wynosi:
np.mean(a, axis=0)
Odchylenie standardowe kolumn wynosi:
np.std(a, axis=0)
Transformujemy dane do postaci standardowego rozkładu normalnego o średniej 0 i odchyleniu standardowym 1.
scaler = StandardScaler() scaled_data = scaler.fit_transform(a) k = scaler.transform(df) k
Średnie z kolumn po standaryzacji.
np.std(k, axis=0)
Odchylenia standardowe po standaryzacji. Wartość k została sprowadzona do formatu int aby lepiej pokazać zero.
k=k.astype(int) np.mean(k, axis=0)
Teraz każda kolumna ma średnią 0 i odchylenie standardowe 1.
Graficzny obraz standaryzacji
Wybierzmy do testów kolumnę: „Glucose”. Przed standaryzacją parametry tej kolumny były następujące.
df['Glucose'].agg(['min','max','mean','std'])
Rozkład prawdopodobieństwa utworzony z danych z kolumny „Glucose”.
import seaborn as sns plt.figure(figsize=(4,4)) sns.distplot(df['Glucose'].dropna(),kde=True,bins=170, color='blue')
Taką charakterystykę miały dane z kolumny „Glucose” przed standaryzacją. Teraz przekształcimy wektor k na tabelę danych.
kf = pd.DataFrame(k, columns = ['Pregnancies', 'Glucose STANDARDISED', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome']) kf.head(8)
Teraz przedstawiamy standaryzowane wartości „Glucose” w formie rozkładu.
plt.figure(figsize=(4,4)) sns.distplot(kf['Glucose STANDARDISED'].dropna(),kde=True,bins=170, color='green')
Dane standaryzowane bardzo różnią się od danych pierwotnych. Widać to najlepiej na wykresie połączonym.
fig, ax = plt.subplots() df['Glucose'].plot.kde(ax=ax, legend=True, title='Standardisation') kf['Glucose STANDARDISED'].plot.kde(ax=ax, legend=True) ax.set_ylabel('Probability') ax.grid(axis='y')
Standaryzować można pojedyncze kolumny
Ta jest gdy inne kolumny nie potrzebują standaryzacji lub już są standaryzowane.
Dane do tego przykładu można znaleźć tutaj.
import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler, Normalizer, scale df = pd.read_csv('c:/1/creditcard.csv') df.sample(6)
Teraz dokonujemy standaryzacji kolumny ‘Amount’.
scaler = StandardScaler() df['Amount'] = scaler.fit_transform(df['Amount'].values.reshape(-1, 1))
Sprawdzamy właściwości nowej kolumny:
Okazuje się że mamy zmienne, które maja wartość 40, oznacza to że istotnie odstają od średniej i od odchylenia standardowego. Sprawdzamy rozkład danych w kolumnie ‘Amount’.
df['Amount'].plot(kind = 'hist')
Rozkład jest prawidłowy.