はじめに
AIモデルを構築する際、データの前処理は非常に重要です。
今回は、AIの前処理の一部であるスケーリング手法に焦点を当て、BoX-CoX変換について詳しく説明します。
BoX-CoX変換はあまり一般的に知られていないかもしれませんが、非常に有用なスケーリング手法です。
私はMATLABを使用してデータ分析をすることが多いため、Box-Cox変換のコードも提供します。
AIの基本的な知識は以下の記事が参考になります。
moririn-code.hatenablog.com
moririn-code.hatenablog.com
スケーリングとは
スケーリングは、データの値を特定の範囲や尺度に変換する処理を指します。
各データは、異なる尺度や物理量を持っています。例えば、データによっては色や学年のようなカテゴリカルな尺度を持ち、また別のデータでは長さ(cm)、距離(km)、重さ(kg)などの異なる物理量を持つことがあります。
我々がデータを扱う際には、これらの尺度や物理量を理解していますが、AIのプログラムはそのような理解を持っていません。AIに生データを学習させると、尺度や物理量の違いにより、一部の特徴量が支配的になり、他の特徴量が無視されてしまう可能性があります。AIを構築する際には、スケーリングを適切に前処理しておかないと、適切な予測や分類を行うことが難しくなります。
そのため、スケーリングを用いて異なるデータを同じ尺度に変換することで、モデルが公平に各特徴量を評価しやすくなり、適切にモデルを訓練および評価することができます。スケーリングの適用は一般的にモデルの性能向上に寄与します。
なお、ランダムフォレストなどのツリーベースのモデルは、特徴量のスケールに対して比較的頑健であるとされています。
代表的なスケーリング手法
代表的なスケーリング手法を紹介します。
正規化
正規化は、データを0から1の範囲に変換する手法で、最小値を0、最大値を1に対応づけます。
これにより、データが統一的なスケールで表現され、割合や百分率など最大値や最小値が事前に定まっている場合に特に有用です。
正規化の計算式は以下の通りです。
ここで、
X は元のデータ値
Xminはデータの最小値
Xmaxはデータの最大値
このスケーリング手法は、MATLABでは簡単に実装できます。以下はMATLABでの実装例です。
R = rescale(x)
標準化
標準化は、データを平均を0、分散を1となるように変換する手法です。
これにより、データが統一的なスケールで表現され、特に統計的手法や一部の機械学習アルゴリズムに適しています。
標準化の計算式は以下の通りです。
ここで、
X は元のデータ値
μ はデータの平均値
σ はデータの標準偏差
MATLABを使用する場合は、以下の方法で標準化を行うことができます。
R = normalize(x);
また、MATLABのStatistics and Machine Learning Toolboxというアドオンを利用して、標準化を行う場合は平均値と標準偏差も取得できます。
以下はその方法です。
[R, mu, sigma] = zscore(x);
Statistics and Machine Learning Toolboxは4,490円/年で購入が可能です。
Box-Cox変換によるスケーリング
AIや機械学習はデータの特性に対して非常に柔軟で、正規分布に厳密に従う必要はありませんが、前述した正規化や標準化では要求性能を満足しないことがあります。
そこで、データの分布を正規分布に近づけるための変換であるBox-Cox変換が有効になります。
Boc-Cox変換は以下の式で表されます。ただし、xは正の値である必要があります。
Box-Cox変換の式:
\begin{cases}
\frac{x^\lambda - 1}{\lambda}, & \text{if } \lambda \neq 0 \\
\ln(x), & \text{if } \lambda = 0
\end{cases}
ここで、
xは正の値
λは変換パラメータ
Box-Cox変換は、λの値によって異なる変換が適用されるため、最適なλを選択する必要があります。対数尤度が最大となるλを選択すればよいです。
負の値にも対応したものが、Yeo-Johnson変換ですが、ここでは取り扱いません。
MATLABでは以下のFinancial Toolboxというアドオンを利用して以下のように記述することができます。簡単ですね。
[transx,lambda] = boxcox(x);
Financial Toolboxは4,490円/年(税抜き)で購入が可能です。
ダム流入量データのスケーリング
MATLABでBox-Cox変換を簡単に使うためにはFinancial Toolboxを購入する必要があります。Financial Toolboxは一般の人はあまり使えそうな関数は少ないため、Box-Cox変換のためだけに購入するのはもったいないので、Box-Cox変換の数式を紐解き、追加のアドオンなしでMATLABに使える形で実装してみました。
使用データ
今回は国土交通省が管理しているダム諸量データベースのうち宮城県に位置する釜房ダムの流入量を使ってBox-Cox変換を行いました。
国土交通省 ダム諸量データベース:https://mudam.nilim.go.jp/home
MATLABで作成したサンプルコードは以下の通りです。
% データを用意
data = readmatrix('Kamafusa.csv');
% 0がある場合は計算できないので、置換
data(data==0)=0.1;
% パラメータの範囲を設定(通常は0から1の範囲)
lambda_range = -2:0.01:2;
% 対数尤度を格納する変数を初期化
log_likelihoods = zeros(size(lambda_range));
% 対数尤度を計算
for i = 1:length(lambda_range)
lambda = lambda_range(i);
% Box-Cox変換を適用
if lambda~=0
transformed_data = ((data.^lambda) - 1) / lambda;
else
transformed_data = log(data);
end
% 対数尤度を計算
sigma2=sum((transformed_data-mean(transformed_data)).^2)/length(data);
log_likelihoods(i)=-(length(data)/2)*log(sigma2)+(lambda-1)*sum(log(data));
end
% 最大対数尤度を持つλを選択
[~, idx] = max(log_likelihoods);
optimal_lambda = lambda_range(idx);
% 選択したλを使用してBox-Cox変換を適用
transformed_data = (data.^optimal_lambda - 1) / optimal_lambda;
% ヒストグラムをプロット
% 生データ、標準化データ、対数変換したデータ、Box-Cox変換したデータ
figure;
subplot(4,1,1);histogram(data);title("生データ");
subplot(4,1,2);histogram(zscore(data));title("標準化");
subplot(4,1,3);histogram(zscore(log(data)));title("対数変換した標準化");
subplot(4,1,4);histogram(zscore(transformed_data));title("BoxCox変換した標準化");
各スケーリング結果の比較
各スケーリングの結果は以下の通りです。
いかがでしょうか。グラフで可視化してもBox-Cox変換したデータが最も正規分布に近いのが分かります。
まとめ
今回はAIの前処理であるスケーリング手法について解説しました。Box-Cox変換というあまり馴染みのないスケーリング手法をご紹介しましたが、この手法はAIの精度改善にも役立つのでぜひ覚えておいてください。
次回はBox-Cox変換を使ってAIによる予測を行っていきます。
あなたはスケーリングにどのような工夫をしていますか?コメントで教えてください!