どうも。こんにちは。
ケミカルエンジニアのこーしです。
本日は、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冊です。
サンプルコードが非常に豊富なので、本文以外からも得るものがたくさんあります!