どうも。こんにちは。
ケミカルエンジニアのこーしです。
本日は、pythonの標準化モジュールの作成方法ついてお話します。
データ解析をする上で「標準化」は欠かせない前処理の一つですが、様々なライブラリに実装されているため、どれを使うべきかわからなくなります。
そこで、本記事では自作した関数をモジュール化して、標準化を行う方法を解説します。
コード自体は簡単なので、実際に手を動かしながら読んでみてください!
本記事の内容
・【python】標準化コード
・サンプルデータの標準化
・ライブラリを使用する方法
・参考文献
この記事を書いた人

こーし(@mimikousi)
【python】標準化コード
コード量が少ないので、早速コードを見てみましょう!
下記のプログラムを書くファイル名は、「standardization.py」にしておきましょう。
import numpy as np
def autoscaling(X):
"""
データ行列を標準化します
Parameters
-----------
X : pandas.Dataframe or pandas.Series
データ行列
Returns
-----------
Xscale : pandas.Dataframe or pandas.Series
標準化後のデータ行列
meanX : pandas.Series or numpy.float64
平均値ベクトル
stdX : pandas.Series or numpy.float64
標準偏差ベクトル
"""
meanX = np.mean(X, axis=0)
stdX = np.std(X, axis=0, ddof=1) # ddof=1:不偏分散
Xscale = (X - meanX) / stdX
return Xscale, meanX, stdX
def scaling(x, meanX, stdX):
"""
データ行列の平均と標準偏差からサンプルを標準化します
Parameters
-----------
x : pandas.Dataframe or pandas.Series
標準化したいサンプル
meanX : pandas.Series or numpy.float64
平均値ベクトル
stdX : pandas.Series or numpy.float64
標準偏差ベクトル
Returns
-----------
xscale : pandas.Dataframe or pandas.Series
標準化後のサンプル
"""
xscale = (x - meanX) / stdX
return xscale
def rescaling(xscale, meanX, stdX):
"""
標準化されたサンプルを元のスケールに戻します
Parameters
-----------
xscale : pandas.Dataframe or pandas.Series
標準化後のサンプル
meanX : pandas.Series or numpy.float64
平均値ベクトル
stdX : pandas.Series or numpy.float64
標準偏差ベクトル
Returns
-----------
x : pandas.Dataframe or pandas.Series
元のスケールのサンプル
"""
x = stdX * xscale + meanX
return x
注意点としては、扱うデータセットの「型」です。
本記事では、pandasでデータセットを読み込みますので、pandasのDataframeかSeriesのデータセットを標準化します。
サンプルデータで実践
それでは実際にサンプルデータを標準化してみましょう。
コチラのGitHubページにある「normal_data.csv」と先ほどコードを書いた「standardization.py」を同じフォルダに保存してください。
それでは、サンプルデータを標準化するコードを書いていきましょう。
下記コードは、「test.ipynb」に書いていきましょう(.pyファイルでも良いです)。
初心者は、Jupyter Notebook(.ipynb)で1行ずつ確かめながら実行するのがオススメです。
import pandas as pd
import numpy as np
from standardization import autoscaling, scaling, rescaling
# 学習データを読み込みます
df = pd.read_csv('normal_data.csv')
# データをxとyに分けます。
x1 = df.iloc[:, :39]
x2 = df.iloc[:, 40:]
x = pd.concat([x1, x2], axis=1) # 説明変数 x
y = df.iloc[:, 39] # 目的変数 y
# データセットを表示します
print(x)
print(y)
# xとyをそれぞれ標準化します(autoscaling)
x_train, meanX, stdX = autoscaling(x)
y_train, meanY, stdY = autoscaling(y)
# 標準化(autoscaling)したデータセットを表示します
print(x_train)
print(y_train)
# 平均値と標準偏差を指定して標準化します(scaling)
x_train2 = scaling(x, meanX, stdX)
y_train2 = scaling(y, meanY, stdY)
# 標準化(scaling)したデータセットを表示します
print(x_train2)
print(y_train2)
# 標準化したデータセットを元に戻します(rescaling)
x_ = rescaling(x_train, meanX, stdX)
y_ = rescaling(y_train, meanY, stdY)
# 元に戻したデータセットを表示します
print(x_)
print(y_)
autoscalingは、データセットのみ与えることで自動的に標準化します。
一方、scalingではデータセットと平均値(ベクトル)、標準偏差(ベクトル)を指定して標準化します。
基本的には、autoscalingとrescalingを使いこなせれば問題ないですね。
ライブラリを使用する方法
本記事では、ライブラリを使用する方法は解説しませんが、参考記事を紹介します。
Scipyやscikit-learnを使う方法が紹介されています。
こちらでもscikit-leanを使う方法が紹介されています。
上記2記事では、標準化とは何か?とか、標準化と正規化の違いといった基本的なことも解説してくれていますので、時間があれば覗いてみてください。
参考文献
本記事は、主にこちらの書籍を参考に執筆しました。
本書では、極力ライブラリを使用せずnumpyのみでデータ解析を実施していきます。
よって、細かいところも自分でコードを書くのでより理解が深まると思います。
私はずいぶん理解が深まったので、オススメの1冊ですね!
2.化学のための Pythonによるデータ解析・機械学習入門
化学系の方なら持っていて損はしない1冊です。
サンプルコードが非常に豊富なので、本文以外からも得るものがたくさんあります!