マルチタスク Lasso を用いた共通特徴選択

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、マルチタスク Lasso アルゴリズムを使用して共通の特徴選択を行う方法を検討します。人気のある Python 機械学習ライブラリである scikit-learn を使用して、いくつかのサンプルデータを生成し、それにモデルを適合させます。その後、モデルの結果をプロットして、それらがどのように比較されるかを見ます。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題が発生した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

データの生成

まず、モデルに適合させるためのサンプルデータを生成する必要があります。numpy を使って 100 個のサンプルを生成し、それぞれ 30 個の特徴と 40 個のタスクを持たせます。また、5 つの関連する特徴をランダムに選択し、ランダムな周波数と位相の正弦波を使ってそれらに係数を作成します。最後に、データにいくつかのランダムノイズを追加します。

import numpy as np

rng = np.random.RandomState(42)

## ランダムな周波数と位相の正弦波を使った 2 次元係数を生成する
n_samples, n_features, n_tasks = 100, 30, 40
n_relevant_features = 5
coef = np.zeros((n_tasks, n_features))
times = np.linspace(0, 2 * np.pi, n_tasks)
for k in range(n_relevant_features):
    coef[:, k] = np.sin((1.0 + rng.randn(1)) * times + 3 * rng.randn(1))

X = rng.randn(n_samples, n_features)
Y = np.dot(X, coef.T) + rng.randn(n_samples, n_tasks)

モデルの適合

データが用意できたので、Lasso とマルチタスク Lasso アルゴリズムを使ってモデルを適合させることができます。各タスクに対して Lasso モデルを適合させ、その後、すべてのタスクに対して一度にマルチタスク Lasso モデルを適合させます。

from sklearn.linear_model import MultiTaskLasso, Lasso

coef_lasso_ = np.array([Lasso(alpha=0.5).fit(X, y).coef_ for y in Y.T])
coef_multi_task_lasso_ = MultiTaskLasso(alpha=1.0).fit(X, Y).coef_

結果のプロット

最後に、モデルの結果をプロットして、それらがどのように比較されるかを見ることができます。各モデルのサポート(すなわち、ゼロでない係数の位置)と、1 つの特徴の時系列をプロットします。

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8, 5))
plt.subplot(1, 2, 1)
plt.spy(coef_lasso_)
plt.xlabel("Feature")
plt.ylabel("Time (or Task)")
plt.text(10, 5, "Lasso")
plt.subplot(1, 2, 2)
plt.spy(coef_multi_task_lasso_)
plt.xlabel("Feature")
plt.ylabel("Time (or Task)")
plt.text(10, 5, "MultiTaskLasso")
fig.suptitle("Coefficient non-zero location")

feature_to_plot = 0
plt.figure()
lw = 2
plt.plot(coef[:, feature_to_plot], color="seagreen", linewidth=lw, label="Ground truth")
plt.plot(
    coef_lasso_[:, feature_to_plot], color="cornflowerblue", linewidth=lw, label="Lasso"
)
plt.plot(
    coef_multi_task_lasso_[:, feature_to_plot],
    color="gold",
    linewidth=lw,
    label="MultiTaskLasso",
)
plt.legend(loc="upper center")
plt.axis("tight")
plt.ylim([-1.1, 1.1])
plt.show()

まとめ

この実験では、マルチタスク Lasso アルゴリズムを使って共通の特徴選択を行う方法を学びました。いくつかのサンプルデータを生成し、Lasso とマルチタスク Lasso を使ってそれにモデルを適合させ、結果をプロットしました。Lasso アルゴリズムと比較して、マルチタスク Lasso アルゴリズムの方が、すべてのタスクにわたって関連する特徴を選択する能力が高いことがわかります。