Почему при использовании модели glmnet `прогнозирование` в R возвращает высокоразмерный прогноз? - PullRequest
0 голосов
/ 01 января 2019

Вот небольшой пример, воспроизводящий проблему:

model <- glmnet(matrix(rnorm(3*100), 100, 3), rbernoulli(100))
preds <- predict(model, matrix(rnorm(3*100), 100, 3))
dim(preds)
# 100 60

Но так как прогнозируемой переменной является Бернулли, я бы ожидал, что выход будет 1 или 2-мерным (вероятность 1 или вероятностькаждого класса).

Я посмотрел документацию для glmnet и для predict, но не могу найти ничего, что описывает это поведение.Что я ищу, так это просто подгоняю модель к некоторым обучающим данным, а затем вычисляю вероятности класса, чтобы я мог вычислить AUC.

Я в основном спрашиваю об этом поведении, потому что этого не произойдет, если дляНапример, я использую пакет rpart вместе с predict, то есть, например,

df <- data.frame(cbind(matrix(rnorm(3*100), 100, 3), rbernoulli(100)))
model <- rpart(X4 ~ ., df)
length(predict(model, data.frame(matrix(rnorm(3*100), 100, 3))))
# 100, as expected

Исходя из Python, я нахожу много этого сбивающего с толку, так как функция predict кажется общей,хотя он явно ведет себя по-разному для двух двоичных классификаторов.

1 Ответ

0 голосов
/ 01 января 2019

В R вы найдете много примеров, в которых вы получаете вывод, основанный на измерении / классе и т. Д. Вашего ввода для функции.

Для glmnet, по умолчанию вы предоставляете диапазон лямбда-выражений:

лямбда (т.е. коэффициент усадки) является гиперпараметром для регуляризованной регрессионной модели (glmnet).

set.seed(1)
model <- glmnet(matrix(rnorm(3*100), 100, 3), purrr::rbernoulli(100))
preds <- predict(model, matrix(rnorm(3*100), 100, 3))

dim(preds)
#[1] 100  61

length(model$lambda)
[1] 61

Вам необходимо настроить его на основе требуемого показателя производительности, чтобы найти оптимальное / наилучшее значение для вашей модели.Как только у вас есть, вы можете использовать его, чтобы получить окончательные прогнозы.Что-то вроде:

model <- glmnet(matrix(rnorm(3*100), 100, 3), purrr::rbernoulli(100), 
                lambda = 0.19)        # assuming its an optimal value
preds <- predict(model, matrix(rnorm(3*100), 100, 3))

dim(preds)
# [1] 100   1

, в то время как rpart по умолчанию не требует гиперпараметра, так как он соответствует целому дереву без сокращения, что эквивалентно предоставлению единственного значения гиперпараметра, которое соответствует подгонке данных долистовые узлы.Поэтому вы получаете единый набор прогнозов.Недостатком использования этого текущего классификатора является то, что он не обобщен.

Поэтому, если вы переходите с Python на R для прикладных задач машинного обучения, лучше всего использовать пакет caret это однородная структура, объединяющая несколько статистических моделей в рамках единого подхода к моделированию.

...