Sunteți pe pagina 1din 8

Retele neuronale

Aplicatia 1. CREDIT SCORING

CREDIT SCORING = analiza background-ului unei persoane pentru a evalua increderea in ea


la acordarea unui credit.
Setul de date 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.
Se instaleaza intai biblioteca „neuralnet”.
>library(neuralnet)
> set.seed(1234567890)
Deoarece ordonarea clientilor in lista este aleatoare, se construieste un set de antrenare format
din primele 1800 de observatii pentru a antrena RNA (=retea neuronala artificiala) si setul de
testare va fi format din observatiile 1801:2000.
>dataset <- read.csv("C:/creditset.csv")
>dataset
>head(dataset) Vizualizeaza primele 6 observatii din setul de date.
>trainset <- dataset[1:800, ]
>trainset
>testset <- dataset[801:2000, ]
>testset
Se va construi o retea neuronala cu 4 noduri ascunse.
>creditnet <- neuralnet(default10yr ~ LTI + age, trainset, hidden = 4,
lifesign = "minimal",
linear.output = FALSE, threshold = 0.1)

Explicatia parametrilor:
lifesign="minimal" inseamna „comentarii minime”.
"none" inseamna nici un comentariu
"full" inseamna comentarii complete.
linear.output=FALSE inseamna ca functia de activare nu este liniara.
threshold = 0.1=valoarea pragului de activare
hidden=nr. de neuroni ascunsi
>plot(creditnet, rep = "best") Este vizualizata reteaua, sunt afisate
nr. de pasi,eroarea si ponderile.
Optiunea rep="best" poate lipsi. Daca este precizata, se va afisa
reteaua cu cea mai mica eroare.

1
1 1

-1
.12
96
2

1.2
89
55

-3 .1
.79

4
54

0
LTI

045
-0 .9
4 93
6
6445 .33

-3 .91
.99 752

-8 5
54

.0 4

784
063
-1 1.2 7
817 default10yr

811
.21
10 14

65
9
61
00..075

0 57
age 0.16
-4 .61 17

-0
.02
99
7
94

3
1.3
1
-1

Error: 0.792022 Steps: 7266

Odata antrenata reteaua, ea trebuie testata cu setul de testare


testset.
>temp_test <- subset(testset, select = c("LTI", "age")) Din setul de
testare se extrag numai coloanele independente LTI si age.
>creditnet.results <- compute(creditnet, temp_test)
Functia compute() calculeaza outputul, fiind data o retea antrenata.
>results <- data.frame(actual = testset$default10yr, prediction =
creditnet.results$net.result) Se compara rezultatele reale(=actuale)
cu cele previzionate.
>results[100:115, ]
Afisam primele 15 observatii din setul de date de testare, clasa
actuala si cea previzionata.
actual prediction
900 0 0.0000000000000000000000000015964854322398
901 0 0.0000000000000000000000000065162871249459
902 0 0.0000000000164043993271687692878796349660

2
903 1 0.9999999999219191249011373656685464084148
904 0 0.0000000000000000013810778585990655628959
905 0 0.0000000000000000539636283549268839978413
906 0 0.0000000000000000000234592312583964807452
907 1 0.9581419934268182725389806364546529948711
908 0 0.2499229633059938393557786184828728437424
909 0 0.0000000000000007044361454974903653282470
910 0 0.0006082559674722681341413332845036165963
911 1 0.9999999878713862200285689141310285776854
912 0 0.0000000000000000000000000015562211243506
913 1 0.9999999993455563895849991240538656711578
914 0 0.0000000000000000000000000000003082538282
915 0 0.0000000019359618836434052080615331181690

Rotunjim superior rezultatele predictiei:


>results$prediction <- round(results$prediction)
>results[100:115, ]
results[100:115, ]
actual prediction
900 0 0
901 0 0
902 0 0
903 1 1
904 0 0
905 0 0
906 0 0
907 1 1
908 0 0
909 0 0
910 0 0
911 1 1
912 0 0
913 1 1
914 0 0
915 0 0

Se observa ca rezultatele reale si cele previzionate coincid.

Aplicatia 2 cu un set de date generat aleator

