Documente Academic
Documente Profesional
Documente Cultură
Arbori de decizie
Problema 1
>install.packages("party")
>library(party)
>set.seed(123)
> ind<-sample(2,nrow(iris),replace=TRUE,prob=c(0.7,0.3))
Se extrag 2 esantioane din numarul liniilor setului de date (aici iris), 70% sunt in
primul esantion si 30% in al doilea esantion.
> ind
>traindata<-iris[ind==1,]
Se extrage setul de date de antrenare. “==” este operatorul logic “exact egal cu”.
>traindata
> testdata<-iris[ind==2,]
2
> testdata
>myformula<-Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width
>print( iris_ctree)
> table(predict(iris_ctree),traindata$Species)
Valori reale
setosa 35 0 0
virginica 0 0 32
> table(pred=predict(iris_ctree),true=traindata$Species)
true
setosa 35 0 0
versicolor 0 36 3
3
virginica 0 0 32
1
Petal.Length
p < 0.001
1.9 1.9
3
Petal.Width
p < 0.001
1.7 1.7
4
Petal.Length
p < 0.001
4.6 4.6
1
Petal.Length
p < 0.001
1.9 1.9
2 3
n = 35 Petal.Width
y = (1, 0, 0) p < 0.001
1.7 1.7
4 7
Petal.Length n = 32
p < 0.001 y = (0, 0, 1)
4.6 4.6
5 6
n = 30 n=9
y = (0, 1, 0) y = (0, 0.667, 0.333)
>testpredictie<-predict(iris_ctree, newdata=testdata)
>tab=table(testpredictie, testdata$Species)
> tab
Date reale
previzionate setosa 15 0 0
versicolor 0 13 2
virginica 0 1 13
> library(e1071)
>classAgreement(tab)
$diag
[1] 0.9318182
$kappa
[1] 0.8977537
7
$rand
[1] 0.9175476
$crand
[1] 0.8099668
Coeficientul lui Cohen este 0.8977 (kappa) , rezulta un puternic acord intre
etichetele reale si cele previzionate.
Problema 2
>install.packages("ISLR")
> library(ISLR)
>library(rpart)
>install.packages("pROC")
> library(pROC)
8
> data(Carseats)
>range(Carseats$Sales)
>hist(Carseats$Sales)
>Carseats=data.frame(Carseats, High)
>set.seed(123)
>antrenare<-sample(1:nrow(Carseats), nrow(Carseats)/2)
>setantrenare<-Carseats[antrenare,]
>setantrenare
>settestare<-Carseats[-antrenare,]
>settestare
Relatia de dependenta liniara este intre eticheta (High) cu valorile Yes (Vanzari
mari) si No (Vanzari mici) si restul atributelor setului de date.
>plot(arbore)
>text(arbore, pretty=0)
>install.packages("rpart.plot")
>library(rpart.plot)
https://www.rdocumentation.org/packages/rpart.plot/versions/3.0.9/topics/rpar
t.plot
Daca ShelveLoc este Bad, Medium, atunci probabilitatea ca vanzarile sa fie mari
este 0.35 (81% din date).
>print(arbore)
In nodul 1, sunt 200 observatii, dintre care 86 sunt etichetate cu clasa “Yes” ( high
sales). Vectorul de probabilitate (0.57, 0.43) arata ca 86 observatii sunt in
categoria Yes cu probabilitatea 0.43. Clasa dominanta in nodul 1 este “No”
(vanzari mici), avand probabilitatea cea mai mare, 0.57.
>table(setantrenare$High)
>confuzie<-table(settestare$High, predictie)
>confuzie
Din cele 22+56=78 regiunie cu vanzari mari, 56 regiuni au fost corect previzionate
si 22 regiuni au fost incorect previzionate.
Eroarea de clasificare:
>mean(predictie!=settestare$High)
>predictie1
Curba ROC:
>library(pROC)
13
>curbaroc<-roc(settestare$High, predictie1[,"Yes"])
>plot(curbaroc)
>auc(curbaroc)
Curatarea arborelui=Pruning the tree (daca este cazul, daca arborele este stufos)
O valoare prea mică a lui CP conduce la overfitting; o valoare prea mare a lui CP
va duce la un arbore prea mic. Ambele cazuri scad performanța predictivă a
modelului.
O valoare optimă a lui CP poate fi estimată prin testarea diferitelor valori ale CP,
utilizând abordări de validare încrucișată pentru a determina acuratețea de
predicție corespunzătoare a modelului. Cel mai bun CP este apoi definit ca fiind
cel care va maximiza acuratețea validării încrucişate.
>plotcp(arbore)
15
>mincp<-arbore$cptable[which.min(arbore$cptable[,"xerror"]),"CP"]
>mincp
>printcp(arbore)
>arbore1<-prune(arbore,
cp=arbore$cptable[which.min(arbore$cptable[,"xerror"]),"CP"])
>predictie3
18
Curba ROC:
>library(pROC)
>curbaroc1<-roc(settestare$High, predictie3[,"Yes"])
>plot(curbaroc1)
>auc(curbaroc1)
Desi arborele curatat are doar 3 noduri terminale, eroarea de clasificare a crescut
si capacitatea clasificatorului de separare a claselor a scazut la 76.16%.
>library(tree)
>library(ISLR)
19
>data(Hitters)
Folosim setul de date Hitters din biblioteca ISLR pentru a previziona salariul unui
jucator de baseball in functie de vechimea in liga (Years) si de numarul de meciuri
castigate (Hits).
>Hitters<- na.omit(Hitters)
>hist(Hitters$Salary)
>hist(Hitters$Salary)
20
>install.packages("caret")
>library(caret)
>split
Setul de antrenare:
21
>train
>test
>install.packages("tree")
>library(tree)
>plot(arbore)
>text(arbore, pretty=0)
22
Fiecare nod terminal al arborelui are afisat salariul mediu logaritmat salariul
mediu al jucatorilor de baseball din acel nod.
>cv.trees$size
>cv.trees$dev
Cea mai mică eroare, 35.14 corespunde unui arbore cu 5 noduri terminale.
>plot(arbore1)
>text(arbore1, pretty=0)
24
>pred<-predict(arbore1, test)
>pred
>plot(pred, test$Salary)
>mean((pred - test$Salary)^2)
>library(rpart.plot)
25
>library(ISLR)
>attach(Carseats)
>Carseats<-na.omit(Carseats)
>set.seed(111)
>library(caret)
>split
>train
>test
>plot(arbore)
>text(arbore, pretty=0)
26
>pred
>mean(pred==test$Sales)
>confuzie<-table(pred,test$Sales)
>confuzie
27
>set.seed(12)
>cv.tree1$size
>cv.tree1$dev
Eroarea cea mai mica, 52, corespunde unui arbore cu 14 noduri terminale (un
arbore mai simplu).
>plot(arbore1)
>text(arbore1, pretty=0)
29
>prune.predictie
>mean(prune.predictie==test$Sales)
75.47% din datele de testare sunt corect etichetate. Acuratetea predictiei pe setul
de testare a crescut.
>confuzie1<-table(prune.predictie,test$Sales)
>confuzie1
30