Sunteți pe pagina 1din 18

KNN în R- K-Nearest Neighbours

Problema 1 Variabila dependenta are 2 clase

Vom folosi datele istorice ale statisticilor de câștig/pierdere din trecut și


ale discursurilor corespunzătoare. Acest set de date numit “US
presidential data.csv” cuprinde 1524 de observații (discursuri in
campania prezidentiala) privind 14 variabile. Variabila dependentă este
Win.Loss (câștig /pierdere) (discurs castigator/ perdant) în cazul în care 1
indică Win și 0 indică pierderea. Variabilele independente sunt:

1. proporția de cuvinte în discursul care arată:

a. optimism

b. pesimism

c. utilizarea trecutului

d. utilizarea prezentului

e. utilizarea viitorului

2. de cate ori se menționează propriul partid

3. de cate ori se menționează opozitia

4. unele măsuri care indică conținutul vorbirii indicând:

a. deschiderea

b. conştiinciozitatea

c. extrovertirea

d. agrearea
e. nevrotic

f. emoţional

> date<-read.csv("C:/US Presidential Data.csv")

> head(date)

> library(caret)

> library(e1071)

Se transformă variabila dependentă Win.Loss în variabila factor:

>date$WinLoss<-as.factor(date$`Win/Loss`)

> set.seed(101)

Setul de antrenare conţine 70% din date, iar setul de testare 30 % din
date.

> index<-sample(2, nrow(date), replace=TRUE, prob=c(0.7, 0.3))

>index

> setantrenare<-date[index==1,]

>setantrenare

> settestare<-date[index==2,]
>settestare

În mod implicit, nivelurile variabilei dependente din acest set de date


sunt "0", "1". Când vom face predicția, aceste niveluri vor fi folosite ca
nume de variabile pentru predicție, astfel încât le vom transforma în
nume de variabile valide.

> levels(setantrenare$WinLoss) <-


make.names(levels(factor(setantrenare$WinLoss)))

>levels(settestare$WinLoss) <-
make.names(levels(factor(settestare$WinLoss)))

Vom folosi validarea încrucişată cu funcţia trainControl. “numbers”


denotă 10 validări încrucişate şi “repeats” faptul că repetăm de 3 ori cele
10 validări încrucişate.

Observatie:

Cross-validation =validarea incrucisata (repetata de 10 ori, de exemplu),


implica aleator impartirea setului de antrenare in 10 grupe de
dimensiune egala. De exemplu, 90% din date sunt utilizate pentru a
instrui modelul, iar restul de 10% pentru a il valida. Rata de clasificare
este apoi calculata pe datele de validare 10%. Aceasta operatie de
repeta de 10 ori. Diferite grupuri de observatii sunt tratate ca un set de
validare in fiecare din cele 10 repetari. Aceasta conduce la 10 estimari
ale erorii de validare, care sunt calculate ca o medie.

> repeats = 3

> numbers = 10

> set.seed(1234)
> x = trainControl(method = "repeatedcv", number = numbers,repeats =
repeats, classProbs = TRUE,summaryFunction = twoClassSummary)

Functia twoClassSummary calculeaza senzitivitatea, specificitatea si aria


de sub curba ROC.

classProbs=TRUE calculeaza probabilitatea de a apartine claselor 0, 1.

repeatedcv=validare incrucisata (cross validation) repetata

Numarul de reglari ale algoritmului este dat de variabila “tunel”:

> tunel = 10

Folosind funcția trainControl() din biblioteca “caret” vom rula KNN;


WinLoss este variabila dependentă. Setarea parametrului preProcess la
centru și scală ne spune că standardizăm variabilele independente:

center: scăderea mediei din valori.

scale: împărțim valorile cu abaterea standard.

trControl se aplică lui "x", care a fost obținut prin intermediul funcţiei
trainControl() și tunelength este întotdeauna un întreg, care este folosit
pentru a regla algoritmul.

