Поддерживает ли sklearn.ensemble.GradientBoostingRegressor разреженные входные выборки? - PullRequest
0 голосов
/ 05 марта 2020

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

В документации метода fit говорится о первом параметре X:

Входные выборки. Внутренне он будет преобразован в dtype = np.float32, и если разреженная матрица будет предоставлена ​​разреженному csr_matrix.

Это привело меня к мысли, что GradientBoostingRegressor может работать с разреженными входными данными.

Но внутренне он вызывает check_array с неявным force_all_finite=True (по умолчанию), так что я получаю следующую ошибку, если я вставлю csr_matrix со значениями NaN:

ValueError: Вход содержит NaN, бесконечность или слишком большое значение для dtype ('float32')

Не поддерживает ли GradientBoostingRegressor фактически разреженные данные?

Обновление:

Мне повезло, что у меня нет значащих нулей. Мой код вызова теперь выглядит так:

predictors['foobar'] = predictors['foobar'].fillna(0) # for columns that contain NaNs
predictor_matrix = scipy.sparse.csr_matrix(
    predictors.values.astype(np.float)
)
predictor_matrix.eliminate_zeros()
model.fit(predictor_matrix, regressands)

Это позволяет избежать исключения, описанного выше. К сожалению, eliminate_nans() метод не существует. (Когда я печатаю разреженную матрицу с NaN s, она перечисляет их в явном виде, поэтому запас должен быть чем-то иным, чем NaN s.)

Но эффективность прогнозирования не изменилась (заметно).

1 Ответ

1 голос
/ 05 марта 2020

Возможно, вы могли бы попробовать использовать LightGBM. Вот обсуждение в Kaggle о том, как он обрабатывает пропущенные значения:

https://www.kaggle.com/c/home-credit-default-risk/discussion/57918

Удачи

...