>library("neuralnet")
>traininginput <- as.data.frame(runif(50, min=0, max=100)) Sunt
generate 50 de numere uniform distribuite intre 0 si 100.
>traininginput
>trainingoutput <- sqrt(traininginput) Se creeaza setul de tinte(=iesiri dorite,
date), ca fiind radical din datele de intrare din setul de antrenare.
>trainingoutput
> trainingdata <- cbind(traininginput,trainingoutput) Sunt create
datele de antrenare(intrari + tinte) intr-o singura variabila(=matrice
cu 2 coloane)
> trainingdata

3
> colnames(trainingdata) <- c("Input","Output") Sunt denumite cele 2
coloane cu "Input","Output".
> colnames(trainingdata)
Se antreneaza reteaua numita „retea”. Aceasta retea este recurenta, de
tip „back-propagation”.
> retea<- neuralnet(Output ~ Input, trainingdata, hidden=10,
threshold=0.01)
(hidden=10=nr. de neuroni ascunsi , threshold=0.01=pragul de activare)
> print(retea) Sunt afisati nr. de pasi, eroarea si pragul de activare.
>plot(retea) Este desenata reteaua si ponderile. Cu albastru este reprezentat
biasul.

1.04
1 4
0.
31 - 35 1
6 4 2 .0

-1 .
7

57
178 422 6 .35
8 0 -0 .21
16

2.
8
499 -0 .54 92 0.329 -2 .54

1
51
4

2.5
56
1.895
0 2884

72
033815
7
00-.0.0.10

39
7

-3 .78
0-.00.26 503 262
36

Input Output
00..0034 25 66
28 1.130
1-1401.0.2

97
.0 25639

052 8.515 24 1.134 7414 .16 554


2 3 866

5
28
65

3.7
13
79
.0
-0
24
211 .93 2
-0 .
65 -1

Error: 0.000808 Steps: 6169

Acum testam reteaua cu un set de testare:


>testdata <- as.data.frame((1:10)^2) Sunt generate numerele de la 1 la 10 si sunt
calculate patratele lor.
>testdata
>net.results <- compute(retea, testdata) Testam reteaua cu setul de testare.
>ls(net.results) Sunt afisate atributele lui net.results:
[1] "net.result" "neurons"
> print(net.results$net.result) Sunt afisate rezultatele previzionate ale setului de testare:

4
[,1]
[1,] 1.111492212
[2,] 1.980752951
[3,] 3.008012307
[4,] 3.995786521
[5,] 5.001154643
[6,] 6.006484772
[7,] 6.996216467
[8,] 7.994651956
[9,] 9.005557297
[10,] 9.982025137

>output1 <- cbind(testdata,sqrt(testdata),as.data.frame(net.results$net.result))


>output1
:10)^2 (1:10)^2 V1
1 1 1 1.111492212
2 4 2 1.980752951
3 9 3 3.008012307
4 16 4 3.995786521
5 25 5 5.001154643
6 36 6 6.006484772
7 49 7 6.996216467
8 64 8 7.994651956
9 81 9 9.005557297
10 100 10 9.982025137

Pe coloana a 2-a sunt afisate patratele primelor 10 numere intregi(=setul de


testare), iar pe ultima sunt afisate rezultatele previzionate de retea.

>colnames(output1) <- c("Input","Expected Output","Neural Net Output")


Denumim coloanele.
>print(output1) Sunt afisate rezutatele dorinte(=tintele) si rezultatele
previzionate de retea.
Input Expected Output Neural Net Output
1 1 1 1.111492212
2 4 2 1.980752951
3 9 3 3.008012307
4 16 4 3.995786521
5 25 5 5.001154643
6 36 6 6.006484772
7 49 7 6.996216467
8 64 8 7.994651956
9 81 9 9.005557297
10 100 10 9.982025137

Aplicatia 3 cu setul de date iris


> library(neuralnet)

5
> set.seed(101)
> size.sample <- 50
> iristrain <- iris[sample(1:nrow(iris), size.sample),] Se construieste un set de
antrenament prin extragerea unui esantion aleator de marime size.sample (=50) din
setul de date iris.
>iristrain
> nnet_iristrain <- cbind(iristrain, iristrain$Species == 'setosa') La setul de
antrenare iristrain se adauga o coloana ale carei elemente sunt valorile „TRUE”
cand observatia este din specia „setosa” sau „FALSE” in caz contrar.
>nnet_iristrain
>nnet_iristrain <- cbind(nnet_iristrain, iristrain$Species == 'versicolor') La
setul de antrenare nnet_iristrain se adauga o coloana ale carei elemente sunt
valorile „TRUE” cand observatia este din specia „versicolor” sau „FALSE” in caz
contrar.

