【发布时间】:2019-01-21 21:38:04
【问题描述】:
[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 会增加(非减少)。大多数情况下都是如此,但有一个例外。参见 index 23 - auc 增加了一点,然后又减少了。对此有解释吗?我需要设置一些公差参数还是...?在此运行nlambdas = 100(默认)。当我将它设置为 50 时,lambda、ncoef 和 auc 值是单调的。
仅供参考 - 出于本文的目的,我已将 lambda 和 auc 值截断为小数点后 3 位。在实际运行中,这些值都不会被截断。
更新
按照代码here,我重新编写了循环,以便为每个 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。
【问题讨论】:
标签: python h2o glm regularized