Я имею дело с наборами данных высокой размерности, и мне нужно сделать выбор некоторых функций. Я использовал Случайный Лес в 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. Результатом, который я ожидал, был список всех переменных с их соответствующей важностью.
Спасибо за вашу помощь.
С уважением.