EnsekiTT Blog

EnsekiTTが書くブログです。

Scikit-learnで標準化をする時にStandardScalerを使ってみた話

つまりなにしたの?

今まで前処理のコードはかなり自前で書いてしまうことが多くて、Scikit-learnの機能を使えていないな〜と思ったので、
StandardScaler見たいなシンプルな機能から使ってみることにした。
基本的にはPandasのDataFrameで定義されたデータセットに対して前処理を実施していく流れを切り出したものとする。
f:id:ensekitt:20181023115726j:plain

やりたいこと

  • ここでいう標準化とはなにか
  • 前処理をかけたいデータセットを用意する
  • StandardScalerを使った標準化
  • 自分で書いてた標準化

環境

 % python
Python 3.6.4 (default, Mar  2 2018, 00:45:54)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> import pandas
>>> import sklearn
>>> numpy.__version__
'1.15.3'
>>> pandas.__version__
'0.23.4'
>>> sklearn.__version__
'0.20.0'

ここでいう標準化とはなにか

ここで標準化はデータセットのある系列について、平均が0、標準偏差が1になるようにデータセットに係数をかけること。

 xをある系列のデータ(複数)とする。
 \mu xの平均値とする。
 \sigma x標準偏差とする。
 x_iをxのi番目のデータとする。
 x^{std}_iを標準化後のデータとする。

各データについて
 x^{std}_i = \frac{x_i - \mu}{\sigma}
を求めるのが標準化。
数式はここまでにして、実際にコードで実行してみる。

前処理をかけたいデータセットを用意する。

今回はこういった標準化を使いそうなデータセットとしてscikit-learnのdatasetsからwineのデータセットを用意してみた。
wineのデータセットとは
https://archive.ics.uci.edu/ml/datasets/wine
が元らしい。
イタリアの同じ地域で栽培された3種類の品種のワインを化学分析の結果からクラス分類しようとするもの。
化学分析の結果、13種類の成分量がデータセットに含まれている。結構簡単でサンプルとしては使いやすい。

import pandas as pd
from sklearn import datasets

wine_data = datasets.load_wine()
wine_df = pd.DataFrame(wine_data.data, columns=wine_data.feature_names)
wine_df.head()

f:id:ensekitt:20181023114501p:plain

こんな感じでデータセットを作ることができた。
ヒストグラムはアルコールについて表示したもの。

次はこのデータセットを各列(アルコール(alcohol)列やリンゴ酸(malic_acid)列等)を標準化していく。

StandardScalerを使った標準化

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(wine_df)
scaler.transform(wine_df)
wine_df_std = pd.DataFrame(scaler.transform(wine_df), columns=wine_df.columns)

標準化の結果
f:id:ensekitt:20181023114556p:plain

自分で書いてた標準化

wine_df_std2 = pd.DataFrame()
for series in wine_df:
    wine_df_std2[series] = (wine_df[series] - wine_df[series].mean())/wine_df[series].std()

数式通りに作るとこんな感じになるけど、データ型が違ったりした時のエラー処理とかで
ホントは結構煩雑なコードになる

自分で書いてた標準化の結果
f:id:ensekitt:20181023115335p:plain
小さい桁での多少の誤差はあるものの概ね標準化できている。

StandardScalerを使っていきたい

今後は普通に便利なStandardScalerを使っていく。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。