(Acest articol a fost publicat pentru prima dată pe mlr-orgși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)
Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.
Vă rugăm să activați JavaScript și să reîncărcați pagina,
Sau descărcați fișierele sursă de la GitHub și rulați codul local.
Aflați cum să clasificați caracteristicile unei sarcini supravegheate prin importanța / puterea relației lor cu variabila țintă folosind o metodă de filtrare a caracteristicilor.
Creăm sarcina în ceea ce privește exercițiul de eșantionare: setul de date de credit german.
library("mlr3verse") library("data.table") task = tsk("german_credit")
În interiorul mlr3
ecosistem, filtrele de caracteristici sunt implementate în mlr3filters
pachet și sunt utilizate de obicei în combinație cu mlr3pipelines
pentru a putea include întreaga etapă de preprocesare într -o conductă. În exercițiile 1 până la 3, aplicăm filtrarea caracteristicilor pentru a preprocesa datele unei sarcini fără a utiliza o conductă. În exercițiul 4, vom configura o conductă care combină un elev cu filtrarea caracteristicilor ca pas de preprocesare.
Exercițiul 1: Găsiți un filtru de caracteristici adecvat
Fă -te familiarizat cu mlr3filters
pachet (link). Care Filter
S sunt aplicabile tuturor tipurilor de caracteristici din sarcina pe care am creat -o mai sus?
Aluzie:
Unele filtre sunt aplicabile fie pentru clasificare, fie de regresie, fie funcțiilor numerice sau categorice. Prin urmare, căutăm un Filter
care se aplică sarcinii noastre de clasificare și care poate fi calculat pentru integer
şi factor
Caracteristici (deoarece aceste tipuri de caracteristici sunt prezente în sarcină, consultați task$feature_types
)
Site -ul legat mai sus include un tabel care oferă informații detaliate pentru fiecare Filter
.
Exercițiul 2: Filtru de câștig de informații
Acum vrem să folosim information_gain
filtru care necesită instalarea FSelectorRcpp
pachet. Acest filtru cuantifică câștigul în informații, luând în considerare următoarea diferență: H(Target) + H(Feature) - H(Target, Feature)
Aici, H(X)
este entropia Shannon pentru variabilă X
şi H(X, Y)
este entropia Shannon articulară pentru variabilă X
condiționat pe Y
.
Creați un filtru de câștig de informații și calculați câștigul de informații pentru fiecare caracteristică.
Vizualizați scorul pentru fiecare caracteristică și decideți câte și ce caracteristici trebuie să includă.
Sugestie 1:
Utilizare flt("information_gain")
Pentru a crea un information_gain
filtrați și calculați scorurile filtrului caracteristicilor. Vedea ?mlr_filters_information_gain
(sau echivalent flt("information_gain")$help()
) Pentru mai multe detalii despre cum să utilizați un filtru. Dacă nu funcționează, puteți utiliza de ex. flt("importance", learner = lrn("classif.rpart"))
care folosește importanța caracteristică a unui classif.rpart
Arborele de decizie pentru a clasifica caracteristicile pentru filtrul de caracteristici.
Pentru vizualizare, puteți, de exemplu, să creați o diagramă de scree (similară cu analiza componentelor principiu) care complotează scorul filtrului pentru fiecare caracteristică de pe axa y și caracteristicile de pe axa x.
Folosind o regulă generală, de exemplu, „regula cotului” puteți determina numărul de funcții pentru a include.
Sugestie 2:
library(mlr3filters) library(mlr3viz) library(FSelectorRcpp) filter = flt(...) filter$calculate() autoplot(...)
Exercițiul 3: Creați și aplicați un Pipeopfilter la o sarcină
Deoarece elevul K-nn suferă de blestemul dimensionalității, vrem să stabilim o preprocesare PipeOp
pentru a subseta setul nostru de caracteristici la cele mai importante 5 în funcție de filtrul de câștig de informații (a se vedea flt("information_gain")$help()
) În general, puteți vedea o listă cu alte filtre posibile, uitându -vă la dicționar as.data.table(mlr_filters)
. Puteți construi un PipeOp
obiect cu po()
Funcție din mlr3pipelines
pachet. Vedea mlr_pipeops$keys()
pentru alegeri posibile. Creați un PipeOp
care filtrează caracteristicile german_credit
sarcina și creează o nouă sarcină care conține doar cele mai importante 5 în funcție de filtrul de câștig de informații.
Sugestie 1:
- Filtrul poate fi creat de
flt("information_gain")
(Vezi și pagina de ajutorflt("information_gain")$help()
) - În cazul nostru, trebuie să trecem
"filter"
cheie la primul argument alpo()
funcția și filtrul creat anterior cuflt
Funcție lafilter
argument alpo()
Funcție pentru a construi unPipeOpFilter
obiect care efectuează filtrarea caracteristicilor (consultați și exemple de cod în pagina de ajutor?PipeOpFilter
) - Pagina de ajutor a
?PipeOpFilter
De asemenea, dezvăluie parametrii pe care îi putem specifica. De exemplu, pentru a selecta cele mai importante 5 caracteristici, putem setafilter.nfeat
. Acest lucru se poate face folosindparam_vals
argument alpo()
Funcționează în timpul construcției sau prin adăugarea valorii parametrului laparam_set$values
Câmpul unui deja creatPipeOpFilter
obiect (a se vedea, de asemenea, exemple de cod în pagina de ajutor). - Creatul
PipeOpFilter
obiectul poate fi aplicat pe unTask
obiect pentru a crea filtrulTask
. Pentru a face acest lucru, putem folosi$train(input)
câmpulPipeOpFilter
obiect și trece un listă conținând sarcina pe care dorim să o filtram.
Sugestie 2:
library(mlr3pipelines) # Set the filter.nfeat parameter directly when constructing the PipeOp: pofilter = po("...", filter = flt(...), ... = list(filter.nfeat = ...)) # Alternative (first create the filter PipeOp and then set the parameter): pofilter = po("...", filter = flt(...)) pofilter$...$filter.nfeat = ... # Train the PipeOpFilter on the task filtered_task = pofilter$train(input = list(...)) filtered_task task
Exercițiul 4: Combinați pipeopfilter cu un elev
Faceți următoarele sarcini:
- Combinați
PipeOpFilter
din exercițiul anterior cu un elev K-NN pentru a crea un așa-numitGraph
(poate conține mai multe etape de preprocesare) folosind%>>%
operator. - Convertiți
Graph
la aGraphLearner
astfel încât să se comporte ca un nou elev care mai întâi prezintă filtrarea și apoi antrenează un model pe datele filtrate și ruleazăresample()
Funcție pentru a estima performanțaGraphLearner
cu o validare încrucișată de 5 ori. - Modificați valoarea
nfeat.filter
parametrul (care a fost setat la 5 în exercițiul precedent) și rulați din nouresample()
.
Sugestie 1:
- Creați un elev KNN folosind
lrn()
. Amintiți -vă că comanda rapidă pentru un clasificator KNN IST"classif.kknn"
. - Puteți concatena diferiți pași de preprocesare și un elev folosind
%>>%
operator. - Utilizare
as_learner
Pentru a crea aGraphLearner
(A se vedea, de asemenea, exemplele de cod din pagina de ajutor?GraphLearner
)
Sugestie 2:
library(mlr3learners) graph = ... %>>% lrn("...") glrn = as_learner(...) rr = resample(task = ..., learner = ..., resampling = ...) rr$aggregate() # Change `nfeat.filter` and run resampling again using same train-test splits ... rr2 = resample(task = ..., learner = ..., resampling = rr$resampling) rr2$aggregate()
Am învățat cum să folosim filtre de caracteristici pentru a clasifica funcțiile WRT o metodă de filtrare a caracteristicilor într -o setare supravegheată și cum să subsetați o sarcină în consecință.
În mod ideal, filtrarea caracteristicilor este încorporată direct în procedura de învățare prin utilizarea unei conducte, astfel încât estimarea performanței după filtrarea caracteristicilor să nu fie părtinitoare.