OneHotEncoder.fit
與transform
來onehot,可用sparse
參數來指定是否須要稀疏矩陣格式total_onehot <- OneHotEncoder.fit(X1) ; z <- transform(total_onehot,train[onehot列],sparse=TRUE)
Martix
包的Matrix
函數進行進行稀疏化Matrix(X2,sparse = T)
cbind
合併2個稀疏矩陣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一下內存就爆了,並且像xgboost與lightgbm這兩個模型都天生支持稀疏矩陣的格式的。
若是有些模型不支持這種格式,你可使用as
函數來進行轉化,例如LiblineaR
包支持的稀疏矩陣格式爲SparseM
包的,那麼咱們則能夠這麼作:spa
library(LiblineaR) data <- as(data, 'matrix.csr')
也能夠發現若是模型不一樣,要設置各類數據格式比較麻煩,若是有一個通用的數據格式,針對這個格式使用各類模型是極好的,下面的的幾票博客會翻譯介紹下h2o
這個包,這個包相似python中的sklearn
,只要轉化成h2o
的數據格式就能被他的各類模型使用。翻譯