如何在R中将列表类型列数据传入线性回归模型的参数中?
问题解答
1. 为什么host_verifications查询类型是integer
你查询到的integer是因子类型的底层存储格式,R中typeof()函数返回的是变量的底层存储类型,而host_verifications列本质是**因子(factor)**类型,每个不同的字符串值对应一个整数编码,如果你用class(haha)查询,就会得到factor的结果。这列看起来像列表,实际上只是普通的字符串被存成了因子,直接传入lm时会自动按因子做哑变量编码,但这种把所有标签组合当成一个枚举值的处理方式,模型效果会非常差,完全浪费了标签的信息。
2. 当前处理方式的问题
你把amenities拆成嵌套列表的思路是对的,但lm不接受列表类型的自变量,也没办法直接识别列表里的标签特征。你需要把这列标签转成**独热编码(one-hot encoding)**格式:即每一个唯一的标签对应一个单独的数值列,样本包含该标签则值为1,不包含则为0。
3. 具体解决代码
你可以用tidyverse系列包快速完成编码,示例代码如下:
library(tidyverse) library(stringr) # 先处理amenities列,拆分后做独热编码 train_encoded <- train %>% # 把amenities转成字符串,清理末尾句号 mutate(amenities_clean = str_remove_all(amenities, "\\.$"), # 按逗号+任意空格拆分标签 amenities_list = str_split(amenities_clean, ",\\s*")) %>% # 把列表拆分成独立行 unnest(amenities_list) %>% # 去除标签首尾空格,统一标签命名 mutate(amenities_list = str_trim(amenities_list)) %>% # 标记存在该标签 mutate(value = 1) %>% # 转成宽表即独热编码格式,不存在的标签填充0 pivot_wider(names_from = amenities_list, values_from = value, values_fill = 0) # 现在可以直接用生成的标签列拟合模型 # 注意:你提供的最小示例未包含price列,运行前请确认数据集存在该因变量列 model <- lm(price ~ host_name + `TV` + `Wifi` + `Kitchen` + host_verifications, data = train_encoded)
如果你不想用tidyverse,也可以手动遍历所有唯一标签,逐个生成布尔列转成0/1后加入数据集即可。
内容的提问来源于stack exchange,提问作者GlenXoseph
相关产品推荐
相关产品推荐

