DataFrameの正規化
データ正規化は、異なるスケールで測定された値を共通のスケールに調整するプロセスです。この記事では、Scikit-learnを使用してPandas DataFrameに正規化を適用する方法について紹介します。
Min-Max正規化
Min-Max正規化は、属性を[0,1]の範囲にスケーリングする技術です。これは、データセットの最小値を引き、データセットの範囲で除算することで行われます。
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での実装例を示します。
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の分離
いくつかの場合では、fit
とtransform
のプロセスを分離する必要があります。特に、同じスケーリングパラメータを異なるデータセット(例: 訓練セットとテストセット)に適用する必要がある場合です。
まず、fit
メソッドを使用して訓練セットで最小値、最大値、平均、標準偏差(正規化手法に応じる)を計算します。その後、transform
メソッドを使用して訓練セットとテストセットを正規化します。
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
メソッドを使用することができます。これは、結果を元のスケールで解釈したい場合に役立ちます。
逆変換を行う方法を以下に示します。
# Inverse transform the normalized data
df_inverse = pd.DataFrame(scaler.inverse_transform(df_normalized), columns=df.columns)
この操作後、df_inverse
は元のDataFrame df
と同じになります。
特定の列の正規化
特定の列のみを正規化する必要がある場合、スケーラーをそれらの特定の列に適用することで実現できます。
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次元の入力データを期待するためです。
複数の列に対しては、列名のリストを単純に指定します。
df[['A', 'B']] = scaler.fit_transform(df[['A', 'B']])
これにより、「A」と「B」の列のみが正規化され、DataFrameの残りの部分は変更されません。