【Python】Numpy・Pandas・sklearnで標準化する【デフォルトの違いに注意】

どーも、ぐるたか@guru_takaです。

Pythonでデータを標準化するとき、Numpy、Pandas、sklearnのデフォルト値が違くて、混乱しました。備忘録として、まとめます。

標準化とは?

標準化とは正規化の1つであり、平均を0、分散を1にして、データのばらつきを統一する方法です。

MEMO
標準化以外に、0~1の間に値を収めるMin-Maxスケーリングという方法もあります。

Numpy・Pandas・sklearnでの標準化

標準化をするとき、標準偏差、不偏標準偏差どちらを使うかどうかで、値が変わります。

Numpy・Pandas・sklearnでは、標準偏差を求める際、デフォルトが異なります。

  • 標準偏差:Numpy・sklearn
  • 不偏標準偏差:Pandas
標準偏差 不偏標準偏差
Numpy np.std(data) np.std(data, ddof=1)
Pandas df.std(ddof=0) df.std()
sklearn デフォルト
参考 標準偏差の意味と求め方 | 全人類がわかる統計学

サンプルコード

100コのランダムな値を使って、確かめてみました。

python
import numpy as np
import pandas as pd

# データ準備
np.random.seed(0)

# numpy用
samples = np.random.rand(100)

# pandas用
df = pd.DataFrame(data=samples,columns=['samples'])

# numpyでの標準化
samples_scaler_np = (samples - samples.mean()) / np.std(samples)

# pandasでの標準化
samples_scaler_pd = (df - df.mean()) / df.std()

print('numpy',samples_scaler_np.mean(),np.std(samples_scaler_np))
print('pandas',samples_scaler_pd.mean(),samples_scaler_pd.std())
結果
numpy -1.2212453270876723e-16 1.0
pandas -1.110223e-16 1.0

numpyは標準偏差、pandasは不偏標準偏差を使って標準化したので、平均が少し異なることを確認できました!

続いて、sklearnで標準化してみます。

python
from sklearn.preprocessing import StandardScaler

# インスタンス化
scaler = StandardScaler()
scaler.fit(df)

# 標準化
df_samples_scaler = scaler.transform(df)

df_samples_scaler.mean(),df_samples_scaler.std()
結果
(-1.2212453270876723e-16, 1.0)

Numpyと同じように標準偏差で標準化したので、ちゃんと同じ値になっています。

最後に、pandasを使って、標準偏差で標準化してみましょう。

python
samples_scaler_pd = (df - df.mean()) / df.std(ddof=0)

print('pandas',samples_scaler_pd.mean())
結果
pandas -1.221245e-16 

今度はNumpyとPandasと同じ値になりました!

もしnumpy、pandas、sklearnで標準化後の値が違う時は、標準偏差、不偏標準偏差どちらを使っているか、確認すると良いでしょう。

参考リンク

参考 Pythonで基礎から機械学習 「重回帰分析」Qiita

コメントを残す