0

[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.

在此处输入图像描述

4

1 回答 1

1

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

于 2019-01-23T22:02:21.080 回答