AIって結局何なのかよく分からないので、とりあえず100日間勉強してみた Day27
経緯についてはこちらをご参照ください。
■本日の進捗
●単変量非線形変換を理解
■はじめに
引き続き「Pythonではじめる機械学習(オライリー・ジャパン)」で学んでいきます。
これまでモデルが学習しやすいように交互作用特徴量や多項式特徴量を学んできました。今回はその仲間であるその他の非線形変換を学んでいきます。
■単変量非線形変換
単変量非線形変換(univariate nonlinear transformation)は、線形モデルの精度向上やデータ分布の修正を行う非線形変換の仲間で、その中でも1つの特徴量(単変量)に対して行うものを指します。
その中でも対数変換や指数変換はデータの相対スケールを修正するので、ガウス分布に従っている場合に良く機能します。
「Pythonではじめる機械学習」でも生成している現実に近いカウントデータを用いて、まずは単純にリッジ回帰を適用してみたいと思います。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
rnd = np.random.RandomState(0)
X_org = rnd.normal(size=(1000, 3))
w = rnd.normal(size=3)
X = rnd.poisson(10 * np.exp(X_org))
y = np.dot(X_org, w)
model_ridge = Ridge(alpha=1.0)
model_ridge.fit(X, y)
y_pred = model_ridge.predict(X)
plt.scatter(X[:, 0], y, color='orange', label='values')
plt.scatter(X[:, 0], y_pred, color='green', label='predicted')
plt.xlabel('Feature 1')
plt.ylabel('Target')
plt.title('Ridge Regression')
plt.legend()
plt.show()

第1特徴量の値が小さいほどデータ数が多いカウントデータをリッジ回帰で学習させてみました。線形モデルではデータのカーブを再現できていません。
次に対数変換を行ってから学習させてみます。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
rnd = np.random.RandomState(0)
X_org = rnd.normal(size=(1000, 3))
w = rnd.normal(size=3)
X = rnd.poisson(10 * np.exp(X_org))
y = np.dot(X_org, w)
X_log_transformed = np.log(X + 1)
model_ridge = Ridge(alpha=1.0)
model_ridge.fit(X_log_transformed, y)
y_pred = model_ridge.predict(X_log_transformed)
plt.scatter(X[:, 0], y, color='orange', label='values')
plt.scatter(X[:, 0], y_pred, color='green', label='predicted')
plt.xlabel('Feature 1')
plt.ylabel('Target')
plt.title('Ridge Regression (Log Transformed)')
plt.legend()
plt.show()

データの特徴に則した予測ができるようになっています。
■おわりに
現実にありそうな比較的単純なデータに対して、このような変換を前処理として行うことで線形モデルでも十分な精度が出せるようになります。単変量の場合にはよりそのデータの特徴を捉えて扱うことが重要になりそうですね。
■参考文献
- Andreas C. Muller, Sarah Guido. Pythonではじめる機械学習. 中田 秀基 訳. オライリー・ジャパン. 2017. 392p.
- ChatGPT. 4o mini. OpenAI. 2024. https://chatgpt.com/
- API Reference. scikit-learn.org. https://scikit-learn.org/stable/api/index.html