H2O - выбор характеристик с использованием LASSO в gridsearch - PullRequest
0 голосов
/ 27 июня 2019

Я имею дело с наборами данных высокой размерности, и мне нужно сделать выбор некоторых функций. Я использовал Случайный Лес в H2O, и я хотел бы использовать регуляризацию LASSO, чтобы увидеть, превосходит ли он случайный лес.

Ниже приведен код, который я создал. Когда я задаю альфа = 0 (регуляризация RIDGE), код работает нормально и ошибки не возникает. Однако, когда я устанавливаю альфа = 1 (LASSO), возникает ошибка «ZeroDivisionError: деление на ноль».

Я следовал рекомендациям этого поста для достижения LASSO: Выбор атрибута в h2o

Код:

from h2o.estimators.glm import H2OGeneralizedLinearEstimator
from h2o.grid.grid_search import H2OGridSearch

# feature columns et target column
x_lasso_h2o = list(feature_matrix.columns)
y_h2o = response_column

# select the values for lambda to grid over
hyper_params = {'lambda': list(arange(0.001,1,0.01))}

search_criteria_dim_reduction= {'strategy': 'RandomDiscrete',
                   'max_runtime_secs': 100,
                   'max_models': 5,
                   'stopping_metric': "auto",
                   'stopping_tolerance': 0.001,
                   'stopping_rounds': 5,
                   'seed': 1234}


# Train and validate a cartesian grid of GLMs
glm_grid_lasso = H2OGridSearch(model=H2OGeneralizedLinearEstimator(family= "binomial",nfolds = 5,alpha = 1,balance_classes = True),hyper_params=hyper_params,search_criteria=search_criteria_dim_reduction)

glm_grid_lasso.train(x=x_lasso_h2o, y=y_h2o,training_frame= train_h2o)

# Get the grid results, sorted by validation AUC
glm_lasso_gridperf = glm_grid_lasso.get_grid(sort_by='auc', decreasing=True)

best_lasso = glm_lasso_gridperf.model_ids[0]
best_lasso = h2o.get_model(best_lasso)
var_imp_pd_lasso = pd.DataFrame(best_lasso.varimp(True))

Произошла ошибка:

ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-51-ca2e05533e82> in <module>
     32 best_lasso = glm_lasso_gridperf.model_ids[0]
     33 best_lasso = h2o.get_model(best_lasso)
---> 34 var_imp_pd_lasso = pd.DataFrame(best_lasso.varimp(True))

~\AppData\Local\Continuum\anaconda3\lib\site-packages\h2o\model\model_base.py in varimp(self, use_pandas)
    444                 vals = []
    445                 for item in tempvals:
--> 446                     tempT = (item[0], item[1], item[1]/maxVal, item[1]/sum)
    447                     vals.append(tempT)
    448                 header = ["variable", "relative_importance", "scaled_importance", "percentage"]

ZeroDivisionError: float division by zero

Что я думаю: поскольку LASSO уменьшает «не важные» переменные до 0, это объясняет, почему существует ошибка деления на 0. Результатом, который я ожидал, был список всех переменных с их соответствующей важностью.

Спасибо за вашу помощь.

С уважением.

...