R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Feature engineering

Feature engineering on menetelmä, jossa tiedonlouhintaa varten luodaan olemassa olevista muuttujista uusia muuttujia. Useimmiten termillä kaiketi viitataan tilanteeseen, jossa alakohtaista tietämystä käytetään hyväksi näitä piirteitä luotaessa, mutta usein termillä tarkoitetaan myös automatisoitua uusien muuttujien luomista. Menetelmiä on useita, ja tunnetuimpia lienee ns. kernel trick, mutta uusia muuttujia luodaan usein myös tavanomaisilla summa-, erotus-, osamäärä- ja tulo- operaattoreilla. En löytänyt R:stä valmista pakettia, joka olisi tehnyt uusia muuttujia suoraan olemassa olevasta taulukosta, joten kirjoitin homman hoitamiseen uudet funktiot:

# Feature creation -funktiot
createSums<-function(x) {
   y <- combn(ncol(x), 2L, function(y) rowSums(x[y]))
   colnames(y) <- combn(names(x), 2L, paste, collapse = "")
   return(y)
}
 
createProds<-function(x) {
   y <- combn(ncol(x), 2L, function(y) apply(x[y], 1, prod))
   colnames(y) <- combn(names(x), 2L, paste, collapse = "")
   return(y)
}
 
createProds2<-function(x) {
   y <- combn(ncol(x), 2L, function(y) exp(rowSums(log(x[y]))))
   colnames(y) <- combn(names(x), 2L, paste, collapse = "")
   return(y)
}
 
createMinuses<-function(x) {
   y <- as.data.frame(combn(ncol(x), 2L, function(y) t(diff(t(x[y])))))
   colnames(y) <- combn(names(x), 2L, paste, collapse = "")
   return(y)
}
 
createDivisions<-function(x) {
   y <- as.data.frame(combn(ncol(x), 2L, function(y) t(diff(t(log(x[y]))))))
   colnames(y) <- combn(names(x), 2L, paste, collapse = "")
   return(y)
}

Funktoita voidaan käyttää esimerkiksi seuraavasti:

# Aineisto
set.seed(1)
orig<-data.frame(matrix(ncol=3, nrow=10, data=sample(1:6, 30, replace=T)))
 
# Luodaan uudet muuttujat
sums  <-createSums(orig)
prods <-createProds2(orig)
subtrs<-createMinuses(orig)
divs  <-createDivisions(orig)
divs[is.infinite(as.matrix(divs))]<-0
divs[is.na(as.matrix(divs))]<-0
 
# Tehdään yksi iso datamatriisi
d<-cbind(orig, sums, prods, subtrs, divs)
 
# Poistetaan duplikaattisarakkeet
library(digest)
d2<-d[!duplicated(lapply(d, digest))]

Mallinnus mallinvalintoineen voidaan sitten tehdä muodostettulla data frame-objektilla d2.


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *