[Python 3.5.2、h2o 3.22.1.1、JRE 1.8.0_201]
我正在运行一个glm
lambda_search
并使用正则化路径来选择一个 lambda。
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
我期待随着 lambda 惩罚的减少,ncoef 和 auc 会增加(非减少)。大多数情况下都是如此,但有一个例外。参见索引 23 - auc 增加了一点,然后又减少了。对此有解释吗?我需要设置一些公差参数还是...?在此运行中nlambdas = 100
(默认)。当我将其设置为 50 时,lambda、ncoef 和 auc 值是单调的。
仅供参考 - 出于本文的目的,我将 lambda 和 auc 值截断到小数点后 3 位。在实际运行中,这些值都不会被截断。
更新
按照此处的代码,我重新编写了循环,以便为每个 lambda 重新训练模型。这可以正常工作并保持单调性。显然,这需要更长的时间才能运行。这是我最终采用的方法:识别有问题的索引并仅为该索引训练完整模型。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
.