Traffine I/O

日本語

2022-12-15

Pandas DataFrameの正規化

DataFrameの正規化

データ正規化は、異なるスケールで測定された値を共通のスケールに調整するプロセスです。この記事では、Scikit-learnを使用してPandas DataFrameに正規化を適用する方法について紹介します。

Min-Max正規化

Min-Max正規化は、属性を[0,1]の範囲にスケーリングする技術です。これは、データセットの最小値を引き、データセットの範囲で除算することで行われます。

Pythonでの実装例を示します。

python
from sklearn.preprocessing import MinMaxScaler

# Create a sample DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': [100, 200, 300, 400, 500]
})

# Create a scaler object
scaler = MinMaxScaler()

# Fit and transform the DataFrame
df_normalized = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)

正規化されたDataFrame (df_normalized) は以下のようになります。

     A    B    C
0  0.0  0.0  0.0
1  0.25 0.25 0.25
2  0.5  0.5  0.5
3  0.75 0.75 0.75
4  1.0  1.0  1.0

標準化

標準化は、属性を変換して得られる分布の平均が0、標準偏差が1になるようにする技術です。データセットの平均値を引き、標準偏差で除算します。

Pythonでの実装例を示します。

python
import pandas as pd
from sklearn.preprocessing import StandardScaler

# Create a sample DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': [100, 200, 300, 400, 500]
})

# Create a scaler object
scaler = StandardScaler()

# Fit and transform the DataFrame
df_normalized = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)

標準化されたDataFrame (df_normalized) は以下のようになります。

          A         B         C
0 -1.414214 -1.414214 -1.414214
1 -0.707107 -0.707107 -0.707107
2  0.000000  0.000000  0.000000
3  0.707107  0.707107  0.707107
4  1.414214  1.414214  1.414214

fitとtransformの分離

いくつかの場合では、fittransformのプロセスを分離する必要があります。特に、同じスケーリングパラメータを異なるデータセット(例: 訓練セットとテストセット)に適用する必要がある場合です。

まず、fitメソッドを使用して訓練セットで最小値、最大値、平均、標準偏差(正規化手法に応じる)を計算します。その後、transformメソッドを使用して訓練セットとテストセットを正規化します。

Pythonでの例を示します。

python
# Create a scaler object
scaler = StandardScaler()

# Apply fit method to training data
scaler.fit(df_train)

# Use transform method on both training and test data
df_train_normalized = pd.DataFrame(scaler.transform(df_train), columns=df_train.columns)
df_test_normalized = pd.DataFrame(scaler.transform(df_test), columns=df_test.columns)

fitメソッドは訓練データからパラメータを学習し、transformメソッドはこれらのパラメータを使用してデータを正規化します。これにより、訓練データとテストデータの両方が同じパラメータで正規化され、機械学習パイプラインでの一貫性が保たれます。

逆変換: 元の値に戻す

正規化後、データを元の形式に戻したい場合は、inverse_transformメソッドを使用することができます。これは、結果を元のスケールで解釈したい場合に役立ちます。

逆変換を行う方法を以下に示します。

python
# Inverse transform the normalized data
df_inverse = pd.DataFrame(scaler.inverse_transform(df_normalized), columns=df.columns)

この操作後、df_inverseは元のDataFrame dfと同じになります。

特定の列の正規化

特定の列のみを正規化する必要がある場合、スケーラーをそれらの特定の列に適用することで実現できます。

Pythonでの方法を示します。

python
# Create a scaler object
scaler = StandardScaler()

# Apply fit_transform to specific columns
df['A'] = scaler.fit_transform(df[['A']])

この例では、列「A」のみが正規化されています。fit_transform関数にDataFrameを渡すために、二重の括弧[['A']]を使用していることに注意してください。これは、scikit-learnが2次元の入力データを期待するためです。

複数の列に対しては、列名のリストを単純に指定します。

python
df[['A', 'B']] = scaler.fit_transform(df[['A', 'B']])

これにより、「A」と「B」の列のみが正規化され、DataFrameの残りの部分は変更されません。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!