У меня есть набор данных, в котором я хочу выполнить лассо для исключения функции. В настоящее время я следую онлайн-руководству на R, поскольку я новичок в R. Данные хранятся в фрейме данных. Цель была удалена из фрейма данных и хранится в собственном фрейме данных в одном столбце. Это проблема регрессии, и цель - числовая. Вот код, который я пытаюсь запустить:
library(glmnet)
lasso_model <- cv.glmnet(
x = as.matrix(train),
y = train_target,
alpha = 1)
Вот информация о наборе данных:
'data.frame': 9798 obs. of 55 variables:
$ acres: num 0.186 2.991 0.144 0.218 0.173 ...
$ above: int 1754 3030 1531 834 1022 1528 768 1184 2026 3176 ...
$ basement: int 0 1811 500 440 0 476 0 0 732 0 ...
$ baths: Factor w/ 7 levels "0","1","2","3",..: 3 4 3 3 2 3 2 2 3 3 ...
$ toilets: Factor w/ 5 levels "0","1","2","3",..: 1 3 2 1 1 2 1 1 2 2 ...
$ fireplaces: Factor w/ 6 levels "0","1","2","3",..: 2 2 2 2 1 1 1 2 2 2 ...
$ beds: Factor w/ 7 levels "1","2","3","4",..: 4 5 2 2 2 3 2 2 3 5 ...
$ rooms: Factor w/ 15 levels "0","1","2","3",..: 5 5 5 4 5 3 3 3 4 6 ...
$ age: int 103 17 13 46 116 12 93 93 42 100 ...
$ yearsfromsale: Factor w/ 3 levels "2","3","4": 2 2 2 1 2 2 3 3 1 1 ...
$ car: Factor w/ 4 levels "0","1","2","3": 1 4 3 1 1 3 1 1 4 1 ...
$ city_DES.MOINES: Factor w/ 2 levels "0","1": 2 1 1 2 2 1 2 2 2 2 ...
$ city_JOHNSTON: Factor w/ 2 levels "0","1": 1 2 2 1 1 1 1 1 1 1 ...
$ city_WEST.DES.MOINES: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ city_CLIVE: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ city_URBANDALE: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ city_ALTOONA: Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 1 1 1 ...
$ city_BONDURANT: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ city_CROCKER.TWNSHP: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ city_GRIMES: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ city_POLK.CITY: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ city_PLEASANT.HILL: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ city_WINDSOR.HEIGHTS: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50315: Factor w/ 2 levels "0","1": 1 1 1 2 1 1 1 1 1 1 ...
$ zip_50321: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 2 1 ...
$ zip_50320: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50312: Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 2 ...
$ zip_50314: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50311: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50309: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50316: Factor w/ 2 levels "0","1": 1 1 1 1 2 1 1 2 1 1 ...
$ zip_50317: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50313: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 2 1 1 1 ...
$ zip_50310: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50322: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50131: Factor w/ 2 levels "0","1": 1 1 2 1 1 1 1 1 1 1 ...
$ zip_50111: Factor w/ 2 levels "0","1": 1 2 1 1 1 1 1 1 1 1 ...
$ zip_50265: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50266: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50325: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50323: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50009: Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 1 1 1 ...
$ zip_50035: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50023: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50226: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50021: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50327: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ zip_50324: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ walkout_0: Factor w/ 2 levels "0","1": 2 1 2 2 2 1 2 2 2 2 ...
$ walkout_1: Factor w/ 2 levels "0","1": 1 2 1 1 1 2 1 1 1 1 ...
$ condition_Normal: Factor w/ 2 levels "0","1": 1 2 2 1 1 2 1 1 1 1 ...
$ condition_Above.Normal: Factor w/ 2 levels "0","1": 2 1 1 2 2 1 2 1 1 2 ...
$ condition_Below.Normal: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 2 1 ...
$ AC_1: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 1 ...
При попытке запустить строку lasso_model
я получаю следующую ошибку:
Error in cbind2(1, newx) %*% nbeta :
invalid class 'NA' to dup_mMatrix_as_dgeMatrix
По сути, я хочу иметь возможность определять, какие переменные нужно удалить. Любая помощь была бы замечательной!
@liori Вот что меня смущает, в этом наборе данных нет пропущенных значений.
Код, который идет после, строка с ошибкой явно не имеет отношения к проблеме, и настоятельно рекомендуется не включать ее в вопрос, поскольку она просто создает беспорядок (отредактировано и удалено)
Хорошо, это сильное подозрение.
У вас есть факторы в вашем фрейме данных. as.matrix
преобразует их в строки, а не в числа, и glmnet
не знает, что с ними делать:
> df <- data.frame(a=as.factor(c('0', '1', '2')), b=as.factor(c('0', '0', '1')))
> df
a b
1 0 0
2 1 0
3 2 1
> as.matrix(df)
a b
[1,] "0" "0"
[2,] "1" "0"
[3,] "2" "1"
Попробуйте явно преобразовать их обратно в числа (несколько окольный путь, но должен работать):
> as.matrix(data.frame(lapply(df, function(x) as.numeric(as.character(x)))))
a b
[1,] 0 0
[2,] 1 0
[3,] 2 1
Я новичок в синтаксисе R, поэтому, пожалуйста, простите меня. Вы рекомендуете преобразовать множители в целые числа, а затем запустить лассо? Мое единственное подозрение состоит в том, что я не хочу, чтобы модель лассо считала (для порядковых категорий), что 2 имеет приоритет перед 1, поскольку они обе являются категориями. Это проблема, с которой я столкнусь?
В пакете glmnet просто нет специальной обработки для факторных переменных. Если вам нужен какой-то особый подход, например, одноразовое кодирование, вы должны реализовать его самостоятельно ... или использовать некоторую оболочку над пакетом glmnet
, такую как cran.r-project.org/web/packages/glmnetUtils/vignettes/… или пакет caret
.
Был бы выбор признаков неправильным, если бы я не делал какой-либо специальной обработки для факторных переменных? Я пробовал реализовать glmnet, но меня очень смущает синтаксис, и я столкнулся с некоторыми ошибками, которые не смог исправить. Это самое близкое, что мне удалось получить при использовании этого пакета.
Для факторов только с двумя уровнями - не совсем, и большинство ваших переменных только двухуровневые. Их однократное кодирование привело бы, по сути, к той же модели. Другие переменные, похоже, имеют естественный порядок (например, 1 спальня <2 спальни <3 спальни и т. д.), Так что это тоже не будет очень плохо: это, вероятно, нарушает предположение о линейной зависимости между количеством спален и тем, что у вас целевая переменная есть, но в некоторых ситуациях все еще «достаточно хороша». Хотя я считаю, что пакет glmnetUtils
должен быть достаточно простым для ваших целей.
Содержат ли ваши данные значения
NA
?