広告 Python データの前処理

【python】標準化モジュールを作成しよう!

2022年8月14日

標準化モジュール作成

どうも。こんにちは。
ケミカルエンジニアのこーしです。

本日は、pythonの標準化モジュールの作成方法ついてお話します。

データ解析をする上で「標準化」は欠かせない前処理の一つですが、様々なライブラリに実装されているため、どれを使うべきかわからなくなります。

そこで、本記事では自作した関数をモジュール化して、標準化を行う方法を解説します。

コード自体は簡単なので、実際に手を動かしながら読んでみてください!

本記事の内容

・【python】標準化コード
・サンプルデータの標準化
・ライブラリを使用する方法
・参考文献

この記事を書いた人

プロフィール231130

こーし(@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を使いこなせれば問題ないですね。

 

ライブラリを使用する方法

本記事では、ライブラリを使用する方法は解説しませんが、参考記事を紹介します。

1.note.nkmk.me

Scipyやscikit-learnを使う方法が紹介されています。

 

2.DXCEL WAVE

こちらでもscikit-leanを使う方法が紹介されています。

 

上記2記事では、標準化とは何か?とか、標準化と正規化の違いといった基本的なことも解説してくれていますので、時間があれば覗いてみてください。

参考文献

1.スモールデータ解析と機械学習

本記事は、主にこちらの書籍を参考に執筆しました。

本書では、極力ライブラリを使用せずnumpyのみでデータ解析を実施していきます。

よって、細かいところも自分でコードを書くのでより理解が深まると思います。

私はずいぶん理解が深まったので、オススメの1冊ですね!

 

2.化学のための Pythonによるデータ解析・機械学習入門

化学系の方なら持っていて損はしない1冊です。

サンプルコードが非常に豊富なので、本文以外からも得るものがたくさんあります!

 

  • この記事を書いた人
  • 最新記事

こーし

■ケミカルエンジニア
■化学メーカー勤務
■現場配属の生産技術
■化学工学技士、統計検定1級など
■化学工学 × データサイエンス
pythonと数理統計学を勉強中!

-Python, データの前処理
-, ,