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

时间:2016-04-27 09:19:02

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

我有以下数据

         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

并且系统将标记每个基因适用的标记,例如伟大或soso等...

按结构我的意思是其中之一:

  • 卷积神经网络(CNN)
  • 自动编码
  • 深信仰网络(DBN)
  • 受限制的Boltzman机器

3 个答案:

答案 0 :(得分:14)

在@ sung-kim评论中稍微扩展一下:

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

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

如果你想要尝试深度学习,无论出于何种原因。然后,对于这种类型的数据,基本的前馈网络是最佳起点。在深度学习方面,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

答案 1 :(得分:5)

如果您正在处理原始数据并希望自动找到适合您的分类目标的功能,则建议采用深度学习结构。但根据您的列名称及其编号(仅10个),您似乎已经设计了您的功能。

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

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

答案 2 :(得分:3)

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

如果您必须使用深度学习。

简单的前馈ANN应该做,通过反向传播监督学习。可以添加具有N个神经元的输入层,并且可以添加一个或两个隐藏层。没有必要进行“深度”并为此数据添加更多图层,存在使用更多图层轻松过度填充数据的风险,如果您这样做,则可能是很难弄清楚问题是什么,测试的准确性会受到很大影响。

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

然后,您可以使用这些要素维度的更高权力/或增加其得分的权重。

对于这样的问题,深度学习可能不太适合。但是这样一个简单的ANN架构应该可以很好地运行,具体取决于数据。