在神经网络中,如何分辨对输出值贡献最大的特征?

机器算法验证 r 机器学习 神经网络
2022-04-02 13:24:07

我有一个神经网络,它使用输入特征,一些输入层预测连续变量个特征中的哪些特征或 2 个特征的组合对的变化贡献最大NLXNX

示例:假设我试图根据房间数量、房屋面积、门廊面积、长度、宽度来预测房价。

我可以识别导致房价变化最大x

我正在考虑一种蛮力方法,通过改变一个特征并保持静止不变,并看到价格变化最大。如果有标准的方式,请分享一些资源来阅读。

2个回答

这更像是一个统计问题,而不是一个特定的编程问题。如果您一心想使用神经网络,这里有一个使用 Garson 算法的特征选择的示例。下面我提供了您可以尝试的代码。希望这可以给你一些开始。

但请注意,这只是一种可能的答案。人们采取了许多其他方法,因为这是一个活跃的研究领域(神经网络很复杂!)。很可能还有其他方法可能更合适,更高效等。你可能甚至不想使用神经网络(我不知道你的具体原因)。根据您的数据,最好在神经网络之前使用一些替代特征选择。一个简单的谷歌学者搜索“神经网络特征选择”将返回几篇关于这个问题的论文。关于神经网络的主题有很多非常强烈的意见,所以请注意,那里没有明确的答案。

# code from link noted above (slightly updated)
require(clusterGeneration)
require(nnet)

#define number of variables and observations
set.seed(2)
num.vars<-8
num.obs<-10000

#define correlation matrix for explanatory variables
#define actual parameter values
cov.mat<-genPositiveDefMat(num.vars,covMethod=c("unifcorrmat"))$Sigma
rand.vars<-mvrnorm(num.obs,rep(0,num.vars),Sigma=cov.mat)
parms<-runif(num.vars,-10,10)
y<-rand.vars %*% matrix(parms) + rnorm(num.obs,sd=20)

#prep data and create neural network
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)

require(devtools)

#import 'gar.fun' from beckmw's Github - this is Garson's algorithm
source_gist('6206737')

#use the function on the model created above
gar.fun('y',mod1)

这是输出图。您可以看到有正值和负值。负值和正值反映了变量和响应变量之间的正负关系。 nnet 变量重要性图

caret包为神经网络模型和其他模型提供了可变的重要性。你可以参考这里说:

神经网络:这里使用的方法基于 Gevrey 等人 (2003),它使用权重绝对值的组合。对于分类模型,特定类别的重要性将是相同的。

它还包括递归特征的特征选择:

递归特征消除:使用用于特征选择的排序方法计算变量重要性。对于最终的子集大小,对所有重新采样的模型的重要性进行平均以计算总体值。

这是您可以执行的操作:

library(caret)

# varimp
control <- trainControl(method="repeatedcv", number=10, repeats=3)
model <- train(y~., data=train, method="nnet",trControl=control)
imp<-varImp(model)
plot(imp)

# rfe
control <- rfeControl(functions=rfFuncs, method="cv", number=10)
results <- rfe(train[,!colnames %in% c("y")],train$y, sizes=c(1:(ncol(train)-1), rfeControl=control)
 print(results)
# features selected 
predictors(results)
plot(results, type=c("g", "o"))