Я использую 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.)
Но эффективность прогнозирования не изменилась (заметно).