0

[Python 3.5.2、h2o 3.22.1.1、JRE 1.8.0_201]

glm lambda_searchラムダを選択するために正則化パスを使用して実行しています。

glm_h2o = H2OGeneralizedLinearEstimator(family='binomial', alpha=1., lambda_search=True, seed=param['GLM_SEED'])
glm_h2o.train(y='label', training_frame=train_h2o, fold_column='fold')

regpath_h2o = H2OGeneralizedLinearEstimator.getGLMRegularizationPath(glm_h2o)
regpath_pd = pd.DataFrame(index=np.arange(len(regpath_h2o['lambdas'])), columns=['lambda','ncoef','auc'])
for n,(lamb,coefs) in enumerate(zip(regpath_h2o['lambdas'],regpath_h2o['coefficients'])):
    mod = H2OGeneralizedLinearEstimator.makeGLMModel(model=glm_h2o, coefs=coefs)
    regpath_pd.loc[n] = [lamb, sum(1 for x in coefs.values() if abs(x)>1E-3), mod.model_performance(train_h2o).auc()]

の値は次のregpath_pdとおりです。

  lambda  ncoef   auc |    lambda ncoef    auc |    lambda ncoef    auc
0  0.103    1   0.5   | 10  0.041   14   0.742 | 20  0.016   54   0.794
1  0.094    3   0.632 | 11  0.037   15   0.743 | 21  0.015   62   0.799
2  0.085    3   0.632 | 12  0.034   18   0.749 | 22  0.013   72   0.804
3  0.078    5   0.696 | 13  0.031   19   0.752 | 23  0.012   83   0.849
4  0.071    5   0.696 | 14  0.028   20   0.754 | 24  0.011   90   0.813
5  0.065    6   0.697 | 15  0.026   26   0.766 | 25  0.010  110   0.816
6  0.059    7   0.702 | 16  0.023   31   0.770 | 26  0.009  123   0.819
7  0.054    8   0.707 | 17  0.021   34   0.774 | 27  0.008  147   0.822
8  0.049   10   0.729 | 18  0.019   41   0.777 | 28  0.008  165   0.825
9  0.045   13   0.740 | 19  0.018   50   0.791 | 29  0.007  190   0.828

ラムダのペナルティが減少すると、ncoef と auc が増加する (減少しない) と予想していました。これは、1 つの例外を除いて、ほとんどの場合に当てはまります。インデックス 23を参照してください- auc はかなり増加し、その後再び減少します。それについての説明はありますか?公差パラメータを設定する必要がありますか、それとも...? この実行ではnlambdas = 100(デフォルト)。50 に設定すると、ラムダ、ncoef、および auc の値が単調になります。

参考までに、この投稿の目的のために、ラムダと auc の値を小数点以下 3 桁に切り捨てました。これらの値は、実際の実行では切り捨てられません。

ここに画像の説明を入力

アップデート

ここのコードに従って、モデルがラムダごとに再トレーニングされるようにループを書き直しました。これは正しく機能し、単調性が維持されます。明らかに、実行にははるかに時間がかかります。私がたどり着いたアプローチは次のとおりです。問題のあるインデックスを特定し、そのインデックスのみの完全なモデルをトレーニングします。FWIWここにコードのその部分があります

auc_diff = regpath_pd['auc'][1:].values - regpath_pd['auc'][:-1].values
arg_bad = np.argwhere(auc_diff<-1E-3).ravel())

for n in arg_bad.tolist():
    lamb = regpath_h2o['lambdas'][n]
    mod = H2OGeneralizedLinearEstimator(family='binomial', alpha=1., lambda_search=False, Lambda=lamb, seed=param['GLM_SEED'])
    mod.train(y='label', training_frame=train_h2o, fold_column='fold')
    regpath_pd.loc[n] = [lamb, sum(1 for x in mod.coef().values() if abs(x)>1E-3), mod.model_performance().auc()]

結果のグラフを以下に示します (縮尺は異なります)。に問題があるようgetGLMRegularizationPathです。

ここに画像の説明を入力

4

1 に答える 1