メインコンテンツへスキップ

Scikit-learnのLassoクラスによるラッソ回帰

·1432 文字·3 分
目次

はじめに
#

ラッソ回帰 (Lasso regression) は回帰手法の1つで、\(L_1\)ノルムを用いて回帰係数の重みに制限を加えることで、予測性能を向上させることを目的としています。LassoはLeast Absolute Shrinkage and Selection Operatorの略です。

この記事ではPythonとScikit-learnによるサンプルコードも示します。実行環境は以下の通りです。

  • Python: 3.9.7
  • NumPy: 1.20.3
  • sklearn: 0.24.2

ラッソ回帰モデル
#

ラッソ回帰の予測モデルは、重回帰モデルリッジ回帰モデルと同様に次式で表されます。

$$ y = w_1 x_1 + w_2 x_2 + ... + w_N x_N + w_0 $$

ここで、説明変数の数を\(N\), 説明変数を\(x_1, x_2, ..., x_N\), 目的変数を\(y\)と置いています。また、\(w_1, w_2, ..., w_N\)は重み、\(w_0\)は切片です。簡単のため、重みと係数をまとめて

$$\boldsymbol{w}=[w_0, w_1, w_2, ..., w_N]^{\top}$$

とベクトル化します。

ラッソ回帰では、最小化する関数として次式の\(J(\boldsymbol{w})\)を考えます。

$$ J(\boldsymbol{w}) = \mathrm{MSE}(\boldsymbol{w}) + \alpha \sum_{i=1}^{M} |\boldsymbol{w}_i| $$

ここで、\(\mathrm{MSE}(\boldsymbol{w})\)は予測値と実際の目的変数の平均二乗誤差です。

リッジ回帰の正則化項は\(L_2\)ノルムでした。一方、ラッソ回帰の正則化項は、係数の絶対値の和、すなわち\(L_1\)ノルムとなります。ラッソ回帰では、重要でない特徴量に対して、その重み係数の値を0にする、すなわちその特徴量をモデルから完全に除くという特性があります。

scikit-learnのラッソ回帰
#

Lassoクラス
#

scikit-learnではsklearn.linear_model.Lassoというクラスにラッソ回帰が実装されています。

sklearn.linear_model.Lasso(alpha=1.0, fit_intercept=True,
    normalize='deprecated', precompute=False, copy_X=True,
    max_iter=1000, tol=0.0001, warm_start=False, positive=False,
    random_state=None, selection='cyclic')

主なパラメータの意味は以下の通りです。

  • alpha (float): 正則化のパラメータです。デフォルト値は1.0.
  • fit_intercept (bool): Trueの場合、切片を計算します。予測モデルが原点を通ることが想定される場合はFalseに設定します。
  • tol (float): 最適化の許容誤差です。双対ギャップがtol以下になると計算を停止します。デフォルトは1e-4.
  • random_state (int/None): 学習時の乱数シード。selection'random'のとき、常に同じ結果を得たい場合は適当な整数を指定します。Noneの場合、結果は変わり得ます。デフォルトはNone
  • selection (str): 'cyclic'に設定すると、係数を順々に更新します。'random'に設定すると、係数をランダムな順序で更新します。tol1e-4より大きい場合、'random'に設定すると早く収束する可能性が高くなります。

また、主なメソッドは以下の通りです。

  • fit(X, y): 特徴量X, クラスyを教師データとして学習する。
  • predict(X): 特徴量Xに対する予測結果を返す。

使用例
#

Lassoクラスの使用例を示します。X_trainは行がサンプル、列が特徴量の2次元配列です(PandasのDataFrameなどでも可)。y_trainは目的変数の1次元配列です。次に、Lassoクラスのオブジェクトをregという名前で作成します(regはregressorから名付けています)。

import numpy as np
from sklearn.linear_model import Lasso

# 学習データ
X_train = np.array([[0, 1],
                    [3, 2],
                    [5, -2]])
y_train = np.array([3, 10, 23])

reg = Lasso(alpha=1.5)

fitメソッドで学習し、predictメソッドで予測します。予測結果は1次元配列となります。

# 学習
reg.fit(X_train, y_train)

X_test = np.array([[2, 1],
                   [8, 2]])
# 予測
y_pred = reg.predict(X_test)
print(y_pred)

実行結果

[ 9.22447665 24.59750414]

係数を確認するにはreg.coef_, 切片を確認するにはreg.intercept_を表示します。

print(reg.coef_)

print(reg.intercept_)

実行結果

[ 2.79090179 -1.37238324]

5.015056310435725

参考
#

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

Scikit-learnのRidgeクラスによるリッジ回帰
·1860 文字·4 分
Scikit-learnのRidgeクラスによるリッジ回帰について解説します。
Scikit-learnのLinearRegressionクラスによる線形回帰
·1902 文字·4 分
Scikit-learnのLinearRegressionクラスによる線形回帰について解説します。
Scikit-learnのSVCクラスによるサポートベクターマシン
·1924 文字·4 分
サポートベクターマシン (SVM, support vector machine) は分類アルゴリズムの1つです。SVMは線形・非線形な分類のどちらも扱うことができます。また、構造が複雑な中規模以下のデータの分類に適しています。
分類モデルの評価指標
·2287 文字·5 分
分類モデルの評価指標としてよく用いられる、混同行列、F値、ROC曲線、AUCについて解説します。
Scikit-learnのDecisionTreeClassifierクラスによる分類木
·3865 文字·8 分
分類木 (classification tree) は、分析したデータが属するカテゴリー(クラス)を予測する分類アルゴリズムの1つです。分類木では、Yes/Noによる分岐を何度か繰り返して、分類の予測を返します。
Scikit-learnのPolynomialFeaturesでべき乗を求める
·1917 文字·4 分
PolynomialFeaturesクラスの引数とメソッドについて解説する。また、特徴量の数を1~3まで変化させ、オプションによって出力がどのように変化するか確認する。