>nnet_iristrain
>nnet_iristrain <- cbind(nnet_iristrain, iristrain$Species == 'virginica') La setul
de antrenare nnet_iristrain se adauga o coloana ale carei elemente sunt valorile
„TRUE” cand observatia este din specia „virginica” sau „FALSE” in caz contrar.
>nnet_iristrain
>names(nnet_iristrain)[6] <- 'setosa'
>names(nnet_iristrain)[7] <- 'versicolor'
>names(nnet_iristrain)[8] <- 'virginica'
Coloanele 6, 7, 8 ale setului nnet_iristrain se vor numi 'setosa', 'versicolor'
si 'virginica'.

> head(nnet_iristrain) Sunt afisate primele 6 observatii ale setului nnet_train si


atributele lor:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species setosa
12 4.8 3.4 1.6 0.2 setosa TRUE
65 5.6 2.9 3.6 1.3 versicolor FALSE
101 6.3 3.3 6.0 2.5 virginica FALSE
108 7.3 2.9 6.3 1.8 virginica FALSE
67 5.6 3.0 4.5 1.5 versicolor FALSE
114 5.7 2.5 5.0 2.0 virginica FALSE
versicolor virginica
12 FALSE FALSE
65 TRUE FALSE
101 FALSE TRUE
108 FALSE TRUE
67 TRUE FALSE
114 FALSE TRUE

>nn <- neuralnet(setosa+versicolor+virginica ~ Sepal.Length+Sepal.Width


+Petal.Length +Petal.Width, data=nnet_iristrain, hidden=c(3,3))
hidden=c(3,3) inseamna ca vreau sa construiesc o retea cu 3 straturi ascunse,
formate fiecare din cate 3 neuroni.
> plot(nn)

6
1 1 1

3.9

8.1

1.0
93

37

00
Sepal.Length

39

33
0.927

4
--00 .12 8
0.53351 -0.0001 setosa
.80 796
27

--02 7.9

2-.2 .68 9
68 73
.01 278
2

88
33 1
18

4
041
2.
-5 .66

-0 .14

-2 .66
Sepal.Width

63
-0 .

7
70
53

67
608

444

847
527
6.4

5.5

.16
61

-2

-2
versicolor
03

0.0047 2.13706
2
61

2.

0.
43

74
90

02
-0 .

04
37

98
1 . 4
Petal.Length
5

-2
.44
3.556 4

2.669 1
-8 .83 45

45
.63 44

67 87
6
5

7
--83 .94 1
05

10..006
96
87 3

3
.1.977 89
4

18.01338 -1.68774 virginica


3-9

949
Petal.Width -6 .16

Error: 0.001408 Steps: 11614

Vreau sa fac o predictie asupra speciei, deci elimin intai coloana a 5-a din setul
iris :

> predictie<- compute(nn, iris[-5])$net.result


>predictie
>maxid<-function(argument){return(which(argument==max(argument)))}
>idx<- apply(predictie, c(1), maxid)

Prin codul de mai sus se transforma outputul variabilei „predictie” in valorile


(1,2,3) reprezentand specia previzionata pentru fiecare observatie din setul de
testare, aici intregul set de date iris.
> idx
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[38] 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2
[75] 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3
[112] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[149] 3 3

>prediction <- c('setosa', 'versicolor', 'virginica')[idx] Cele 3 valori 1, 2, 3


se codifica in cele 3 specii.

7
>prediction
>table(prediction, iris$Species) Se afiseaza matricea de confuzie:
prediction setosa versicolor virginica
setosa 50 0 0
versicolor 0 48 0
virginica 0 2 50
>library(e1071)
> tab<-table(prediction, iris$Species)
> classAgreement(tab)
$diag
[1] 0.9866666667

$kappa
[1] 0.98

$rand
[1] 0.9824608501

$crand
[1] 0.9602776916

Rata de precizie a algorimului este de 98,66%.

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