> model1 <- train(WinLoss~. , data = setantrenare, method ="knn",


preProcess = c("center","scale"), trControl = x,metric="ROC",
tuneLength = tunel)

> model1
k reprezinta numarul celor mai apropiati vecini ai unei observatii;
ROC=aria de sus curba ROC; Sens=senzitivitatea; Spec=specificitatea.

Cea mai mare valoare a ariei de sub curba ROC este 0.9998625,
corespunzatoare modelului optim cu cei mai apropiati 23 vecini.

0.999 este apropiat de 1 deci modelul este considerat foarte adecvat


pentru separarea discursurilor castigatoare de cele necastigatoare.

> plot(model1)
În cele din urmă, pentru a face predicții pe setul nostru de validare, vom
folosi funcția de predicție în care primul argument este modelul și al
doilea argument este dat de noile date pe care ne dorim predicțiile.

Predictia clasei pe setul de testare:

> valid_pred <- predict(model1,settestare, type = "prob")

> head(valid_pred)

Probabilitatea ca primul discurs sa fie castigator este 1, etc.

Se reprezinta grafic si se determina aria de sub curba ROC pentru setul


de testare:
> library(ROCR)

> pred_val <-prediction(valid_pred[,2],settestare$WinLoss)

Calculul ariei de sub curba ROC:

> perf_val <- performance(pred_val,"auc")

>perf_val

Trasarea curbei ROC:

> perf_val <- performance(pred_val, "tpr", "fpr")

> plot(perf_val, col = "green", lwd = 1.5)

“lwd” reprezintă lăţimea dreptei “lwd=1.5” înseamnă că dreapta este de


1.5 ori mai lată decât valoarea implicită, “lwd=1”.
> auc<-performance(pred_val, measure="auc")

>auc<-auc@y.values[[1]]

> auc

Aria de sub curba ROC este 0.9999.

Aria de sub curba ROC indica sanse de 99.99% de separare a clasei


pozitive (vot castigator) de clasa negativa (vot necastigator).

Problema 2 Variabila dependenta are mai mult de 2 clase

Setul de date se numeste: olive.csv

Setul de date contine 572 observatii (ulei de masline) si 10 variabile:


2 variabile categoriale:
Region: 3 regiuni din Italia: Nord, Sud, insula Sardinia
Area: 9 suprafete
Si 8 tipuri de acid in componenta uleiului de masline (in procente)

>View(olive)
>install.packages("class")
>library(class)
Se elimina coloanele 1,2,3.
Variabila eticheta va fi aria (“area”).
>olive_1<-olive[,-c(1,2,3)]

>View(olive_1)
>olive_1<-data.frame(olive_1,olive$area)
>set.seed(123)

Se extrag doua esantioane, corespunzatoare setului de antrenare (80%


din date) si setului de testare (20%).
>ind<-sample(2, nrow(olive_1), replace=TRUE, prob=c(0.80,0.20))
>ind
Setul de antrenare:
>antrenare<-olive_1[ind==1,1:8]

>dim(antrenare)[1]
>antrenare
Setul de testare:
>testare<-olive_1[ind==2,1:8]
>dim(testare)[1]
>testare

Etichetele celor 2 seturi:

>etichetaantrenare<-olive_1[ind==1,9]
>etichetaantrenare
>length(etichetaantrenare)
>etichetatestare<-olive_1[ind==2,9]
>etichetatestare

Se fixeaza cei mai apropiati 3 vecini ai oricarui obiect: k=3:


>predictie<-knn(train=antrenare, test=testare, cl=etichetaantrenare, k=3)
>predictie

Functia knn (k-nearest neighbours) este in biblioteca “class”.

Matricea de confuzie:

>tab<-table(true=etichetatestare, pred=predictie)

>tab
Elementele de pe diagonala principala reprezinta nr. de observatii corect
previzionate.
Restul sunt erori.

Eroarea de clasificare:
>mean(etichetatestare!=predictie)

