【问题标题】:h2o glm regularization path valuesh2o glm 正则化路径值
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2017-06-19
      • 2020-11-26
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      相关资源
      最近更新 更多