Значения пути регуляризации H2O GLM - PullRequest
0 голосов
/ 22 января 2019

[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 десятичных знаков.Ни одно из этих значений не будет усечено при фактическом запуске.

enter image description here

ОБНОВЛЕНИЕ

После кода здесь Я переписал цикл так, чтобы модель переобучалась для каждой лямбды.Это работает правильно, и монотонность сохраняется.Очевидно, что это занимает гораздо больше времени, чтобы бежать.Вот подход, который я выбрал: определить индекс, который имеет проблему, и подготовить полную модель только для этого индекса.Вот эта часть кода

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 голосов
/ 24 января 2019

Мы подозреваем, что в коде AUC может быть ошибка.Мы скопировали ваш код с нашими данными, но не смогли воспроизвести.Лучший способ продвинуться вперед - это предоставить нам ваш набор данных, если это возможно.Как только мы сможем воспроизвести, мы поработаем над исправлением.Спасибо!

...