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


回答:


105

背後にStandardScalerある考え方は、分布が平均値0と標準偏差1になるようにデータを変換するというものです。
多変量データの場合、これは機能ごとに行われます(つまり、データの列ごとに独立しています)。 。
データの分布が与えられると、データセットの各値から平均値が差し引かれて、データセット全体(または多変量ケースの特徴)の標準偏差で除算されます。


3
この答えは正しくないことがわかりました。each value in the dataset will have the sample mean value subtracted - 本当じゃない。各フィーチャ/列の平均は、特定の列の値から差し引かれます。これは列ごとに行われます。ありませんsample mean value subtracted-以下の私の回答を参照してください
seralouk '27

@makis私はあなたが提案した説明に従って私の回答を編集しました。
user6903745

98

イントロ:私はあなたが行列があるとX、各列/行があるサンプル/観察し、各列がある変数/機能(これは、任意の予想入力されるsklearn-介してML関数X.shapeであるべきです[number_of_samples, number_of_features])。


この方法のコア:主なアイデアは、にある正規化/標準化すなわちμ = 0およびσ = 1あなたの機能/変数/列のX個別に前の任意の機械学習モデルを適用します。

StandardScaler()機能が正常化、Xの各列、すなわち個別に各列/機能/変数がありますのでこと、μ = 0及びσ = 1


PS:私はこのページで最も賛成された答えを間違っています。「データセットの各値にはサンプルの平均値が差し引かれます」と引用しています-これは真実でも正しくもありません。


参照:データを標準化する方法と理由:Pythonチュートリアル


例:

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

数学:

ここに画像の説明を入力してください


UPDATE 08/2019:入力パラメータをConcering with_meanwith_stdするFalse/ True、私はここに答えを提供していますとのStandardScaler差「= with_stdはfalseまたはtrue」と「with_mean = falseまたはtrue」


[1.15, 1.15]パンダのdfとして計算するときになぜ私が得るのpd.DataFrame(scaled_data).std(0)か、何かご存知ですか?
Sos

実行するpd.DataFrame(scaled_data)[0]と、とのシリーズが表示さName: 0, dtype: float64れます[-1.0, 1.0, -1.0, 1.0]。フォーマットでごめんなさい
Sos

@seralouk私はあなたの答えが好きでしたが、を使用StandardScalerして入力データを変換する背後にある意図はまだ不思議に思っています、それは機械学習アルゴリズムをより速くしたり、より正確な決定をしたりするのに役立ちますか?
sepisoad

データセットの標準化は、多くの機械学習推定量の一般的な要件です。個々の特徴が標準の正規分布データ(たとえば、平均と単位の分散が0のガウス)と多少似ていない場合、動作が悪い可能性があります。たとえば、学習アルゴリズムの目的関数で使用される多くの要素(SVMのRBFカーネルや線形モデルのL1およびL2正則化器など)は、すべての特徴が0を中心とし、同じ順序の分散を持っていると想定しています。
セラルーク

したがって、標準化により、a)より安定したb)変数の範囲による影響が少なくなりますc)より高速なフィッティングd)より安定したパフォーマンス
seralouk


22

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


10

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


1
?uがplsは本当にhelpful..thanksことWUDそれがどのように役立つか...でexample..asで説明することができます
Lakshay

6

上記の答えは素晴らしいですが、私が過去に持っていたいくつかの懸念を軽減するための簡単な例が必要でした。私はそれが実際に各カラムを別々に扱っていることを確認したかったのです。私は安心しましたが、どのような例が私を心配させたのかわかりません。すべての列はARE上で、それらによって記載されているように、別々に拡大縮小します。

コード

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)

1
なぜ分散が1ではないのですか?
最大

6

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

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

標準化後の結果

ここに画像の説明を入力してください

標準化後に平均と標準偏差をチェック

ここに画像の説明を入力してください

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

参考文献

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

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

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


3

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.