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的數據格式就能被他的各類模型使用。翻譯

相關文章
相關標籤/搜索