11.6% din observatiile setului de testare sunt incorect clasificate.

Problema 3

Setul de date music_sub.csv

Variabile:
Name artist
Rock type rock, classical, new wave
lvar, lave, lmax : media, varianta maximum frecvente
Lfener: indicator al amplitudinii sunetului
Lfreq: mediana pozitiei celor mai inalte 15 sunete acute in periodograma
>install.packages("tidyverse")
>library(tidyverse)

Pachetul tidyverse se aplica pentru manipularea si vizualizarea datelor.

>library(caret)
>set.seed(123)

>View(music_sub)

Se elimina observatiile 55,56, 57 care au tipul de muzica “new wave”.


>date<-music_sub[-c(55,56,57),]

Se elimina coloanele 1 si 2.
>date1<-date[,-c(1,2)]

>View(date1)
Functia createDataPartition din biblioteca caret imparte un set de date
in 2 submultimi. p=0.8 este proportia datelor din setul de antrenare
(80%).
list=FALSE : esantionul este afisat pe coloana
List=TRUE: esantionul este afisat pe linie
>training.sample<-date1$type %>% createDataPartition(p=0.8,
list=FALSE)
>training.sample
Setul de antrenare:
>train.data<-date1[training.sample,]
>train.data
Setul de testare:
>test.data<-date1[-training.sample,]
>test.data

Vom folosi biblioteca caret care automat testeaza diverse valori ale
numarului de vecini k, determinand k optim pentru care eroarea de
validare incrucisata este minima.
Pachetul caret poate preprocesa datele automat pentru a normaliza
variabilele predictive.
Vom folosi urmatoarele argumente in functia train():
trControl : stabileste o validare incrucisata repetata de 10 ori
preProcess: normalizeaza datele
tuneLength: specifica valorile posibile ale lui k (de la 1 la 20)
>model<-train(type ~ ., data=train.data, method="knn",
trControl=trainControl("cv", number=10), preProcess=c("center",
"scale"), tuneLength=20)
>plot(model)
Pe Ox: numarul de vecini k
Pe Oy: acuratetea modelului

Parametrul optim k care maximizeaza acuratetea modelului:


>model$bestTune

Se obtine k=15 la iteratia 6 din 20.


Predictii asupra setului de testare:

>predicted.classes<-model %>% predict(test.data)


>predicted.classes
Rata de exactitate a modelului:
>mean(predicted.classes == test.data$type)

100% din datele de testare au fost corect previzionate.

Problema 4 KNN in probleme de regresie

Vrem sa previzionam salariul jucatorilor de baseball.


>library(tree)
>library(ISLR)
>data(Hitters)
Se omit datele lipsa:

>Hitters<- na.omit(Hitters)

>library(caret)

>set.seed(123)

>library(tidyverse)

Se imparte setul de date in 80% set de antrenare si 20% set de testare.

>split <- Hitters$Salary %>% createDataPartition(p=0.8, list=FALSE)

>split

>train.data<-Hitters[split,]

>traindata
>test.data<-Hitters[-split,]

>test.data

Numarul de cei mai apropiati k vecini se determina cu biblioteca caret. K


optim minimizeaza eroarea de predictie RMSE (root mean squared
error).
>set.seed(123)
>model<-train(Salary ~ ., data=train.data, method="knn",
trControl=trainControl("cv", number=10), preProcess=c("center",
"scale"), tuneLength=20)
>plot(model)

Pe Ox: este reprezentat nr de vecini posibili ai unei observatii


Pe Oy: eroarea de predictie RMSE

>model$bestTune
K optim este 9.

Se previzioneaza salariul pentru setul de testare:

>predictions<-model %>% predict(test.data)


>predictions

Se determina eroarea de predictie:


>RMSE(predictions, test.data$Salary)

RMSE se determina ca radicalul mediei patratelor diferentelor dintre


valorile reale si cele previzionate ale variabilei salary.

>plot(predictions, test.data$Salary)

S-ar putea să vă placă și