説明変数 x と目的変数 y との間で回帰モデル y = f(x) を構築するとき、x と y の間の関係を的確に表現したり、モデルの予測精度を向上させたりするため、y を対数変換して用いることがあります。化学的・物理的な背景や x と y の関係から対数変換したほうがよいこともありますし、y にスケールが異なる値が含まれるようなデータセットを扱うときに対数変換すると結果がよくなることがあります。x と対数変換した y との間でモデルを構築し、x の値から (対数変換後のスケールの) y の値を予測した後に、予測値を指数変換すれば、元の y のスケールに戻すことができます。対数変換によるモデルの予測精度の向上に関して、どのようなサンプルの予測精度を向上できるのかについては、こちらをご覧ください。
対数変換の検討は一般的に行われていますが、問題点の一つとして、y に 0 が含まれるときに log(0) を計算できないため、y を対数変換できないことがあげられます。こんなときはどうしたらよいでしょうか?
結論から言いますと、y の 0 以外の最小値を、すべてのサンプルの y に足してから対数変換するとよいと思います。y において、0 以外で求めた最小値 ymin を、すべてのサンプルにおける y に足します。例えば、もともと 0 であったサンプルは ymin になりますし、元々 ymin であったサンプルは 2ymin になります。この後、対数変換をします。式は、
ylog = log(y + ymin)
となります。
モデルを構築し、x の値から y の値を予測した後は、指数変換してから ymin を引きますと、元の y に戻すことができます。
y = exp(ylog) − ymin
0 以外で求めた最小値 ymin を足してから対数変換する考え方として、基本的にはオリジナルの y の値を対数変換したいのですが、0 が含まれていると対数変換できませんので、できる限りオリジナルの y の値に対する影響が少ない最小値を足します。切りのよい 1 を足すことも考えられますが、例えば y の値が非常に小さいとき、例えば 10−10 に対して 1 を足してしまうと、値が大きく異なってしまいます。逆に、非常に小さい数字、例えば 10−100 を足してしまうと、対数変換した後に他の値と比べて負に大きくなることがあり、具合が悪いです。そのため 0 以外で求めた最小値 ymin という、対数変換前後の y に対して比較的影響の小さい値を足してから、対数変換するとよいと思います。ぜひご活用ください。
以上です。
質問やコメントなどありましたら、twitter, facebook, メールなどでご連絡いただけるとうれしいです。