【问题标题】:Appropriate Deep Learning Structure for multi-class classification适合多类分类的深度学习结构
【发布时间】:2016-08-21 11:52:05
【问题描述】:

我有以下数据

         feat_1    feat_2 ... feat_n   label
gene_1   100.33     10.2  ... 90.23    great
gene_2   13.32      87.9  ... 77.18    soso
....
gene_m   213.32     63.2  ... 12.23    quitegood

M 的大小约为 30K 行,而 N 的大小要小得多,约为 10 列。 我的问题是什么是合适的深度学习结构来学习 并像上面一样测试数据。

在一天结束时,用户将给出一个带有表达的基因向量。

gene_1   989.00
gene_2   77.10
...
gene_N   100.10

并且系统将标记每个基因应用的标签,例如棒棒哒等等……

我的结构是指其中之一:

  • 卷积神经网络 (CNN)
  • 自动编码器
  • 深度信念网络 (DBN)
  • 受限玻尔兹曼机

【问题讨论】:

  • 如果我理解正确,你会喂 [feat_1 feat_2 ... feat_n] 并预测标签,对吧?在这种情况下,由于您只有大约 10 个特征,我会说香草神经前向网络将是一个好的开始。
  • 是什么让深度学习成为您的首选范例?我认为您应该首先尝试朴素贝叶斯、随机森林、多类 SVM 或类似结构。
  • 另外,分类是标量连续统一体,例如等级 1-10?如果是这样,您可能会使用连续评分函数做得更好,只需四舍五入到最接近的整数。
  • 写一个深度神经网络来确定合适的深度神经网络结构:p
  • 类(标签)的数量会改变下面的答案吗?如果您有 1000 个标签,哪些技术/算法最适合?

标签: python machine-learning scikit-learn tensorflow deep-learning


【解决方案1】:

稍微扩展@sung-kim 的评论:

  • CNN 主要用于解决计算机成像中的问题,例如 图像分类。它们以动物的视觉皮层为模型,它们 基本上有一个连接网络,这样就有瓷砖 有一些重叠的特征。通常他们需要很多 数据,超过 3 万个示例。
  • 自动编码器用于特征生成和降维。他们从每一层的大量神经元开始,然后这个数字减少,然后再次增加。每个对象都是针对自身进行训练的。这会导致中间层(神经元数量少)在低维度上提供特征空间的有意义的投影。
  • 虽然我不太了解 DBN,但它们似乎是自动编码器的监督扩展。需要训练的大量参数。
  • 再次重申,我对玻尔兹曼机了解不多,但它们并未广泛用于此类问题(据我所知)

与所有建模问题一样,我建议从最基本的模型开始寻找信号。在您担心深度学习之前,也许一个好的起点是Logistic Regression

如果您已经到了想要尝试深度学习的地步,无论出于何种原因。那么对于这种类型的数据,基本的前馈网络是最好的起点。就深度学习而言,30k 个数据点并不是一个很大的数字,所以总是最好从一个小型网络(1-3 个隐藏层,5-10 个神经元)开始,然后变得更大。不过,在执行参数优化时,请确保您有一个不错的验证集。如果您是scikit-learn API 的粉丝,我建议您从Keras 开始

进一步评论,在进行任何培训之前,您需要在班级标签上使用 OneHotEncoder

编辑

我从赏金和 cmets 中看到,您希望更多地了解这些网络的工作原理。请参阅如何构建前馈模型并进行一些简单的参数优化的示例

import numpy as np
from sklearn import preprocessing
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout

# Create some random data
np.random.seed(42)
X = np.random.random((10, 50))

# Similar labels
labels = ['good', 'bad', 'soso', 'amazeballs', 'good']
labels += labels
labels = np.array(labels)
np.random.shuffle(labels)

# Change the labels to the required format
numericalLabels = preprocessing.LabelEncoder().fit_transform(labels)
numericalLabels = numericalLabels.reshape(-1, 1)
y = preprocessing.OneHotEncoder(sparse=False).fit_transform(numericalLabels)

