[Python 3.5.2, h2o 3.22.1.1, JRE 1.8.0_201]
Я запускаю glm
lambda_search
и использую путь регуляризации для выбора лямбды.
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
Я ожидал, что с уменьшением лямбда-штрафа ncoef и auc будут увеличиваться (не уменьшаться).Это верно в большинстве случаев за одним исключением.См. index 23 - auc увеличивает неплохой бит, а затем снова уменьшает.Есть ли объяснение этому?Нужно ли устанавливать какой-либо параметр допуска или ...?В этом прогоне nlambdas = 100
(по умолчанию).Когда я установил его на 50, значения лямбда, ncoef и auc являются монотонными.
К вашему сведению - для целей этого поста я урезал значения лямбды и auc до 3 десятичных знаков.Ни одно из этих значений не будет усечено при фактическом запуске.
ОБНОВЛЕНИЕ
После кода здесь Я переписал цикл так, чтобы модель переобучалась для каждой лямбды.Это работает правильно, и монотонность сохраняется.Очевидно, что это занимает гораздо больше времени, чтобы бежать.Вот подход, который я выбрал: определить индекс, который имеет проблему, и подготовить полную модель только для этого индекса.Вот эта часть кода
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
.