概要
scikit-learn
のRidge
/Lasso
は、それぞれRidge回帰、Lasso回帰のモデルを提供する。それぞれのモデルは、LinearRegression回帰に対してL2ノルム、L1ノルムによる正則化を付加する(Ridge回帰とLasso回帰を参照)。
モデルの利用方法の概要は以下の手順でLinearRegression
とほぼ同じだが、モデルインスタンス生成時に正則化に関するハイパーパラメーターalpha
を与える。
Ridge
/Lasso
のクラスをインポートする- ハイパーパラメーター
alpha
、solver
(収束計算方法)などを指定し、モデルのインスタンスを生成する fit()
メソッドに訓練データを与えて学習させる
学習済みのモデルの利用方法は以下の通り。
score()
メソッドにテストデータを与えて適合度を計算するpredict()
メソッドに説明変数を与えてターゲットを予測- モデルインスタンスのプロパティーからモデルのパラメーターを利用
- 切片は
intercept_
、重み係数はcoef_(
末尾のアンダースコアに注意)
- 切片は
利用例
以下はscikit-learnのBoston hose pricesデータのうち、2つの特徴量RM(1戸あたり部屋数)とLSTAT(下位層の人口比率)を取り出して、Ridge回帰/Lasso回帰のモデルを適用している。ハイパーパラメーターはalpha=1.0
で設定している(ここではpandasのDataFrame
を利用しているが、配列による操作についてはLinearRegression
を参照)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import pandas as pd from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import Ridge from sklearn.linear_model import Lasso ds = load_boston() df = pd.DataFrame(ds.data, columns=ds.feature_names) X = df[['RM', 'LSTAT']] y = ds['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) ridge = Ridge(alpha=1.0) lasso = Lasso(alpha=1.0) ridge.fit(X_train, y_train) lasso.fit(X_train, y_train) print("Ridge") print("Score:{}".format(ridge.score(X_test, y_test))) print("Prediction for (7, 5):{}".format(ridge.predict([[7, 5]]))) print("Intercept:{}".format(ridge.intercept_)) print("Coefficients:{}".format(ridge.coef_)) print() print("Lasso") print("Score:{}".format(lasso.score(X_test, y_test))) print("Prediction for (7, 5):{}".format(lasso.predict([[7, 5]]))) print("Intercept:{}".format(lasso.intercept_)) print("Coefficients:{}".format(lasso.coef_)) # Ridge # Score:0.5691622120420186 # Prediction for (7, 5):[31.13688148] # Intercept:-0.29837159723311046 # Coefficients:[ 4.97435821 -0.67705088] # # Lasso # Score:0.525315118713477 # Prediction for (7, 5):[30.24109273] # Intercept:21.32451435742197 # Coefficients:[ 1.87429627 -0.84069911] |
利用方法
Ridge
/Lasso
の利用方法はLineaRegression
とほとんど同じで、以下はそれぞれに特有の設定についてまとめる。
モデルクラスのインポート
scikit-learn.linear_model
パッケージからRidge
クラスをインポートする。
1 2 |
from sklearn.linear_model import Ridge from sklearn.linear_model import Lasso |
モデルのインスタンスの生成
Ridge
/Lasso
では、ハイパーパラメーターalpha
によって正則化の強さを指定する。
1 2 3 4 5 6 |
ridge = Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto', random_state=None) lasso = Lasso(alpha=1.0, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection='cyclic') |
以下、Ridge
とLasso
に特有のパラメーターのみ説明。LinearRegressionと共通のパラメーターはLinearRegressionを参照。
alpha
- 正則化の強さを実数で指定する。値が大きいほど正則化が強く効き、小さいほど弱くなる。
alpha=0
で正則化の効果はゼロとなり、通常線形回帰と同じになる。デフォルトは1.0。 max_iter
- 共役勾配法による収束計算の制限回数を指定する。’sparse_cg’と’lsqr’の場合はデフォルト値は
scipy.sparse.linalg
で規定され、’sag’の場合はデフォルト値は1000。 tol
- 収束計算の解の精度で、デフォルトは1e-3。
solver
'auto'
、'svd'
、'cholesky'
、'lsqr'
、'sparse_cg'
、'sag'
、'saga'
のうちから選択される。デフォルトは'auto'
。random_state
- データをシャッフルする際のランダム・シードで、solver=’sag’の際に用いる。
モデルの学習
fit()
メソッドに特徴量とターゲットの訓練データを与えてモデルに学習させる(回帰係数を決定する)。
1 |
lr.fit(X, y) |
X
- 特徴量の配列。2次元配列で、各列が各々の説明変数に対応し、行数はデータ数を想定している。変数が1つで1次元配列の時は
reshape(-1, 1)
かスライス([:, n:n+1]
)を使って1列の列ベクトルに変換する必要がある。 y
- ターゲットの配列で、通常は1変数で1次元配列。
3つ目の引数sample_weight
は省略。
適合度の計算
score()
メソッドに特徴量とターゲットを与えて適合度を計算する。
1 |
lr.score(X, y) |
戻り値は適合度を示す実数で、回帰計算の決定係数R2で計算される。
(1)
モデルによる予測
predict()
メソッドに特徴量を与えて、ターゲットの予測結果を得る。
1 |
y_pred = lr.predict(X) |
ここで特徴量Xは複数のデータセットの2次元配列を想定しており、1組のデータの場合でも2次元配列とする必要がある。
1 |
y_pred = lr.pred([[x1, x2,..., xm]]) |
また、結果は複数のデータセットに対する1次元配列で返されるため、ターゲットが1つの場合でも要素数1の1次元配列となる。
切片・係数の利用
fit()メソッドによる学習後、モデルの学習結果として切片と特徴量に対する重み係数を得ることができる。
各々モデル・インスタンスのプロパティーとして保持されており、切片はintercept_
で1つの実数、重み係数はcoeff_
で特徴量の数と同じ要素数の1次元配列となる(特徴量が1つの場合も要素数1の1次元配列)。
1 2 |
ic = lr.intercept_ cf = lr.coeff_ |
末尾のアンダースコアに注意。