見出し画像

機械学習のための対数変換 - NumPyのlog1p関数

正規分布していない特徴量や目的変数を対数変換することで、予測精度が向上することがある。なんとなく使っていた対数変換について、ChatGPTに教えてもらったのでメモ。


対数とは

対数は、ある正の数が別の正の数を何乗したものかを示す数学的操作です。主に、「大きな数値を小さくして扱いやすくする」ために用います。例えば、基数10の対数では、10を何乗するとある数になるかを示します。

基数10の対数

基数10の対数関数

対数関数のグラフは、xの値が増えるにつれてyも増えますが、増加のペースは次第に鈍化します。これは対数が大きな数値範囲を効果的に小さくする性質を表しています。

基数10の対数関数


基数10の対数関数のグラフ


収入データの対数変換

収入データは通常、正規分布しません。高収入の少数派と、それより低い収入を得る大多数の存在がその理由です。このようなデータに対数変換を施すと、偏りが軽減され外れ値の影響が緩和されます。結果として、データ分析やモデル学習が容易になります。

収入データの対数変換

機械学習における対数変換

機械学習では、対数変換は以下のような効果を提供します。

  • 偏りの軽減:一部の大きな値によって生じるデータの偏りを軽減できます。

  • 外れ値の影響緩和:データの外れ値による影響を緩和できます。

  • 正規分布への近似:多くの機械学習モデルが正規分布するデータを前提としているため、非正規分布データを正規分布に近づけることで、予測精度が向上する可能性があります。

注意点:ゼロや負の値では対数関数が定義されていないため、NumPyのlog1p関数が有効です。この関数は1を加えた値に対して対数を取り、対数変換を実現します。

サンプルコード

基数10の対数関数のグラフ

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1, 10000, 400)
y = np.log10(x)

plt.figure(figsize=(8, 6))
plt.plot(x, y)
plt.title("Logarithmic Function Graph")
plt.xlabel("x")
plt.ylabel("log10(x)")
plt.grid(True)
plt.show()

収入データのランダム生成と対数変換

# 収入データをランダムに生成(非正規分布)
income_data = np.random.lognormal(mean=2, sigma=0.5, size=1000)

# 元のデータと対数変換後のデータのヒストグラム
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.hist(income_data, bins=50, color='blue', alpha=0.7)
plt.title("Original Income Data Distribution")
plt.xlabel("Income")
plt.ylabel("Frequency")

plt.subplot(1, 2, 2)
plt.hist(np.log(income_data), bins=50, color='green', alpha=0.7)
plt.title("Log-transformed Income Data Distribution")
plt.xlabel("Log(Income)")
plt.ylabel("Frequency")

plt.tight_layout()
plt.show()



この記事が気に入ったらサポートをしてみませんか?