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

2024-10-06 12:58:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据

         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列。 我的问题是什么是适合学习的深度学习结构 然后像上面一样测试数据。在

在一天结束时,用户将给出一个基因表达载体。在

^{pr2}$

系统将标记每个基因应用的标签,如great或soso等。。。在

我所说的结构是指:

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

Tags: 数据用户标记系统基因结构label测试数据
3条回答

如果你想把你的一个logistic标签理解为一个多元回归的问题,那就把它理解为一个多元回归的问题。(最高分取标签)。在

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

一个简单的前馈神经网络应该做到,通过反向传播来监督学习。输入层有N个神经元,可以添加一个或两个隐藏层,不能超过这个数目。无需对该数据进行“深度并添加更多层,存在使用更多层容易过度拟合数据的风险,如果这样做,则很难找出问题所在,并且测试精度将受到很大影响。在

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

然后你可以使用那些特征维度的更高的能力/或者增加他们的分数的权重。在

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

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

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

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

要扩展一下@sung kim的评论:

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

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

如果你想尝试深度学习,无论出于什么原因。对于这种类型的数据,最好从基本的前馈网络开始。就深度学习而言,30k数据点并不是一个大数目,所以最好从一个小网络(1-3个隐藏层,5-10个神经元)开始,然后再变大。不过,在执行参数优化时,请确保您有一个像样的验证集。如果您是scikit-learnAPI的粉丝,我建议您从{a2}开始

还有一点建议,在进行任何培训之前,您需要在类标签上使用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)

哪些输出

^{pr2}$

相关问题 更多 >