多类分类适用的深度学习结构

我有以下数据

         feat_1    feat_2 ... feat_n   labelgene_1   100.33     10.2  ... 90.23    greatgene_2   13.32      87.9  ... 77.18    soso....gene_m   213.32     63.2  ... 12.23    quitegood

M的大小约为3万行,而N则小得多,约为10列。我的问题是,对于像上面这样的数据,学习和测试时适用的深度学习结构是什么?

最终,用户将提供一个包含基因表达的向量。

gene_1   989.00gene_2   77.10...gene_N   100.10

系统将为每个基因标记适用的标签,例如great或soso等…

我所说的结构指的是以下之一:

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

回答:

对@sung-kim 的评论稍作扩展:

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

不过,和所有建模问题一样,我建议从最基本的模型开始寻找信号。或许在考虑深度学习之前,可以从逻辑回归开始是个不错的选择。

如果你已经到了想要尝试深度学习的地步,无论出于什么原因。对于这种类型的数据,基本的前馈网络是最好的起点。就深度学习而言,3万个数据点并不是一个大的数字,所以最好从一个小网络开始(1-3个隐藏层,5-10个神经元),然后再扩大规模。进行参数优化时,确保你有一个像样的验证集。如果你是scikit-learn API的粉丝,我建议Keras是一个很好的起点

另外一个评论,在进行任何训练之前,你需要对类标签使用OneHotEncoder进行编码。

编辑

从赏金和评论中我看到你想了解更多关于这些网络如何工作的信息。请查看构建前馈模型并进行一些简单参数优化的示例

import numpy as npfrom sklearn import preprocessingfrom keras.models import Sequentialfrom keras.layers.core import Dense, Activation, Dropout# 创建一些随机数据np.random.seed(42)X = np.random.random((10, 50))# 类似的标签labels = ['good', 'bad', 'soso', 'amazeballs', 'good']labels += labelslabels = np.array(labels)np.random.shuffle(labels)# 将标签更改为所需格式numericalLabels = preprocessing.LabelEncoder().fit_transform(labels)numericalLabels = numericalLabels.reshape(-1, 1)y = preprocessing.OneHotEncoder(sparse=False).fit_transform(numericalLabels)# 简单的Keras模型构建器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# 对给定的参数空间进行详尽搜索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.182 layers, 6 neurons best validation at epoch 0 loss = 1.212 layers, 7 neurons best validation at epoch 8 loss = 1.493 layers, 5 neurons best validation at epoch 9 loss = 1.833 layers, 6 neurons best validation at epoch 9 loss = 1.913 layers, 7 neurons best validation at epoch 9 loss = 1.65

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注