h2o glm正则化路径值

时间:2019-01-21 21:38:05

标签: python h2o glm regularized

[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个小数位。这些值在实际运行中均不会被截断。

enter image description here

更新

在代码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上。

enter image description here

1 个答案:

答案 0 :(得分:1)

我们怀疑AUC代码中可能存在错误。我们使用数据复制了您的代码,但无法复制。最好的前进方式是在可能的情况下向我们提供您的数据集。一旦可以复制,我们将进行修复。谢谢!