Нейронные сети: алгоритм Гарсона в R - PullRequest
0 голосов
/ 17 марта 2020

Я использую алгоритм Гарсона для извлечения относительной важности каждой переменной, поданной в мою нейронную сеть с помощью функции gar.fun () в R, в результате я получаю график, используя эту функцию (см. Ниже), но я бы хотел Также нравится извлекать числовые значения из этой функции. Как это можно сделать?

Использованные данные можно найти здесь .

Код:

library(neuralnet)
library(devtools)
source_gist('6206737')

trainset <- data[1:300, ]
testset <- data[301:395, ]

nn <- neuralnet(Pass ~ ., data=trainset, hidden=c(16,14,10,5), stepmax = 13000, linear.output=FALSE, err.fct = "ce")

gar.fun('y', nn)

Вывод:

al Networ

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Я не могу получить ваши данные или воспроизвести ваш график, но на примере с веб-сайта , где вы получили код:

require(clusterGeneration)
require(nnet)

set.seed(2)
num.vars<-8
num.obs<-10000

cov.mat<-genPositiveDefMat(num.vars,covMethod=c("unifcorrmat"))$Sigma
rand.vars<-mvrnorm(num.obs,rep(0,num.vars),Sigma=cov.mat)
colnames(rand.vars) = paste0("col",1:ncol(rand.vars))
parms<-runif(num.vars,-10,10)
y<-rand.vars %*% matrix(parms) + rnorm(num.obs,sd=20)

y<-data.frame((y-min(y))/(max(y)-min(y)))
names(y)<-'y'
rand.vars<-data.frame(rand.vars)
mod1<-nnet(rand.vars,y,size=8,linout=T)

plotdata = gar.fun('y',mod1)

Значения y:

plotdata$data
        rel.imp x.names
col5 -1.0000000    col5
col4 -0.9699018    col4
col6 -0.8217886    col6
col1  0.0000000    col1
col7  0.3600374    col7
col8  0.4018898    col8
col3  0.6114887    col3
col2  0.9299521    col2

И их можно увидеть на участке:

plotdata + geom_text(aes(label=round(rel.imp,3)),vjust=rep(c(2,-1.5),c(4,4)))

enter image description here

0 голосов
/ 28 марта 2020

более точный метод описан в этой статье https://www.semanticscholar.org/paper/A-comparison-of-methods-for-assessing-the-relative-Hassan-Ibrahim/f04e8585f2ce70a127acc5f63c70ce785c9b4fbf#citing -papers этот метод был разработан мной, это код в R для вычисления относительной важности, но он используется с одним скрытым слоем

sqdif<-(nn$weights[[1]][[1]][-1,]-nn$startweights[[1]][[1]][-1,])^2
for(i in 1:(ncol(mydata)-1)){
  tabl[1,i]<-sum(sqdif[i,])/sum(sqdif)
  print(tabl[1,i])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...