web-dev-qa-db-ja.com

誰も私にStandardScalerを説明できますか?

StandardScalerのドキュメントにあるsklearnの-​​ page を理解できません。

誰でも簡単な言葉でこれを説明できますか?

55
nitinvijay23

StandardScalerの背後にある考え方は、分布の平均値が0で標準偏差が1になるようにデータを変換するというものです。 、データセット全体の標準偏差で割った値。

63
user6903745

主なアイデアは、機械学習手法を適用する前に、機能を正規化/標準化(mean = 0およびstandard deviation = 1)することです。

覚えておくべき重要なことの1つは、ほとんどの(すべてではないにしても)scikit-learnモデル/クラス/関数は、入力として、次元/形状[number_of_samples, number_of_features]の行列Xを期待することです。これはとても重要です。他のいくつかのライブラリは、入力として逆を想定しています。

StandardScaler()は、各列/機能/変数がmean = 0standard deviation = 1を持つように、機能(Xの各列、個別に!!!)を正規化します。


例:

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

各フィーチャ(列)の平均が0であることを確認します:

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

各機能(列)のstdが1:であることを確認します

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

数学:

enter image description here

UPDATE 08/2019:入力パラメーターwith_meanおよびwith_stdからFalse/Trueに関して、私はここに答えを提供しました: https://stackoverflow.com/a/57381708/5025009

49
serafeim
25
Tuan Vu

StandardScalerは、標準化のタスクを実行します。通常、データセットにはスケールの異なる変数が含まれます。例えば従業員データセットには、値スケール20-7のAGE列と値スケール10000-800のSALARY列が含まれます。
これら2つの列は規模が異なるため、機械学習モデルの構築中に共通の規模になるように標準化されています。

14
krish___na

これは、異なる単位に対応するデータを比較する場合に役立ちます。その場合、ユニットを削除する必要があります。すべてのデータの一貫した方法でこれを行うには、分散がユニタリであり、系列の平均が0になるようにデータを変換します。

7

上記の答えは素晴らしいですが、私が過去に持っていたいくつかの懸念を軽減するために簡単な例が必要でした。実際に各列を個別に処理していることを確認したかったのです。私は今では安心しており、どの例が私を心配させたのか見つけることができません。すべての列上記の説明に従って個別にスケーリングされます。

コード

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)

出力

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)
6
Thom Ives

以下は、標準化計算がどのように機能するかを説明する簡単な作業例です。理論の部分は、他の回答ですでに十分に説明されています。

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

計算

出力でわかるように、平均は[6。 、2.5]、標準偏差は[1.41421356、0.8660254]

データは(0,1)位置は2標準化=(2-2.5)/0.8660254 = -0.57735027

(1,0)位置のデータは4標準化=(4-6)/1.41421356 = -1.414

標準化後の結果

enter image description here

標準化後の平均と標準偏差を確認する

enter image description here

注:-2.77555756e-17は0に非常に近い値です。

参考文献

  1. データに対する異なるスケーラーの影響を外れ値と比較する

  2. 正規化と標準化の違いは何ですか?

  3. sklearn StandardScalerでスケーリングされたデータの平均はゼロではありません

4
Lijo

StandardScaler()を適用すると、Xの各列の平均は0になり、標準偏差は1になります。

数式は、このページの他のユーザーによってリストされています。

根拠:一部のアルゴリズムでは、このようなデータが必要です( sklearn docs を参照)。

3
Paul