LoginSignup
1
0

More than 3 years have passed since last update.

第3回 Google Colaboratoryで始める機械学習のための特徴量エンジニアリング - スケーリング

Posted at

はじめに

本記事ではスケーリングと正規化について解説しています。本記事は主に「機械学習のための特徴量エンジニアリング」を参考とさせて頂いておりますので、気になる方は是非チェックしてみてください。

※本記事で解説するプログラムは全てこちらにあります。

スケーリングとは

数値データの取りうる範囲は決まっているものと決まっていないものがあります。カウントデータは基本的にデータの取りうる範囲が決まっておらず、線形回帰などの特徴量のスケールに敏感なモデルの場合外れ値や特徴量間でスケールの差異により学習が上手く出来ない場合があります。そのような場合に尺度を統一することをスケーリングといいます。スケーリングには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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0