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 で標準化後の値が違う時は、標準偏差、不偏標準偏差どちらを使っているか、確認すると良いでしょう。
コメントを残す