はじめに
本記事ではスケーリングと正規化について解説しています。本記事は主に「機械学習のための特徴量エンジニアリング」を参考とさせて頂いておりますので、気になる方は是非チェックしてみてください。
※本記事で解説するプログラムは全てこちらにあります。
スケーリングとは
数値データの取りうる範囲は決まっているものと決まっていないものがあります。カウントデータは基本的にデータの取りうる範囲が決まっておらず、線形回帰などの特徴量のスケールに敏感なモデルの場合外れ値や特徴量間でスケールの差異により学習が上手く出来ない場合があります。そのような場合に尺度を統一することをスケーリングといいます。スケーリングにはMin-Maxスケーリング, 標準化, L2正規化などがあるので順番に紹介していきましょう。スケーリングについてもっと詳しく知りたい方はこちらの記事を見てみてください。
Min-Maxスケーリング
Min-Maxスケーリングでは最小値を0最大値を1にします。外れ値が含まれる場合、その外れ値の影響で正常値の取りうる範囲が狭くなりすぎる場合があるので、基本は標準化を使う。
\tilde{x} = \frac{x - min(x)}{max(x) - min(x)}
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
##乱数固定
np.random.seed(100)
data_array = []
for i in range(1, 100):
s = np.random.randint(0, i * 10, 10)
data_array.extend(s)
data_array.extend(np.zeros(100))
data = pd.DataFrame({'Listen Count': data_array})
print(data.max()) # 977.0
print(data.min()) # 0
scaler = MinMaxScaler()
data_n = scaler.fit_transform(data)
data_n = pd.DataFrame(data_n)
print(data_n.max()) ## 1.0
print(data_n.min()) ## 0
標準化
標準化では平均を0, 分散を1とします。元の特徴量が正規分布の場合標準化された特徴量は標準正規分布になります。
\tilde{x} = \frac{x - mean(x)}{sqrt(var(x))}
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
##乱数固定
np.random.seed(100)
data_array = []
for i in range(1, 100):
s = np.random.randint(0, i * 10, 10)
data_array.extend(s)
data_array.extend(np.zeros(100))
data = pd.DataFrame({'Listen Count': data_array})
scaler = StandardScaler()
data_n = scaler.fit_transform(data)
data_n = pd.DataFrame({'Listen Count': data_n.ravel()})
print(data_n.var()) ##1.000918
print(data_n.mean()) ##6.518741e-17
L2正規化
L2正規化はL2ノルムで割ることで特徴量を正規化します。
\tilde{x} = \frac{x}{||x||_2} \\
||x||_2 = \sqrt{x_1^2 + x_2^2+ ...+x_m^2 }
import numpy as np
import pandas as pd
from sklearn.preprocessing import normalize
##乱数固定
np.random.seed(100)
data_array = []
for i in range(1, 100):
s = np.random.randint(0, i * 10, 10)
data_array.extend(s)
data_array.extend(np.zeros(100))
data = pd.DataFrame({'Listen Count': data_array})
##L2正規化
data_l2_normalized = normalize([data['Listen Count']],norm='l2')
data_l2 = pd.DataFrame({'Listen Count': data_l2_normalized.ravel()})
print(np.linalg.norm(data_l2_normalized,ord=2)) ## 0.999999999
最後に
YouTubeでITに関する動画を上げていこうと思っています。
YoutubeとQiita更新のモチベーションに繋がるため、いいね、チャンネル登録、高評価をよろしくお願い致します。
YouTube: https://www.youtube.com/channel/UCywlrxt0nEdJGYtDBPW-peg
Twitter: https://twitter.com/tatelabo