Standaryzacja danych do modeli machine learning za pomocą StandardScaler()

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.