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, decay = 0, size = 5,
niter = 100, 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
## b->h1 i1->h1 i2->h1 i3->h1 i4->h1
## 0.69 0.53 0.29 0.06 0.51
## b->h2 i1->h2 i2->h2 i3->h2 i4->h2
## -0.21 1.00 35.08 12.47 14.81
## b->h3 i1->h3 i2->h3 i3->h3 i4->h3
## -0.27 0.74 0.65 2.47 3.00
## b->h4 i1->h4 i2->h4 i3->h4 i4->h4
## 5.77 -0.08 -0.03 -0.06 -0.01
## b->h5 i1->h5 i2->h5 i3->h5 i4->h5
## 0.52 -0.65 -0.47 -0.56 -0.35
## b->o h1->o h2->o h3->o h4->o h5->o
## 6.16 6.04 -19.18 5.20 6.25 -0.21
pred1 = predict(nn.diabet, diabetes_test[, -9], type = "class")
table(Прогноз = pred1, Факт = diabetes_test$diagnosis)
## Факт
## Прогноз diabetes no diabetes
## diabetes 44 18
## no diabetes 33 133
Accuracy = mean(pred1 == diabetes_test$diagnosis)
Accuracy
## [1] 0.7763158