Inteligenta Computationala- Seminar
Retele neuronale artificiale
Problema 1 Creditscoring
CREDIT SCORING = analiza background-ului unei persoane pentru a
evalua increderea in ea la acordarea unui credit. Setul de date
“[Link]” consta in 2000 de clienti care au luat un credit de la o
banca. Atributele numerice sunt: venit (anual), varsta, imprumut (euro),
LTI (the loan to yearly income ratio=raportul dintre imprumut si venitul
anual al clientului). Scopul studiului este de a concepe un model care sa
faca predictii, pe baza variabilelor de intrare varsta si LTI, asupra riscului
incapacitatii de plata in 10 ani. Riscul incapacitatii de plata ia valorile 0 si
1.
0- Nu exista risc
1- Exista risc
Se instaleaza intai biblioteca „neuralnet”.
>[Link]("neuralnet")
>library(neuralnet)
>[Link](1234567890)
Deoarece ordonarea clientilor in lista este aleatoare, se construieste un
set de antrenare format din primele 800 de observatii pentru a antrena
RNA (=retea neuronala artificiala) si setul de testare va fi format din
observatiile 801:2000.
File->Import dataset ->From text (readr)
>View(creditset)
1
>dataset<-creditset
Setul de antrenare:
>trainset <- dataset[1:800, ]
>View(trainset)
Setul de testare:
>testset <- dataset[801:2000, ]
Se va construi o retea neuronala cu 4 noduri ascunse.
>creditnet <- neuralnet(default10yr ~ LTI + age, trainset, hidden = 4,
lifesign = "minimal", [Link] = FALSE, threshold = 0.1)
Explicatia parametrilor:
# hidden = 4 strat ascuns cu 4 neuroni
#lifesign = "minimal" Afișează mesaje minimale în timpul antrenării
#[Link] = FALSE Rețeaua folosește o funcție de activare
sigmoidă (pentru clasificare)
#threshold = 0.1 Antrenarea se oprește când erorile de învățare sunt
sub 0.1
VIZUALIZAREA RETELEI
>plot(creditnet, rep = "best")
2
S-a obtinut o eroare egala cu 0.67 in 8705 iteratii.
Odata antrenata reteaua, ea trebuie testata cu setul de testare testset.
Din setul de testare se extrag numai coloanele independente LTI si age.
>temp_test <- subset(testset, select = c("LTI", "age"))
>View(temp_test)
Functia compute() calculeaza outputul, fiind data o retea antrenata.
>[Link] <- compute(creditnet, temp_test)
Se compara rezultatele reale(=actuale) cu cele previzionate.
>results <- [Link](actual = testset$default10yr, prediction =
[Link]$[Link])
Afisam primele 15 observatii din setul de date de testare, clasa actuala si
cea previzionata.
3
>results[100:115, ]
Rotunjim superior rezultatele predictiei:
>results$prediction <- round(results$prediction)
>results[100:115, ]
Se observa ca etichetele reale si cele previzionate coincid.
Matricea de confuzie:
>tab=table(testset$default10yr, results$prediction)
>tab
>library(e1071)
>classAgreement(tab)
Problema 2 cu un set de date generat aleator
>library(neuralnet)
Sunt generate 50 de numere uniform distribuite intre 0 si 100.
>traininginput <- [Link](runif(50, min=0, max=100))
>traininginput
Se creeaza setul de tinte(=iesiri dorite, date), ca fiind radical din datele
de intrare din setul de antrenare.
>trainingoutput <- sqrt(traininginput)
4
>trainingoutput
Sunt create datele de antrenare (intrari + tinte) intr-o singura
variabila(=matrice cu 2 coloane):
>trainingdata <- cbind(traininginput,trainingoutput)
>trainingdata
Sunt denumite cele 2 coloane cu "Input","Output".
>colnames(trainingdata) <- c("Input","Output")
>colnames(trainingdata)
Se antreneaza reteaua. Aceasta retea este recurenta, de tip
„back-propagation”. Reteaua a fost antrenata sa extraga radicalul.
>retea<- neuralnet(Output ~ Input, trainingdata, hidden=10,
threshold=0.01)
Este desenata reteaua si ponderile. Cu albastru este reprezentat biasul.
>plot(retea)
5
1 0.1495 1
-3
.60
70
-2.5
2
233
1.7
3
05
0.2
07
90
31
-0.5
242
2.
16
39
-1.49
7
-3.
225
26
-0.60
14
5
04 42518
515
71 1
5
0.176
9
0-[Link]
64 6.5647
45 8
-0..02327
94
Input 0 Output
-0
-0. .02571
02 23
95 3.1019 -1.352
-000..00760
4
.044796
03 2
5
5
49
01
-1.
-1.2338
5
6
26
37
0.
-0.52124
61
47
2.1
0.61631
8
969
2.2
Error: 0.000368 Steps: 16161
Acum testam reteaua cu un set de testare:
Sunt generate numerele de la 1 la 10 si sunt calculate patratele lor.
>testdata <- [Link]((1:10)^2)
>testdata
6
Testam reteaua cu setul de testare.
>[Link] <- compute(retea, testdata)
Sunt afisate atributele variabilei [Link]:
>ls([Link])
Sunt afisate rezultatele previzionate pentru setul de testare:
>print([Link]$[Link])
>output1<-
cbind(testdata,sqrt(testdata),[Link]([Link]$[Link]))
>output1
Pe coloana a 2-a a tabelului anterior sunt afisate patratele primelor 10
numere intregi(=setul de testare), iar pe ultima sunt afisate rezultatele
previzionate de retea (numerele de la 1 la 10):
Denumim coloanele:
>colnames(output1) <- c("Input","Expected Output","Neural Net
Output")
Sunt afisate rezutatele dorinte(=tintele) si rezultatele previzionate de
retea.
>print(output1)
7
Pe ultima coloana sunt rezultatele furnizate de reteaua neuronala.
Problema 3 RNA pentru clasificare atunci cand variabila dependenta
are mai mult de 2 clase
Setul de date “[Link]” contine 100 universitati din lume
clasificate in functie de:
•Article= este o măsură de productivitate științifică curentă, care include
articole publicate în reviste care sunt listate în prima, a doua și a treia
cuartila în ceea ce privește factorul de impact al jurnalului. Ponderea
acestui indicator in clasamentul general este de 21%.
•Citation= este o măsură de impact al cercetare și un scor în funcție de
numărul total de citari primite în 2012-2016 pentru articolele publicate
în 2012-2016 în jurnalele care sunt listate în prima, a doua și a treia
cuartila în ceea ce privește factorul de impact al jurnalului. Efectul citarii
asupra clasamentului general este 21%.
•[Link]= este măsura de durabilitate și continuitate a
productivității științifice reprezentate de numărul total de documente
care acoperă toate rezultatele academice ale instituțiilor, inclusiv lucrări
de conferințe, recenzii, note, discuții, în plus față de articole de jurnal
publicate în perioada 2012-2016. Ponderea acestui indicator este de
10%.
•Article Impact Total=AIT
•Citation Impact Total=CIT
•Collaboration= este o măsură de acceptare globală a unei universități.
Date internaționale de colaborare, care se bazează pe numărul total de
articole publicate în colaborare cu universitățile străine, se obțin pentru
anii 2012-2016. Ponderea acestui indicator este de 15% în clasamentul
general.
>date<-universitati
>head(date)
Variabila calitativă este categoria universităţii în funcţie de indicatorii de
performanţă ştiintifică: A, A+, A++, B++
>table(date$Category)
8
Se elimină primele două coloane din setul de date:
>date<-date[,-c(1,2)]
>View(date)
Se extrag aleator 700 obiecte pentru setul de antrenare:
>itrain <- date[sample(1:1000, 700),]
>head(itrain)
Se adaugă la setul de antrenament itrain patru atribute, conţinând
valoarea de adevăr a apartenenţei fiecărei universitati la cele 4 categorii:
A, A+,A++, B++:
>itrain$A <- c(itrain$Category == "A")
>itrain$A1 <- c(itrain$Category == "A+")
>itrain$A2 <- c(itrain$Category == "A++")
>itrain$B2 <- c(itrain$Category == "B++")
Din setul de antrenament se elimină clasa, “Category”:
>itrain$Category <- NULL
>head(itrain)
Se antrenează reţeaua neuronală care conţine 3 noduri în stratul ascuns.
>library(neuralnet)
>retea <- neuralnet(A + A1 + A2+B2 ~
Article+Citation+AIT+CIT+Collaboration, itrain,
hidden=3, lifesign="full", stepmax=1e6)
9
Parametrul stepmax din functia neuralnet determina convergenta
algoritmului. Cu cat stepmax este mai mare, cu atat algoritmul are mai
mult timp pentru a converge.
Rep=”best”: se alege iteratia care conduce la cea mai mica eroare.
Daca algoritmul nu converge dupa 1000000 pasi, se alege hidden=1 (o
retea neuronala mai simpla, cu un singur neuron in stratul ascuns).
>plot(retea, rep="best", intercept=FALSE)
Se realizează o predicţie a categoriei universitatilor pentru fiecare
observaţie pe baza reţelei antrenate, dupa ce am eliminat coloanele 1 si
4, care nu s-au folosit in antrenarea retelei
>predictie <- compute(retea, date[,-c(1,4)])
Rezultatele (gradul de apartenenţă al primelor 10 observaţii) la fiecare
categorie (= tipul previzionat de universitate) sunt afişate prin comanda:
>predictie$[Link][1:10,]
10
Variabila rezultat conţine clasa “A”, “A+”, “A++” , “B++” pe baza
predicţiei.
>rezultat<-0
>for (i in 1:1000) { rezultat[i] <- [Link](predictie$[Link][i,]) }
>for (i in 1:1000) { if (rezultat[i]==1) {rezultat[i] = " A " } }
>for (i in 1:1000) { if (rezultat[i]==2) { rezultat[i] = " A+" } }
>for (i in 1:1000) { if (rezultat[i]==3) { rezultat[i] = " A++ " } }
>for (i in 1:1000) { if (rezultat[i]==4) { rezultat[i] = " B++ " } }
>comparatie <- date
>comparatie$Predicted <- rezultat
>comparatie
>head(comparatie)
Variabila numită comparatie cuprinde în coloanal 1 si coloana 8 clasa
reală şi clasa previzionată. Pentru primele 6 observaţii din setul de date
sunt afişate cele 2 clase (clasa reala – coloana 1; clasa previzionata-
coloana 8)
Pentru primele 10 observatii sunt afisate clasa reala si clasa previzionata:
>comparatie[1:10, c(1,8)]
11
Matricea de confuzie:
>tab=table(comparatie$Category, comparatie$Predicted)
>tab
>library(e1071)
>classAgreement(tab)
La retelele neuronale din R apare frecvent fenomenul de overfitting.
Problema 4 RNA utilizate in regresie =previzionarea valorilor unor
variabile numerice (setul de date [Link])
Să se realizeze o predicţie a scorului conţinutului nutriţional al cerealelor
din setul de date [Link] pe baza unei reţele neuronale.
Rezolvare:
Setul de date “[Link]” conţine 80 de tipuri de cereale şi conţinutul lor
nutriţional. Variabila dependenta este “rating”, un scor acordat fiecărui
tip de cereale.
>View(cereal)
12
>date<-cereal
> [Link](123)
75% din date vor fi în setul de antrenare, iar 25% în setul de testare. .
> [Link]("caTools")
> library(caTools)
Biblioteca “caTools” va fi utilizată pentru a diviza setul de date cu funcţia
[Link]:
> split = [Link](date$rating, SplitRatio = 0.75)
> setantrenare<-subset(date, split==TRUE)
>View(setantrenare)
> settestare<-subset(date, split==FALSE)
>View(settestare)
Se elimină primele trei coloane care nu sunt numerice:
> date1<-date[,-c(1:3)]
Standardizăm datele:
Se determina maximul pe fiecare coloana:
> maxim<-apply(date1, 2, max)
>maxim
Se determina minimul pe fiecare coloana:
> minim<-apply(date1, 2, min)
>minim
13
Standardizare max-min:
> datestand<-[Link](scale(date1, center=minim,
scale=maxim-minim))
>View(datestand)
Se creează setul de testare şi setul de antrenare pentru antrenarea
reţelei:
> library(neuralnet)
> antrenareretea<-subset(datestand, split==TRUE)
>antrenareretea
> testareretea<-subset(datestand, split==FALSE)
>testareretea
Se construieşte reţeaua neuronală cu intrările “calories”, “protein”, “fat”,
“sodium”, “fiber” şi ieşirea “rating”:
> retea=neuralnet(rating ~ calories + protein + fat + sodium + fiber,
antrenareretea, hidden=5, [Link]=T)
#hidden = 5 Rețeaua are 1 strat ascuns cu 5 neuroni
#[Link] = TRUE Rețeaua va avea o ieșire numerică continuă, deci
este un model de regresie
> plot(retea)
14
Reteaua de mai sus are 5 neuroni în stratul ascuns. Ponderile sunt
calculate conform algoritmului de “back-propagation”. Cu albastru este
reprezentat biasul.
Dorim o predicţie a scorului tipurilor de cereale:
>predictie<-compute(retea, testareretea[,c(1:5)])
In componenta [Link] a outputului functiei compute() sunt continute
predictiile:
>predictie$[Link]
>head(predictie$[Link])
Acestea sunt valori prevzionate standardizate.
Valorile previzionate ale variabilei rating vor fi aduse la dimensiunile
initiale pentru a fi comparate cu cele reale:
>predictie=(predictie$[Link]*
(max(date$rating)-min(date$rating)))+min(date$rating)
Primele şase valori previzonare din setul de testare sunt:
> head(predictie)
15
Se reprezintă valorile reale şi cele previzionate:
>plot(settestare$rating, predictie, col= "red", pch=12, ylab= "Valori
previzionate de retea ", xlab= "Valori reale ")
>abline(0,1)
Se determină eroarea de predicţie RMSE (Root Mean Square Error)
pentru setul de testare conform formulei:
16
n
( Pi Oi ) 2
i 1
RMSE
n
Pi este valoarea previzionată, Oi este valoarea observată, n=numărul
de observaţii.
>eroare=(sum(settestare$rating-predictie)^2/nrow(settestare))^0.5
> eroare
>[Link](settestare$rating, predictie)
Problema 5 (cu setul de date [Link]) libraria deepnet
Se extrage ultima coloana, eticheta “admitted”:
>y = [Link](Marks[,3])
>y
>y[which(y=="0")] = 0
>y[which(y=="1")] = 1
Observatie:
Daca variabila dependenta admitted avea valorile de tip caracter “admis” si “respins”,
ele se transformau prin ultimele 2 comenzi in 0 si 1.
>y = [Link](y)
>y
>x = [Link]([Link](Marks[,1:2]))
>x
17
>x = matrix([Link](x),ncol=2)
>x
Apoi folosim functia [Link] din libraria “deepnet” pentru a modela reteaua
neuronala. Vom avea 5 neuroni in stratul ascuns.
>[Link]("deepnet")
>library(deepnet)
>nn <- [Link](x, y, hidden = c(5))
Predictia iesirii pe baza intrarilor x:
>yy = [Link](nn, x)
>print(head(yy))
Acestea sunt rezultatele de iesire nerotunjite.
Outputul produs de retea este convertit in clase. Se construieste un vector coloana
cu elemente 0 de dimensiune egala cu vectorul yy:
>yhat = matrix(0,length(yy),1)
#
>yhat
18
Elementele vectorului de iesire yy se rotunjesc la 1 daca sunt mai mare decat media,
si la 0 daca sunt mai mici decat media.
>yhat[which(yy > mean(yy))] = 1
>yhat[which(yy <= mean(yy))] = 0
Matricea de confuzie:
>tab=table(y, yhat)
>tab
Pe liniile matricei de confuzie sunt etichetele reale y iar pe coloana sunt etichetele
previzionate de retea si rotunjite yhat.
Din 27+13=40 studenti picati, 24 au fost corect previzionati si 13 eronat etichetati ca
fiind admisi.
Din 11+49=60 studenti admisi, 49 au fost corect previzionati si 11 eronat etichetati
ca fiind picati.
Rata de acuratete a retelei:
>print(sum(diag(tab))/sum(tab))
76% din elementele setului de date au fost corect etichetate.
Curba ROC
Intai detasam libraria deepnet pentru a putea lucra cu libraria pROC
>detach(package:deepnet,unload = T)
# [Link]("pROC")
> library(pROC)
# yy = probabilități (predicții continue)
# y = valori reale binare (0/1)
> roc_obj <- roc(y, yy)
> plot(roc_obj, col = "blue", main = "Curba ROC - cu pROC")
19
> cat(" AUC =", round(auc(roc_obj), 3), "\n")
Clasificatorul are capacitatea de 74.1% de a distinge intre clasa studentilor admisi si a
celor picati.
20