【機械学習】地味だけど手軽で便利な「対数変換」

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践という本を読んだので、今日はその備忘録です。

今回は対数変換について。具体的には、高校で習う対数関数(\log_a xでお馴染みのやつ)を使って、特徴量のスケール*1を変換しようというお話しです。


早速、説明に入っていきましょう。

(以下、図は原著者のGitHub*2より引用。)

f:id:mimosom:20190413114107p:plain:w500
対数関数のグラフ

上のグラフは、底10の対数関数(俗に言う常用対数)のグラフです。

今回は、これを使って特徴量の数値データを変換(写像)します。変換とか写像なんて大そうなことを言っていますが、要は\log_{10} xxに数値を代入するだけです。
例えば、上記グラフで横軸xが200のときは縦軸が2.3辺りを示していますよね(\log_{10} (200) \simeq 2.3)。

こんな感じで変換していくので、例えば[1, 100]の範囲は[0, 2]、[100, 1000]の範囲は[2, 3]に写されます。x軸の1から100までの(小さな)範囲がy軸の0から2に、x軸の100から1000までの(大きな)範囲がy軸で2から3に写されるということです。

つまり対数変換によって、 xのスケールの小さい部分が拡大され、大きい部分が縮小されるんですね。

ではこの変換の何が嬉しいのか?

例えば、以下の図の、上側のグラフのようなヒストグラムで表されるデータがあったとしましょう。

f:id:mimosom:20190413135615p:plain

対数変換前のグラフ(上側)と変換後のグラフ(下側)

値の小さい範囲(0付近)にデータが集中していて、やや裾が長い分布になっています。

これを対数変換することで、下側のヒストグラムのように値の集中が緩和され、横軸上でのデータの広がりが大きくなっています。(0.0に位置するデータを無視すると)お馴染みの正規分布のような分布になっていますね。詳しくは他に譲りますが、対数変換によって、このように扱いやすい分布に近似できるのです。

こういった変換があることを頭の片隅に置いておくと、生データを見て「このままじゃ扱いにくいな」と感じた時に役立つかもしれませんね。

*1:数値データのとる範囲とその規模のこと

*2:https://github.com/alicezheng/feature-engineering-book

本書は、機械学習モデルの性能を向上させるために、データから良い特徴量を作る特徴量エンジニアリングについて解説します。特徴量エンジニアリングの原理について直感的な理解が得られるように図や例を豊富に使い、またPythonコードによる実行例を数多くあげて解説しており、実際の業務に適用するための具体的な知識が得られます。特徴量エンジニアリングを使いこなし、機械学習モデルの性能を最大限に引き出したいエンジニア必携の一冊です。

コメント