Adakah yang bisa menjelaskan kepada saya StandardScaler?


Jawaban:


107

Gagasan di baliknya StandardScaleradalah bahwa itu akan mengubah data Anda sedemikian rupa sehingga distribusinya akan memiliki nilai rata-rata 0 dan deviasi standar 1.
Dalam kasus data multivariat, ini dilakukan secara fitur (dengan kata lain secara independen untuk setiap kolom data) .
Mengingat distribusi data, setiap nilai dalam kumpulan data akan dikurangi nilai rata-rata, dan kemudian dibagi dengan deviasi standar dari seluruh kumpulan data (atau fitur dalam kasus multivariat).


4
Saya menemukan bahwa jawaban ini tidak benar. each value in the dataset will have the sample mean value subtracted-- ini tidak benar. Rata-rata fitur / kolom SETIAP akan dikurangi dari nilai kolom tertentu. Ini dilakukan berdasarkan kolom. Tidak ada sample mean value subtracted- Lihat jawaban saya di bawah ini
seralouk

@makis Saya mengedit jawaban saya mengikuti klarifikasi yang Anda sarankan.
pengguna6903745

103

Intro: Saya berasumsi bahwa Anda memiliki matriks di Xmana setiap baris / baris adalah sampel / observasi dan setiap kolom adalah variabel / fitur (ini adalah masukan yang diharapkan untuk sklearnfungsi ML apa pun dengan cara - X.shapeseharusnya [number_of_samples, number_of_features]).


Inti metode : Ide utamanya adalah menormalkan / membakukan, yaitu μ = 0dan σ = 1fitur / variabel / kolom Anda X, satu per satu , sebelum menerapkan model pembelajaran mesin apa pun.

StandardScaler()akan menormalkan fitur yaitu setiap kolom X, INDIVIDU , sehingga setiap kolom / fitur / variabel akan memiliki μ = 0dan σ = 1.


PS: Saya menemukan jawaban yang paling disukai di halaman ini salah. Saya mengutip "setiap nilai dalam kumpulan data akan memiliki sampel nilai rata-rata dikurangi" - Ini tidak benar atau tidak benar.


Lihat juga: Bagaimana dan mengapa Standarisasi data Anda: Tutorial python


Contoh:

from sklearn.preprocessing import StandardScaler
import numpy as np

# 4 samples/observations and 2 variables/features
data = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

print(data)
[[0, 0],
 [1, 0],
 [0, 1],
 [1, 1]])

print(scaled_data)
[[-1. -1.]
 [ 1. -1.]
 [-1.  1.]
 [ 1.  1.]]

Pastikan bahwa rata-rata setiap fitur (kolom) adalah 0:

scaled_data.mean(axis = 0)
array([0., 0.])

Pastikan std dari setiap fitur (kolom) adalah 1:

scaled_data.std(axis = 0)
array([1., 1.])

Matematika:

masukkan deskripsi gambar di sini


UPDATE 08/2019 : Mengenai parameter input with_meandan with_stdke False/ True, saya telah memberikan jawabannya di sini: Perbedaan StandardScaler antara "with_std = False or True" dan "with_mean = False or True"


Apakah Anda tahu mengapa saya mendapatkan [1.15, 1.15]ketika saya menghitung sebagai panda df: pd.DataFrame(scaled_data).std(0)?
Sos

ketika saya menjalankan pd.DataFrame(scaled_data)[0]saya mendapatkan seri dengan Name: 0, dtype: float64dan nilai [-1.0, 1.0, -1.0, 1.0]. Maaf untuk formatnya
Sos

@seralouk Saya suka Anda menjawab, namun saya masih bertanya-tanya apa tujuan di balik mengubah data input menggunakan StandardScaler, apakah itu membuat algoritme pembelajaran mesin berjalan lebih cepat, atau membantu membuat keputusan yang lebih akurat, atau yang lainnya?
sepisoad

Standarisasi kumpulan data adalah persyaratan umum untuk banyak penaksir pembelajaran mesin: mereka mungkin berperilaku buruk jika fitur individual tidak lebih atau kurang terlihat seperti data terdistribusi normal standar (misalnya Gaussian dengan 0 mean dan unit varians). Misalnya, banyak elemen yang digunakan dalam fungsi objektif dari algoritme pembelajaran (seperti kernel RBF SVM atau regulator L1 dan L2 model linier) mengasumsikan bahwa semua fitur dipusatkan di sekitar 0 dan memiliki varians dalam urutan yang sama.
seralouk

Jadi, Standardisasi mengarah pada a) lebih stabil b) kurang dipengaruhi oleh berbagai variabel c) lebih cepat pas d) kinerja lebih stabil
seralouk


23

StandardScaler melakukan tugas Standardisasi . Biasanya kumpulan data berisi variabel yang berbeda dalam skala. Misal, dataset Employee akan berisi kolom AGE dengan nilai skala 20-70 dan kolom SALARY dengan nilai skala 10000-80000 .
Karena kedua kolom ini memiliki skala yang berbeda, keduanya distandarkan untuk memiliki skala yang sama saat membuat model pembelajaran mesin.


