library(nnet)
source("D:/R/R/NN/nnet_plot_update.r") # отрисовка сети

data_diabetes = read.csv("D:/R/R/NN/prima-indians-diabetes.csv",header = FALSE, encoding = 'UTF-8')

#V1. Число беременностей (все пациенты из источника – женщины не моложе 21 года индийской народности пима).
#V2. Концентрация глюкозы в плазме через 2 часа после введения в пероральном глюкозотолерантном тесте
#V3. Диастолическое артериальное давление (мм рт. ст.).
#V4. Толщина кожной складки в районе трицепса (мм).
#V5. Концентрация инсулина в сыворотке крови (мкЕд/мл).
#V6. Индекс массы тела (вес в кг/(рост в м)^2).
#V7. Функция, описывающая генетическую предрасположенность к диабету (diabetes pedegree).
#V8. Возраст (годы).
#V9. Диагноз - целевой, показывает, наблюдался ли у пациента сахарный диабет или нет (соответственно, 1 или 0). 


#install (if not already installed) and load data.table package
if(!require(data.table)){install.packages('data.table')}
## Loading required package: data.table
setnames(data_diabetes, old=c("V1","V2","V6","V8", "V9"), 
         new=c("Pregnancy", "Glucose", "BMI", "Age", "diagnosis"))

#view new column names
names(data_diabetes)
## [1] "Pregnancy" "Glucose"   "V3"        "V4"        "V5"        "BMI"      
## [7] "V7"        "Age"       "diagnosis"
data_diabetes$diagnosis = factor(data_diabetes$diagnosis, 
                                 levels = c(1, 0), 
                                 labels = c("diabetes", "no diabetes"))
table(data_diabetes$diagnosis)
## 
##    diabetes no diabetes 
##         268         500
#summary(data_diabetes[-9])
summary(data_diabetes[1:8])
##    Pregnancy         Glucose            V3               V4       
##  Min.   : 0.000   Min.   :  0.0   Min.   :  0.00   Min.   : 0.00  
##  1st Qu.: 1.000   1st Qu.: 99.0   1st Qu.: 62.00   1st Qu.: 0.00  
##  Median : 3.000   Median :117.0   Median : 72.00   Median :23.00  
##  Mean   : 3.845   Mean   :120.9   Mean   : 69.11   Mean   :20.54  
##  3rd Qu.: 6.000   3rd Qu.:140.2   3rd Qu.: 80.00   3rd Qu.:32.00  
##  Max.   :17.000   Max.   :199.0   Max.   :122.00   Max.   :99.00  
##        V5             BMI              V7              Age       
##  Min.   :  0.0   Min.   : 0.00   Min.   :0.0780   Min.   :21.00  
##  1st Qu.:  0.0   1st Qu.:27.30   1st Qu.:0.2437   1st Qu.:24.00  
##  Median : 30.5   Median :32.00   Median :0.3725   Median :29.00  
##  Mean   : 79.8   Mean   :31.99   Mean   :0.4719   Mean   :33.24  
##  3rd Qu.:127.2   3rd Qu.:36.60   3rd Qu.:0.6262   3rd Qu.:41.00  
##  Max.   :846.0   Max.   :67.10   Max.   :2.4200   Max.   :81.00
######################################################
set.seed(101)

ind = sample(2, nrow(data_diabetes), 
                  replace=TRUE, prob=c(0.7, 0.3))

diabetes_train = data_diabetes[ind == 1, ] #70% of sample
#diabetes_train
diabetes_test = data_diabetes[ind == 2, ] #30% of sample

#число скрытых нейронов size и параметр “ослабления весов” 
#decay, который осуществляет регуляризацию точности подстройки 
#коэффициентов (при decay = 0 стремление к точности может 
#перерасти в эффект переусложнения модели). 

nn.diabet = nnet(diagnosis ~ Pregnancy + Glucose + BMI + Age, 
              data = diabetes_train, rang=0.1, decay = 0.001, 
              size = 5, niter = 100, maxit = 1000, 
              trace = FALSE)


plot.nnet(nn.diabet)
## Loading required package: scales
## Loading required package: reshape
## 
## Attaching package: 'reshape'
## The following object is masked from 'package:data.table':
## 
##     melt

summary(nn.diabet)
## a 4-5-1 network with 31 weights
## options were - entropy fitting  decay=0.001
##  b->h1 i1->h1 i2->h1 i3->h1 i4->h1 
##   0.02   0.00   0.05   0.28   0.24 
##  b->h2 i1->h2 i2->h2 i3->h2 i4->h2 
## -27.39   0.32   0.25  -0.30  -0.11 
##  b->h3 i1->h3 i2->h3 i3->h3 i4->h3 
##  -0.10   9.63   3.90  -4.44  -7.30 
##  b->h4 i1->h4 i2->h4 i3->h4 i4->h4 
## -24.84   0.34   0.14   0.05   0.21 
##  b->h5 i1->h5 i2->h5 i3->h5 i4->h5 
##  22.25  -0.01   0.07  -1.13  -0.01 
##   b->o  h1->o  h2->o  h3->o  h4->o  h5->o 
##   1.71   1.76  -2.20  -1.07  -2.96   2.63
pred1 = predict(nn.diabet, diabetes_test[, -9], type = "class")
table(Прогноз = pred1, Факт = diabetes_test$diagnosis)
##              Факт
## Прогноз       diabetes no diabetes
##   diabetes          55          29
##   no diabetes       22         122
Accuracy = mean(pred1 == diabetes_test$diagnosis)
Accuracy
## [1] 0.7763158