ラッソモデルの選択:相互検証/ AIC / BIC

赤池情報量基準(AIC)、ベイズ情報量基準(BIC)、および交差検定を使用して、ラッソ推定器の正則化パラメーターαの最適値を選択します。

LassoLarsIC得られた結果は、AIC / BIC標準に基づいています。

情報量基準に基づくモデル選択は非常に高速ですが、自由度の適切な推定に依存し、大きなサンプル(漸近結果)に対して導出され、モデルが正しいこと、つまりデータが実際にモデルによって生成されていることを前提としています。の。また、問題の状態が悪い場合(サンプルよりも多くの機能)に破損する傾向があります。

相互検証では、2つのアルゴリズムを使用してラッソパスを計算します。座標降下(LassoCV类実装による)とラース(最小角度回帰)(LassoLarsCV类実装による)です。2つのアルゴリズムの結果はほぼ同じです。実行速度や数値誤差の原因が異なります。

Larsは、パス内の各キンクのパスソリューションのみを計算します。したがって、特徴やサンプルが少ない場合のように、ねじれが少ない場合に非常に効果的です。パラメータを設定する必要はありません。メタはフルパスを計算することもできます。代わりに、座標降下計算はグリッド上のパスポイントを事前に指定します(ここではデフォルト値を使用します)。したがって、グリッドポイントの数がパス内のキンクの数よりも少ない場合、効率は高くなります。特徴の数が非常に多く、多数の特徴を選択するのに十分なサンプルがある場合、そのような戦略は興味深いかもしれません。数値誤差に関しては、Larsは相関の高い変数に対してより多くの誤差を蓄積しますが、座標降下アルゴリズムはグリッド上のパスのみをサンプリングします。

αの最適値がフォールドごとにどのように変化するかに注意してください。これは、相互検証によってパラメーターを選択する方法のパフォーマンスを評価しようとすると、ネストされた相互検証が必要であることを示しています:非表示のデータの場合、このパラメーターの選択は最適ではない可能性があります。

import time

import numpy as np
import matplotlib.pyplot as plt

from sklearn.linear_model import LassoCV, LassoLarsCV, LassoLarsIC
from sklearn import datasets

# 这是为了避免在np.log10时被0除
EPSILON = 1e-4

X, y = datasets.load_diabetes(return_X_y=True)  # 导入数据

rng = np.random.RandomState(42)
X = np.c_[X, rng.randn(X.shape[0], 14)]  # 增加一些表现不好的特征

# 按Lars所做的标准化数据,以便进行比较
X /= np.sqrt(np.sum(X ** 2, axis=0))

# #############################################################################
# LassoLarsIC: 基于BIC/AIC准则的最小角度回归

model_bic = LassoLarsIC(criterion='bic')
t1 = time.time()
model_bic.fit(X, y)
t_bic = time.time() - t1  # 拟合模型运行时间
alpha_bic_ = model_bic.alpha_  # 打印alpha

model_aic = LassoLarsIC(criterion='aic')
model_aic.fit(X, y)
alpha_aic_ = model_aic.alpha_

# 画出所有alphas中信息标准(“aic”、“bic”)的值
def plot_ic_criterion(model, name, color):
    criterion_ = model.criterion_  # 模型使用的标准
    plt.semilogx(model.alphas_ + EPSILON, criterion_, '--', color=color,
                 linewidth=3, label='%s criterion' % name)
    plt.axvline(model.alpha_ + EPSILON, color=color, linewidth=3,
                label='alpha: %s estimate' % name)  # 标出最优alpha
    plt.xlabel(r'$\alpha$')
    plt.ylabel('criterion')


plt.figure()
plot_ic_criterion(model_aic, 'AIC', 'b')
plot_ic_criterion(model_bic, 'BIC', 'r')
plt.legend()
plt.title('Information-criterion for model selection (training time %.3fs)'
          % t_bic)

# #############################################################################
# LassoCV: 坐标下降法

# Compute paths
print("Computing regularization path using the coordinate descent lasso...")
t1 = time.time()
model = LassoCV(cv=20).fit(X, y)
t_lasso_cv = time.time() - t1

# Display results
plt.figure()
ymin, ymax = 2300, 3800
plt.semilogx(model.alphas_ + EPSILON, model.mse_path_, ':')
plt.plot(model.alphas_ + EPSILON, model.mse_path_.mean(axis=-1), 'k',
         label='Average across the folds', linewidth=2)
plt.axvline(model.alpha_ + EPSILON, linestyle='--', color='k',
            label='alpha: CV estimate')

plt.legend()

plt.xlabel(r'$\alpha$')
plt.ylabel('Mean square error')
plt.title('Mean square error on each fold: coordinate descent '
          '(train time: %.2fs)' % t_lasso_cv)
plt.axis('tight')
plt.ylim(ymin, ymax)

# #############################################################################
# LassoLarsCV: 最小角度回归

# Compute paths
print("Computing regularization path using the Lars lasso...")
t1 = time.time()
model = LassoLarsCV(cv=20).fit(X, y)
t_lasso_lars_cv = time.time() - t1

# Display results
plt.figure()
plt.semilogx(model.cv_alphas_ + EPSILON, model.mse_path_, ':')
plt.semilogx(model.cv_alphas_ + EPSILON, model.mse_path_.mean(axis=-1), 'k',
             label='Average across the folds', linewidth=2)
plt.axvline(model.alpha_, linestyle='--', color='k',
            label='alpha CV')
plt.legend()

plt.xlabel(r'$\alpha$')
plt.ylabel('Mean square error')
plt.title('Mean square error on each fold: Lars (train time: %.2fs)'
          % t_lasso_lars_cv)
plt.axis('tight')
plt.ylim(ymin, ymax)

plt.show()

ここに画像の説明を挿入します

ここに画像の説明を挿入します

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_42946328/article/details/111592023