[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个小数位。这些值在实际运行中均不会被截断。
更新
在代码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
上。
答案 0 :(得分:1)
我们怀疑AUC代码中可能存在错误。我们使用数据复制了您的代码,但无法复制。最好的前进方式是在可能的情况下向我们提供您的数据集。一旦可以复制,我们将进行修复。谢谢!