我有以下数据
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