我有以下数据
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
该系统将标记每个基因应用的标签,例如great或soso等。
我所说的结构是指其中之一:
- 卷积神经网络(CNN)
- 自动编码器
- 深度信任网络
- 受限Boltzman机器
扩展一下@sung-kim的评论:
- CNN主要用于计算机成像中的问题,例如对图像进行分类。它们以动物的视觉皮层为模型基本上有一个连接网络,这样就有具有一些重叠的特征。通常它们需要大量数据,超过3万个例子
- 自动编码器用于特征生成和降维。它们从每层上的许多神经元开始,然后这个数量减少,然后又增加。每个对象都是针对自身进行训练的。这导致中间层(低数量的神经元)在低维度上提供特征空间的有意义的投影
- 虽然我对DBN不太了解,但它们似乎是自动编码器的监督扩展。需要训练的参数很多
- 再说一遍,我对玻尔兹曼机了解不多,但据我所知,它们并没有被广泛用于这类问题
与所有建模问题一样,我建议从最基本的模型开始寻找信号。在你担心深度学习之前,最好先从逻辑回归开始。
如果你已经到了想要尝试深度学习的地步,无论出于什么原因。对于这种类型的数据,基本的前馈网络是最好的起点。就深度学习而言,30k个数据点不是一个大数字,所以最好从一个小网络(1-3个隐藏层,5-10个神经元)开始,然后变得更大。不过,在进行参数优化时,请确保您有一个合适的验证集。如果你是scikit-learn
API的粉丝,我建议Keras是启动的好地方
还有一条评论,在进行任何培训之前,您需要在类标签上使用OneHotEncoder。
编辑
我从奖金和评论中看到,你想了解更多关于这些网络如何工作的信息。请参阅如何建立前馈模型并进行一些简单的参数优化的示例
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
如果您正在处理原始数据并希望自动找到能够实现分类目标的特征,则建议使用深度学习结构。但是,根据列的名称和编号(只有10个),您似乎已经设计好了自己的功能。
出于这个原因,你可以使用标准的多层神经网络,并使用监督学习(反向传播)。这种网络的输入数量与列的数量相匹配(10),然后是多个隐藏层,然后是输出层,神经元数量与标签数量相匹配。你可以使用不同数量的隐藏层、神经元、不同的神经元类型(sigmoid、tanh、整流线性等)等进行实验
或者,您可以使用原始数据(如果可用),然后使用DBN(众所周知,它们是健壮的,可以在不同的问题上获得良好的结果)或自动编码器。
如果你希望输出被认为像标签的分数一样(正如我从你的问题中所理解的),请尝试有监督的多类逻辑回归分类器。(得分最高者为标签)。
如果你一定要使用深度学习
一个简单的前馈神经网络应该做,通过反向传播来监督学习。具有N个神经元的输入层,可以添加一个或两个隐藏层,不超过这个数量。不需要深入并为该数据添加更多的层,使用更多的层容易过度填充数据是有风险的,如果你这样做,可能很难弄清楚问题是什么,测试准确性将受到很大影响。
如果你需要弄清楚哪些特征是重要的(或任何可能存在的相关性),那么简单地绘制或可视化数据(即使用t-sne)可能是一个良好的开端。
然后,您可以使用这些特征维度的更高幂/或为它们的分数增加权重。
对于这样的问题,深度学习可能不太适合。但是像这样的更简单的ANN架构应该根据数据而良好地工作。