使用 NN 的最后一个隐藏层中的 2 个隐藏神经元的输出来可视化 4 类分类任务的结果

数据挖掘 r 分类 神经网络 可视化
2022-03-04 19:27:17

我正在使用人工神经网络进行 4 类分类任务。我的目标是可视化这 4 个类的分离程度,以及来自每个类的数据的一致性以及它们之间的“距离”有多远。

我的方法是在最后一个隐藏层中使用 2 个神经元,并在散点图中绘制神经元的输出。但是,我当前的输出通常看起来像这样,其中不同的颜色代表数据来自的实际类:

在此处输入图像描述

显然这不是很有用。首先,我希望这些点不会都在同一条线上,其次,我不确定这是否可以按照我想要的方式来解释。

我正在使用 R 中的神经网络包来使用线性输出训练网络。我猜如果这种方法可行,那么激活函数的选择将是至关重要的。

我是神经网络的新手,我不确定这样的事情是否可以完成,我希望得到一些评论。

2个回答

我对该主题也有些陌生,但我认为您正在寻找的是自动编码器。我只在 h2o deeplearning 包中使用过它,但它似乎运行良好。

自动编码器背后的想法是从您的输入开始,编码到更少的节点(两个对于视觉表示来说很好),然后解码回您的原始输出(尽可能准确)。

自动编码器

如果自动编码器可以解码回您的输入的准确表示,那么这两个节点中保留了足够的重要信息。然后,您可以在类似于有界 PCA 图的二维图中绘制这两个节点所包含的特征。

此外 - 自动编码器不像 PCA 那样受限于线性。下面是一些代码的快速片段,希望对您有所帮助。

library(h2o)
localH2O = h2o.init(ip = "localhost", port = 54321, startH2O = TRUE, min_mem_size = "3g", max_mem_size = "4g", nthreads = -1)
dat_h2o <- as.h2o(train.df)

unsupervised <- 
  h2o.deeplearning(x = 24:356,  # column numbers to use
                   training_frame = dat_h2o, # data in H2O format
                   autoencoder = TRUE, ## unsupervised autoencoding
                   activation = "Tanh", # or 'Tanh' 'Rectifier' 'WithDropout' node activation function, Tanh seems to work best for autoencoding
                   hidden = c(5,2,5), # three layers of nodes, with 5/2/5 nodes, respectively
                   epochs = 1) # max. no. of epochs 

## layer 1 corresponds to hidden[1], so it will reduce to 5 variables
## below is roughly similar to using predict(pca.object, newdata)
training_data <- h2o.deepfeatures(unsupervised, dat_h2o, layer = 1)
testing_data <- h2o.deepfeatures(unsupervised, test_h2o, layer = 1)

## explore the second layer with 2 nodes, similar to exploring PC1 vs PC2
train_supervised_features2 = h2o.deepfeatures(unsupervised, dat_h2o, layer=2)

plotdata2 = as.data.frame(train_supervised_features2)
plotdata2$label = as.character(as.vector(dat_h2o[,364]))

## L2 corresponds to layer 2, so use L2
qplot(DF.L2.C1, DF.L2.C2, data = plotdata2, color = label, main = 'Neural network: 5-2-5')

首先,我认为情节很有用。在那个空间里,这些类确实是相当可分离的。

可视化的第一个选项应该是 PCA,尽管正如其他答案中所指出的,它只会考虑特征的线性组合。

如果您想在分类器执行情况的上下文中可视化类的可分离性,您制作的图是一个不错的选择。它表明虽然存在一些混乱(特别是对于绿色),但您可以相当容易地对该图上的每个类进行分组。

相反,如果您想可视化类的自然可分离性,PCA 或低维自动编码器是可行的方法。

不同之处在于,如果您关心的是前者,那么您的表示经过优化以分离类是一件好事。如果你关心后者,自动编码器的无监督性质更合适。