Biri bana StandardScaler'ı açıklayabilir mi?


Yanıtlar:


119

Arkasındaki fikir StandardScaler, verilerinizi, dağılımının ortalama değeri 0 ve standart sapması 1 olacak şekilde dönüştürebilmesidir.
Çok değişkenli veriler söz konusu olduğunda, bu özellik açısından yapılır (başka bir deyişle, verilerin her sütunu için bağımsız olarak) .
Verilerin dağılımı göz önüne alındığında, veri kümesindeki her bir değerin ortalama değeri çıkarılır ve ardından tüm veri kümesinin standart sapmasına (veya çok değişkenli durumda özelliğe) bölünür.


6
Bu cevabın doğru olmadığını görüyorum. each value in the dataset will have the sample mean value subtracted-- Bu doğru değil. EACH özelliğinin / sütununun ortalaması, belirli sütunun değerlerinden çıkarılacaktır. Bu sütun bazında yapılır. Hayır sample mean value subtracted- Cevabımı aşağıda görün
seralouk

@makis Önerdiğiniz açıklamanın ardından cevabımı düzenledim.
user6903745

114

Giriş:X Her satırın / satırın bir örnek / gözlem olduğu ve her sütunun bir değişken / özellik olduğu bir matrisiniz olduğunu varsayıyorum (bu sklearnarada herhangi bir ML işlevi için beklenen girdidir - X.shapeolması gerekir [number_of_samples, number_of_features]).


Yöntemin Çekirdek : Ana fikir için normalleştirmek / standartlaştırmak yani μ = 0ve σ = 1sizin özellikler / değişkenler / sütunlar X, bireysel olarak , daha önce herhangi bir makine öğrenme modelini uygulamak.

StandardScaler()olacak özellikler normalleştirmek X her bir sütunu, yani BİREYSEL , böylece her sütun / özellik / değişken olacağı μ = 0ve σ = 1.


Not: Bu sayfada en çok oy alan cevabı yanlış buluyorum. "Veri kümesindeki her bir değerin örnek ortalama değeri çıkarılacaktır" - Bu ne doğru ne de doğru.


Ayrıca bakınız: Verilerinizi nasıl ve neden Standartlaştırmalısınız: Bir python öğreticisi


Misal:

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.]]

Her özelliğin (sütun) ortalamasının 0 olduğunu doğrulayın:

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

Her özelliğin (sütun) std'sinin 1 olduğunu doğrulayın:

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

Matematik:

görüntü açıklamasını buraya girin


GÜNCELLEME 08/2020 : giriş parametreleri ile ilgili with_meanve with_stdhiç False/ True, burada bir cevap vermiş: arasındaki StandardScaler fark “with_std = False veya True” ve “with_mean = False veya True”


[1.15, 1.15]Pandas df: olarak hesapladığımda neden aldığım konusunda bir fikriniz var pd.DataFrame(scaled_data).std(0)mı?
Sos

koştuğumda ve değerleri pd.DataFrame(scaled_data)[0]olan bir dizi alırım . Biçimlendirme için özür dilerimName: 0, dtype: float64[-1.0, 1.0, -1.0, 1.0]
Sos

@seralouk Cevabınızı beğendim, ancak yine de giriş verilerini kullanarak dönüştürmenin arkasındaki niyetin ne olduğunu merak ediyorum StandardScaler, makine öğrenimi algoritmasının daha hızlı gitmesini sağlıyor mu, yoksa daha doğru kararlar almaya yardımcı oluyor mu yoksa başka bir şey mi?
eylül

Bir veri kümesinin standardizasyonu, birçok makine öğrenimi tahmincisi için ortak bir gerekliliktir: eğer bireysel özellikler aşağı yukarı standart normal dağıtılmış veriler gibi görünmüyorsa kötü davranabilirler (örneğin, 0 ortalama ve birim varyanslı Gauss). Örneğin, bir öğrenme algoritmasının amaç işlevinde kullanılan birçok öğe (SVM'nin RBF çekirdeği veya doğrusal modellerin L1 ve L2 düzenleyicileri gibi), tüm özelliklerin 0 civarında ortalandığını ve aynı sırada varyansa sahip olduğunu varsayar.
seraluk

Dolayısıyla, Standardizasyon a) daha kararlı b) değişken aralığından daha az etkilenir c) daha hızlı uygulama d) daha kararlı performans
seralouk


26

StandardScaler, Standardizasyon görevini yerine getirir . Genellikle bir veri kümesi, ölçek olarak farklı değişkenler içerir. Değerleri ile YAŞ sütunu bulunur Çalışan bir veri kümesi için, örneğin ölçekli 20-70 ile ilgili değerleri ve ÜCRET kolonu ölçekte 10.000-80.000 üzerinde .
Bu iki sütun ölçek olarak farklı olduğundan, makine öğrenimi modeli oluştururken ortak bir ölçeğe sahip olacak şekilde Standartlaştırılmıştır.


11

Bu, farklı birimlere karşılık gelen verileri karşılaştırmak istediğinizde kullanışlıdır. Bu durumda birimleri çıkarmak istersiniz. Bunu tüm verilerde tutarlı bir şekilde yapmak için, verileri varyansın üniter olduğu ve serinin ortalamasının 0 olacağı şekilde dönüştürürsünüz.


