R语言使用稀疏矩阵onehot编码问题

1.第一种方法:利用CatEncoders包

  • 适用于train与test中部分特征所含类别不彻底一致,有部分重合的状况。
  • 将须要onehot的那些列合并,造成一个矩阵或者数据框X1,而后使用OneHotEncoder.fittransform来onehot,可用sparse参数来指定是否须要稀疏矩阵格式
total_onehot <- OneHotEncoder.fit(X1) ;
z <- transform(total_onehot,train[onehot列],sparse=TRUE)
  • 将剩下的列造成的X2使用Martix包的Matrix函数进行进行稀疏化
Matrix(X2,sparse = T)
  • 使用cbind合并2个稀疏矩阵

2.第二种方法:利用Matrix包

  • 适用于train与test中部分特征所含类别彻底一致状况
  • 使用sparse.model.matrix函数,将须要onthot的变量都变成因子类型或者字符类型,再使用sparse.model.matrix(~.-1,data)
    sparse.model.matrix(不须要的变量~.-1,data)

例如对mtcars数据集,咱们不须要前2个变量,分别为mpg,cyl,则能够这么写:python

sparse.model.matrix(mpg+cyl~.-1,mtcars)

如今我想对gear和carb这2个变量onehot,同时也不须要mpg,cyl这2个变量,则能够写成下面这样:函数

mtcars1 <- data.table(mtcars)
mtcars1$gear <- as.character(mtcars1$gear)
mtcars1$carb <- as.character(mtcars1$carb)
sparse.model.matrix(mpg+cyl~.-1,mtcars1)

看起来使用第二种方法会更好一点,通常咱们也使用第二种方法,可是有时候会有一些特殊场景须要使用第一种方法:如咱们想对train中与test中的全部出现过的用户ID进行onehot,这时若是你用第二种方法,则会有train与test会有不一样特征维度。
这边都把数据进行稀疏化的缘由是工做中的数据量太大,若是不稀疏化你onehot一下内存就爆了,并且像xgboostlightgbm这两个模型都天生支持稀疏矩阵的格式的。
若是有些模型不支持这种格式,你可使用as函数来进行转化,例如LiblineaR包支持的稀疏矩阵格式为SparseM包的,那么咱们则能够这么作:spa

library(LiblineaR)
data <- as(data, 'matrix.csr')

也能够发现若是模型不一样,要设置各类数据格式比较麻烦,若是有一个通用的数据格式,针对这个格式使用各类模型是极好的,下面的的几票博客会翻译介绍下h2o这个包,这个包相似python中的sklearn,只要转化成h2o的数据格式就能被他的各类模型使用。翻译

相关文章
相关标签/搜索