R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Ensemble-malleista

SPSS ja Ensemble-mallit

SPSS Modelerissa on useita noodeja, joilla voi sovittaa ensemble-malleja. Ensemble-mallit ovat sellaisia, joissa samaan aineistoon sovitetaan useita erilaisia malleja, ja ennuste muodostetaan näiden eri mallien yhdistelmänä. Varsin perinteikäs sovelluskohde on luokitteluongelma, jossa ennustetaan binääristä vastemuuttujaa, siis myös logistisen regressiomallin leipälaji. Ensemble-malleja käyttäen on usein mahdollista parantaa ennusteen osuvuutta verrattuna vaikkapa vain logistisen regression antamiin tuloksiin.

SPSS Modelerin etuna mm. R:ään verratttuna on kuulemma eri mallien helppo sovitettavuus ja vertailtavuus. Lisäksi SPSS:n noodit tarjoavat laajan valikoiman eri malleja. Esimerkiksi Binary Classifier Node tarjoaa seuraavat mallit:

Neural Net (neuroverkko)
C&R Tree (puumalli)
QUEST (puumalli)
CHAID (puumalli)
C5.0 (puumalli)
Logistic Regression (logistinen regressio)
Decision List (boolen funktiot)
Bayes Net (bayesverkko)
Discriminant (erotteluanalyysi)
Nearest Neighbor (lähimmän naapurin menetelmä)
SVM (tukivektorikone)

R ja ensemble-mallit

R:ssä on useampia erilaisia tapoja sovittaa ensemble-malleja, joista ainakin paketit caret ja SuperLearner lienevät jossakin määrin tuttuja. Caret erityisesti kattaa hyvin laajan menetelmävalikoiman. SuperLearner-paketti kattaa pienemmän määrän eri malleja, mutta sen käyttö on aavistuksen suoraviivaisempaa. Kummallakin paketilla on minun mielestäni mahdollista sovittaa ensemble-malleja käytännössä ihan yhtä helposti kuin SPSS Modelerilla. Katsotaanpa esimerkkiä SuperLearner-paketilla.

SuperLearner

Seuraavassa käytetään esimerkkinä Sonar-aineistoa, jossa tavoitteena on ennustaa, onko havaittu kaiku kivi (R) vai miina (M). Ladataan paketit ja aineisto:

library(SuperLearner)
library('caret')
library('mlbench')
library('pROC')
 
data(Sonar)

Muokataan data mallien sovittamisessa tarvittavaan muotoon:

Y<-as.numeric(Sonar$Class)-1
X<-Sonar[,1:60]

Tämän jälkeen valitaan, mitä malleja halutaan sovittaa. Valitaan tähän esimerkkiin logistinen regressio (glm*), päätöspuu (rpart), tukivektorikone (svm), lähimmän naapuri menetelmä (knn) ja gradient boosting machine (gbm):

lib<-c("SL.glm", "SL.rpart", "SL.glmnet", "SL.gbm", "SL.nnet", "SL.svm", "SL.knn")

Lopuksi sovitetaan ensemble-malli:

fit<-SuperLearner(Y, X, SL.library=lib, family=binomial)

SuperLearnerin tulosta voi tarkastella tulostamalla objektin:

fit
 
Call:  SuperLearner(Y = Y, X = X, family = binomial, SL.library = lib) 
 
 
                    Risk        Coef
SL.glm_All    0.25724648 0.002994922
SL.rpart_All  0.21343412 0.000000000
SL.glmnet_All 0.17986376 0.000000000
SL.gbm_All    0.11006643 0.211428407
SL.nnet_All   0.15470038 0.126476335
SL.svm_All    0.09215326 0.659100336
SL.knn_All    0.18790806 0.000000000

Tuloksessa ilmoitetaan kullekin mallille paino (coef), jolla malli vaikuttaa lopulliseen ennusteeseen. Koko ensemblen perusteella voidaan tehdä ennuste käyttämällä normaalia predict()-funktiota:

# Kaikkien mallien ennuste:
pred<-ifelse(predict(fit, type="response")$pred>(sum(Y)/length(Y)), 1, 0)
 
# Vain posit. painoilla olevien mallien ennuste:
pred<-ifelse(predict(fit, onlySL=TRUE, type="response")$pred>(sum(Y)/length(Y)), 1, 0)

Ennusteista voidaan muodostaa confusion matrix:

table(orig=Y, pred=pred)

Kaikille malleille oma confusion matrix voidaan muodostaa helposti vaikkapa seuraavasti:

apply(ifelse(predict(fit, type="response")$library.predict>(sum(Y)/length(Y)), 1, 0), 2, function(x) print(table(orig=Y, pred=x)))
    pred
orig   0   1
   0 111   0
   1   0  97
    pred
orig  0  1
   0 95 16
   1 10 87
    pred
orig  0  1
   0 91 20
   1 12 85
    pred
orig   0   1
   0 111   0
   1   0  97
    pred
orig   0   1
   0 110   1
   1  10  87
    pred
orig   0   1
   0 109   2
   1   0  97
    pred
orig  0  1
   0 94 17
   1 22 75

Yhteenveto

Kunhan aineisto on saatettu sopivaan muotoon, voidaan ensemble-malli sovittaa SPSS Modeler:n tapaan R:ssäkin varsin helposti. Yksittäisille malleille on myös mahdollista saada omat ennusteensa aivan yhtä näppärästi kuin koko ensemble:llekin.

Yksinkertaisimmillaan ensemble-mallin sovitus ja perustulosten tarkastelu käy esimerkiksi seuraavilla kolmella rivillä:

fit<-SuperLearner(Y, X, SL.library=c("SL.glm", "SL.rpart", "SL.glmnet", "SL.gbm", "SL.nnet", "SL.svm", "SL.knn"), family=binomial)
table(orig=Y, pred=ifelse(predict(fit, onlySL=TRUE, type="response")$pred>(sum(Y)/length(Y)), 1, 0))
apply(ifelse(predict(fit, type="response")$library.predict>(sum(Y)/length(Y)), 1, 0), 2, function(x) print(table(orig=Y, pred=x)))

Mielestäni R:ää ei siis ole syytä pitää erityisen hankalana ensemble-mallien sovittamisen osalta. Lisäksi se tarjoaa runsaasti laveamman valikoiman erilaisia malleja kuin SPSS Modeler; caret-paketissa malleja on suuri määrä valmiiksi saatavilla, mutta SuperLearner-pakettia verten osaan joutuu kirjoittamaan ensin oman wrapperin.


Vastaa

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