つまりなにしたの?
今まで前処理のコードはかなり自前で書いてしまうことが多くて、Scikit-learnの機能を使えていないな〜と思ったので、
StandardScaler見たいなシンプルな機能から使ってみることにした。
基本的にはPandasのDataFrameで定義されたデータセットに対して前処理を実施していく流れを切り出したものとする。
やりたいこと
- ここでいう標準化とはなにか
- 前処理をかけたいデータセットを用意する
- 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のi番目のデータとする。
を標準化後のデータとする。
各データについて
を求めるのが標準化。
数式はここまでにして、実際にコードで実行してみる。
前処理をかけたいデータセットを用意する。
今回はこういった標準化を使いそうなデータセットとして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()
こんな感じでデータセットを作ることができた。
ヒストグラムはアルコールについて表示したもの。
次はこのデータセットを各列(アルコール(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)
標準化の結果
自分で書いてた標準化
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()
数式通りに作るとこんな感じになるけど、データ型が違ったりした時のエラー処理とかで
ホントは結構煩雑なコードになる
自分で書いてた標準化の結果
小さい桁での多少の誤差はあるものの概ね標準化できている。
StandardScalerを使っていきたい
今後は普通に便利なStandardScalerを使っていく。