在下面的代码中,他们使用自动编码器作为监督聚类或分类,因为它们有数据标签。 http://amunategui.github.io/anomaly-detection-h2o/ 但是,如果我没有标签,我可以使用自动编码器对数据进行聚类吗?问候
2 回答
深度学习自动编码器始终是无监督学习。您链接到的文章的“监督”部分是评估它的表现如何。
下面的例子(取自我的书 Practical Machine Learning with H2O 的第 7 章,我在同一数据集上尝试了所有 H2O 无监督算法 - 请原谅插件)采用 563 个特征,并尝试将它们编码为两个隐藏节点。
m <- h2o.deeplearning(
2:564, training_frame = tfidf,
hidden = c(2), auto-encoder = T, activation = "Tanh"
)
f <- h2o.deepfeatures(m, tfidf, layer = 1)
那里的第二个命令提取隐藏节点权重。是一个数据框,有两个数字列,源数据f
中的每一行对应一行。tfidf
我只选择了两个隐藏节点,以便绘制集群:
每次运行的结果都会发生变化。您可以(也许)使用堆叠的自动编码器或使用更多隐藏节点(但您无法绘制它们)获得更好的结果。在这里,我觉得结果受到数据的限制。
顺便说一句,我用这段代码制作了上面的情节:
d <- as.matrix(f[1:30,]) #Just first 30, to avoid over-cluttering
labels <- as.vector(tfidf[1:30, 1])
plot(d, pch = 17) #Triangle
text(d, labels, pos = 3) #pos=3 means above
(PS 原始数据来自Brandon Rose 关于使用 NLTK 的优秀文章。)
在某些方面,编码数据和聚类数据共享一些重叠的理论。因此,您可以使用自动编码器对数据进行聚类(编码)。
一个简单的可视化示例是,如果您有一组您怀疑有两个主要类别的训练数据。例如共和党人和民主党人的选民历史数据。如果您使用自动编码器并将其编码为二维,然后将其绘制在散点图上,则此聚类会变得更加清晰。以下是我的一个模型的示例结果。您可以看到两个类之间的明显差异以及一些预期的重叠。
代码可以在这里找到
此方法不仅需要两个二进制类,您还可以根据需要在任意多个不同的类上进行训练。两个极化的类更容易可视化。
这种方法不限于两个输出维度,只是为了绘图方便。事实上,您可能会发现很难将某些大维度空间有意义地映射到如此小的空间。
在编码(集群)层的维度较大的情况下,“可视化”特征集群并不那么清楚。这是变得更加困难的地方,因为您必须使用某种形式的监督学习来将编码(集群)特征映射到您的训练标签。
确定类特征所属的几种方法是将数据泵入 knn-clustering 算法。或者,我更喜欢做的是获取编码向量并将它们传递给标准的反向误差传播神经网络。请注意,根据您的数据,您可能会发现只需将数据直接泵入反向传播神经网络就足够了。