R语言使用稀疏矩阵onehot编码问题
1.第一种方法:利用CatEncoders包
- 适用于train与test中部分特征所含类别不完全一致,有部分重合的情况。
- 将需要onehot的那些列合并,形成一个矩阵或者数据框X1,然后使用
OneHotEncoder.fit
与transform
来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,则可以这么写:
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一下内存就爆了,而且像xgboost与lightgbm这两个模型都天生支持稀疏矩阵的格式的。
如果有些模型不支持这种格式,你可以使用as
函数来进行转化,例如LiblineaR
包支持的稀疏矩阵格式为SparseM
包的,那么我们则可以这么做:
library(LiblineaR) data <- as(data, 'matrix.csr')
也可以发现如果模型不同,要设置各种数据格式比较麻烦,如果有一个通用的数据格式,针对这个格式使用各种模型是极好的,下面的的几票博客会翻译介绍下h2o
这个包,这个包类似python中的sklearn
,只要转化成h2o
的数据格式就能被他的各种模型使用。
相关推荐
gw 2019-12-27
python0 2017-06-09
zhaoqi 2017-05-27
zcabcd 2020-06-03
alicelmx 2020-01-01
范范 2019-10-26
HappinessSourceL 2019-06-26
zhangxiafll 2011-04-11
cassiePython 2019-04-06