10

Ini berguna saat Anda ingin membandingkan data yang sesuai dengan unit yang berbeda. Dalam hal ini, Anda ingin menghapus unitnya. Untuk melakukannya dengan cara yang konsisten pada semua data, Anda mengubah data sedemikian rupa sehingga variansnya adalah kesatuan dan mean deretnya adalah 0.


1
bisakah kamu menjelaskan dengan sebuah contoh..seperti bagaimana hal itu membantu? .. wud itu akan sangat membantu
.. terima kasih

6

Jawaban di atas bagus, tetapi saya membutuhkan contoh sederhana untuk meredakan beberapa kekhawatiran yang saya miliki di masa lalu. Saya ingin memastikan itu memang memperlakukan setiap kolom secara terpisah. Sekarang saya diyakinkan dan tidak dapat menemukan contoh apa yang membuat saya khawatir. Semua kolom ADALAH skala terpisah seperti yang dijelaskan di atas.

KODE

import pandas as pd
import scipy.stats as ss
from sklearn.preprocessing import StandardScaler


data= [[1, 1, 1, 1, 1],[2, 5, 10, 50, 100],[3, 10, 20, 150, 200],[4, 15, 40, 200, 300]]

df = pd.DataFrame(data, columns=['N0', 'N1', 'N2', 'N3', 'N4']).astype('float64')

sc_X = StandardScaler()
df = sc_X.fit_transform(df)

num_cols = len(df[0,:])
for i in range(num_cols):
    col = df[:,i]
    col_stats = ss.describe(col)
    print(col_stats)

KELUARAN

DescribeResult(nobs=4, minmax=(-1.3416407864998738, 1.3416407864998738), mean=0.0, variance=1.3333333333333333, skewness=0.0, kurtosis=-1.3599999999999999)
DescribeResult(nobs=4, minmax=(-1.2828087129930659, 1.3778315806221817), mean=-5.551115123125783e-17, variance=1.3333333333333337, skewness=0.11003776770595125, kurtosis=-1.394993095506219)
DescribeResult(nobs=4, minmax=(-1.155344148338584, 1.53471088361394), mean=0.0, variance=1.3333333333333333, skewness=0.48089217736510326, kurtosis=-1.1471008824318165)
DescribeResult(nobs=4, minmax=(-1.2604572012883055, 1.2668071116222517), mean=-5.551115123125783e-17, variance=1.3333333333333333, skewness=0.0056842140599118185, kurtosis=-1.6438177182479734)
DescribeResult(nobs=4, minmax=(-1.338945389819976, 1.3434309690153527), mean=5.551115123125783e-17, variance=1.3333333333333333, skewness=0.005374558840039456, kurtosis=-1.3619131970819205)

1
Mengapa varians bukan 1?
Maksimal

6

Berikut adalah contoh kerja sederhana untuk menjelaskan cara kerja penghitungan standarisasi. Bagian teori sudah dijelaskan dengan baik di jawaban lain.

>>>import numpy as np
>>>data = [[6, 2], [4, 2], [6, 4], [8, 2]]
>>>a = np.array(data)

>>>np.std(a, axis=0)
array([1.41421356, 0.8660254 ])

>>>np.mean(a, axis=0)
array([6. , 2.5])

>>>from sklearn.preprocessing import StandardScaler
>>>scaler = StandardScaler()
>>>scaler.fit(data)
>>>print(scaler.mean_)

#Xchanged = (X−μ)/σ  WHERE σ is Standard Deviation and μ is mean
>>>z=scaler.transform(data)
>>>z

Perhitungan

Seperti yang Anda lihat di output, mean adalah [6. , 2.5] dan deviasi standar adalah [1.41421356, 0.8660254]

Data posisi (0,1) adalah 2 Standardisasi = (2 - 2.5) /0.8660254 = -0.57735027

Data pada posisi (1,0) adalah 4 Standardisasi = (4-6) /1.41421356 = -1.414

Hasil Setelah Standardisasi

masukkan deskripsi gambar di sini

Periksa Mean dan Deviasi Std Setelah Standarisasi

masukkan deskripsi gambar di sini

Catatan: -2.77555756e-17 sangat dekat dengan 0.

Referensi

  1. Bandingkan efek dari berbagai scaler pada data dengan outlier

  2. Apa perbedaan antara Normalisasi dan Standardisasi?

  3. Rata-rata data yang diskalakan dengan sklearn StandardScaler bukan nol


3

Setelah diterapkan StandardScaler(), setiap kolom di X akan memiliki mean 0 dan deviasi standar 1.

Rumus dicantumkan oleh orang lain di halaman ini.

Rasional: beberapa algoritme memerlukan data agar terlihat seperti ini (lihat dokumentasi sklearn ).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.