# Simple Keras model builder
def buildModel(nFeatures, nClasses, nLayers=3, nNeurons=10, dropout=0.2):
    model = Sequential()
    model.add(Dense(nNeurons, input_dim=nFeatures))
    model.add(Activation('sigmoid'))
    model.add(Dropout(dropout))
    for i in xrange(nLayers-1):
        model.add(Dense(nNeurons))
        model.add(Activation('sigmoid'))
        model.add(Dropout(dropout))
    model.add(Dense(nClasses))
    model.add(Activation('softmax'))

    model.compile(loss='categorical_crossentropy', optimizer='sgd')

    return model

# Do an exhaustive search over a given parameter space
for nLayers in xrange(2, 4):
    for nNeurons in xrange(5, 8):
        model = buildModel(X.shape[1], y.shape[1], nLayers, nNeurons)
        modelHist = model.fit(X, y, batch_size=32, nb_epoch=10,
                              validation_split=0.3, shuffle=True, verbose=0)
        minLoss = min(modelHist.history['val_loss'])
        epochNum = modelHist.history['val_loss'].index(minLoss)
        print '{0} layers, {1} neurons best validation at'.format(nLayers, nNeurons),
        print 'epoch {0} loss = {1:.2f}'.format(epochNum, minLoss)

哪些输出

2 layers, 5 neurons best validation at epoch 0 loss = 1.18
2 layers, 6 neurons best validation at epoch 0 loss = 1.21
2 layers, 7 neurons best validation at epoch 8 loss = 1.49
3 layers, 5 neurons best validation at epoch 9 loss = 1.83
3 layers, 6 neurons best validation at epoch 9 loss = 1.91
3 layers, 7 neurons best validation at epoch 9 loss = 1.65

【讨论】:

  • DBN 由受限玻尔兹曼机组成。受限玻尔兹曼机是随机网络,可以学习输入数据的分布。
  • 谢谢!老实说,我还没有真正遇到过,我只是快速环顾四周,看看它们是否相关。不过很有趣,可能在不久的将来对我有用。
【解决方案2】:

如果您希望输出被认为是标签的分数(正如我从您的问题中理解的那样),请尝试使用有监督的多类逻辑回归分类器。 (最高分取标签)。

如果你一定要使用深度学习。

应该做一个简单的前馈 ANN,通过反向传播监督学习。输入层有 N 个神经元,可以增加一到两个隐藏层,不超过这个。无需“”并为此数据添加更多层,存在使用更多层轻松过度拟合数据的风险,如果这样做可以很难弄清楚问题是什么,测试的准确性会受到很大影响。

如果您需要确定哪些特征很重要(或任何可能存在的相关性),那么简单地绘制或可视化数据(即使用 t-sne)可能是一个好的开始。

然后,您可以使用这些特征维度的更高功率/或增加其分数的权重。

对于这样的问题,深度学习可能不太适合。但是像这样更简单的 ANN 架构应该可以根据数据运行良好。

【讨论】:

【解决方案3】:

如果您正在处理原始数据并希望自动找到有助于实现分类目标的特征,建议您使用深度学习结构。但是根据您的列名称及其编号(只有 10 个),您似乎已经设计了您的功能。

因此,您可以只使用标准的多层神经网络并使用监督学习(反向传播)。这样的网络将具有与您的列数(10)相匹配的输入数量,然后是多个隐藏层,然后是一个输出层,其神经元数量与您的标签数量相匹配。您可以尝试使用不同数量的隐藏层、神经元、不同类型的神经元(sigmoid、tanh、rectified linear 等)等等。

或者,您可以使用原始数据(如果可用),然后使用 DBN(众所周知,它们很健壮,可以在不同的问题上取得良好的结果)或自动编码器。

【讨论】:

  • 非常感谢您的回复。两个问题:1)DBN可以用于分类吗?假设我的问题与上述相同,但功能未知。假设我有用于生成上述功能的原始数据。 2) 对于 MLP,你如何决定需要多少隐藏层?
  • 1) 是的 DBN 可以用于原始数据的分类。 2) 这取决于问题、训练集的大小、输入大小、数据中模式的质量。需要实验的东西。从一个开始,看看添加更多对您的准确率/召回率有何影响。
猜你喜欢
  • 2017-01-02
  • 2018-08-21
  • 2019-06-06
  • 2021-06-17
  • 2020-10-14
  • 2014-12-11
  • 2019-06-30
  • 2020-07-02
  • 2017-05-20
相关资源
最近更新 更多