1
lütfen bir örnekle açıklayabilir misin .. nasıl yardımcı olduğu gibi? .. bu wud gerçekten yardımcı
olur..thanks

8

Aşağıda, standarizasyon hesaplamasının nasıl çalıştığını açıklamak için basit bir çalışma örneği verilmiştir. Teori kısmı zaten diğer cevaplarda iyi açıklanmıştır.

>>>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

Hesaplama

Çıktıda görebileceğiniz gibi, ortalama [6. , 2.5] ve standart sapma [1.41421356, 0.8660254]

Veriler (0,1) konumu 2'dir Standardizasyon = (2 - 2.5) /0.8660254 = -0.57735027

(1,0) konumundaki veriler 4'tür Standardizasyon = (4-6) /1,41421356 = -1,414

Standardizasyon Sonrası Sonuç

görüntü açıklamasını buraya girin

Standardizasyondan Sonra Ortalama ve Std Sapmayı Kontrol Edin

görüntü açıklamasını buraya girin

Not: -2.77555756e-17, 0'a çok yakındır.

Referanslar

  1. Farklı ölçekleyicilerin veriler üzerindeki etkisini aykırı değerlerle karşılaştırın

  2. Normalleştirme ve Standardizasyon arasındaki fark nedir?

  3. Sklearn StandardScaler ile ölçeklenen verilerin ortalaması sıfır değil


5

Yukarıdaki cevaplar harika, ancak geçmişte sahip olduğum bazı endişeleri gidermek için basit bir örneğe ihtiyacım vardı. Her bir sütunu ayrı ayrı ele aldığından emin olmak istedim. Şimdi rahatladım ve hangi örneğin endişelenmeme neden olduğunu bulamıyorum. Bütün sütun ARE üzerinde olanlar tarafından tarif edildiği gibi ayrı ayrı tartılır.

KOD

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)

ÇIKTI

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)

NOT:

Scipy.stats modülü, paydada (n - 1) kullanan "örnek" varyansını doğru bir şekilde rapor ediyor. "Popülasyon" varyansı, varyans hesaplaması için paydada n'yi kullanır. Daha iyi anlamak için lütfen yukarıdaki veri kümesinin ilk sütunundaki ölçeklendirilmiş verileri kullanan aşağıdaki koda bakın:

Kod

import scipy.stats as ss

sc_Data = [[-1.34164079], [-0.4472136], [0.4472136], [1.34164079]]
col_stats = ss.describe([-1.34164079, -0.4472136, 0.4472136, 1.34164079])
print(col_stats)
print()

mean_by_hand = 0
for row in sc_Data:
    for element in row:
        mean_by_hand += element
mean_by_hand /= 4

variance_by_hand = 0
for row in sc_Data:
    for element in row:
        variance_by_hand += (mean_by_hand - element)**2
sample_variance_by_hand = variance_by_hand / 3
sample_std_dev_by_hand = sample_variance_by_hand ** 0.5

pop_variance_by_hand = variance_by_hand / 4
pop_std_dev_by_hand = pop_variance_by_hand ** 0.5

print("Sample of Population Calcs:")
print(mean_by_hand, sample_variance_by_hand, sample_std_dev_by_hand, '\n')
print("Population Calcs:")
print(mean_by_hand, pop_variance_by_hand, pop_std_dev_by_hand)

Çıktı

DescribeResult(nobs=4, minmax=(-1.34164079, 1.34164079), mean=0.0, variance=1.3333333422778562, skewness=0.0, kurtosis=-1.36000000429325)

Sample of Population Calcs:
0.0 1.3333333422778562 1.1547005422523435

Population Calcs:
0.0 1.000000006708392 1.000000003354196

2
Neden varyans 1 değil, lütfen?
Maks.

@Max, scipy istatistikleri örnek varyans kullanıyor. Cevaplanacak yeni eklemeleri görün.
Thom Ives

@seralouk Evet, popülasyon varyansı ve std sapması, ancak örnek varyansı ve std sapma için değil - örnek hesaplamaları varsayılan olarak scipy istatistikleri.
Thom Ives

3

Uygulamadan sonra StandardScaler(), X'teki her bir sütunun ortalaması 0 ve standart sapması 1 olacaktır.

Formüller bu sayfada başkaları tarafından listelenmiştir.

Gerekçe: Bazı algoritmalar verilerin böyle görünmesini gerektirir ( sklearn belgelerine bakın ).


Doğru. Ölçeklendirilmiş verilerin örnek ortalamasının ve varyansının scipy istatistik açıklamasını gösteren bazı yanıtlar. Küçük veri kümeleri için örnek varyansı, popülasyon varyansından önemli ölçüde farklı olabilir.
Thom Ives

0

StandardScalar()Sıra bazında başvuruyoruz .

Yani, bir sütundaki her satır için (Pandas DataFrame ile çalıştığınızı varsayıyorum):

x_new = (x_original - mean_of_distribution) / std_of_distribution

Birkaç puan -

  1. Dağılımın standart sapmasına (özelliğin dağıtımı) böldüğümüz için Standart Skaler olarak adlandırılır. Benzer şekilde, tahmin edebilirsiniz MinMaxScalar().

  2. Orijinal dağılım uygulandıktan sonra aynı kalır StandardScalar(). Dağılımın Normal Dağılım olarak değişmesi yaygın bir yanılgıdır. Aralığı [0, 1] olarak sıkıştırıyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.