使用clustMixType的predict函数时类型比较未实现错误的解决问询
解决clustMixType中predict函数报错“comparison of these types is not implemented”的问题
错误原因
- 本质是
predict.kproto函数处理分类变量时的类型不兼容:当模型训练时lambda设为NULL,clustMixType自动计算lambda的过程中,会将聚类原型(protos)里的因子列存储为单一行的数据框;而待预测数据中的因子列是普通因子类型,两者执行!=比较时,R无法处理数据框和因子的不等运算,触发报错。 - 你的代码中
is_color_g是因子列,正好触发了这个类型冲突问题。
解决方法
方法1:显式指定lambda参数
避免使用lambda=NULL,手动指定lambda值或用estimateLambda()自动估算,这样kproto会正确存储分类变量的原型为因子向量,确保预测时类型匹配。
修正代码:
library(tidyverse) library(clustMixType) my_diamonds <- diamonds %>% mutate(is_color_g = factor(ifelse(color == 'G', 1, 0))) %>% select(cut, carat, is_color_g, depth, table, price) %>% group_by(cut) %>% nest %>% mutate(k = 3) # 用estimateLambda自动估算lambda,或直接指定lambda=1等固定值 my_diamonds <- my_diamonds %>% mutate(mod.kproto = map2(data, k, ~kproto(.x, k = .y, lambda = estimateLambda(.x), iter.max = 100, nstart = 1, na.rm = 'no'))) # 调用predict正常运行 my_diamonds <- my_diamonds %>% mutate(preds = map2(data, mod.kproto, ~predict(.y, .x)))
方法2:将因子列转换为字符型
把分类变量从因子转为字符型,kproto会将其当作分类变量处理,原型存储为字符向量,和待预测数据的字符列比较时不会有类型冲突。如果后续需要,可在预测后转回因子。
修正代码:
library(tidyverse) library(clustMixType) my_diamonds <- diamonds %>% mutate(is_color_g = as.character(ifelse(color == 'G', 1, 0))) %>% # 转换为字符型 select(cut, carat, is_color_g, depth, table, price) %>% group_by(cut) %>% nest %>% mutate(k = 3) my_diamonds <- my_diamonds %>% mutate(mod.kproto = map2(data, k, ~kproto(.x, k = .y, lambda = NULL, iter.max = 100, nstart = 1, na.rm = 'no'))) # 预测正常执行,如需可后续转回因子 my_diamonds <- my_diamonds %>% mutate(preds = map2(data, mod.kproto, ~predict(.y, .x)))
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

