Соответствующая структура 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 столбцов. Мой вопрос заключается в том, что является соответствующей структурой Deep Learning для изучения и проверьте данные, как указано выше.

В конце дня пользователь даст вектор генов с выражением.

gene_1   989.00
gene_2   77.10
...
gene_N   100.10

И система будет обозначать, какая метка применяет каждый ген, например. большой или сосо и т.д.

По структуре я имею в виду одно из следующих:

  • Сверточная нейронная сеть (CNN)
  • автоассоциатор
  • Сеть глубоких убеждений (DBN)
  • Ограниченная машина Больцмана

Ответы

Ответ 1

Чтобы немного расширить комментарий @sung-kim:

  • CNN используются в первую очередь для проблем с компьютерной визуализацией, таких как классифицируя изображения. Они моделируются на животных визуальной коре, они в основном имеют сеть соединений, так что есть плитки которые частично перекрываются. Обычно они требуют много данных, более 30 тыс. примеров.
  • Autoencoder используется для создания функций и уменьшения размерности. Они начинаются с множества нейронов на каждом слое, затем это число уменьшается, а затем снова увеличивается. Каждый предмет обучается сам по себе. Это приводит к средним уровням (низкое число нейронов), обеспечивающим значимую проекцию пространственного объекта в малой размерности.
  • Хотя я мало знаю о DBN, они, как представляется, являются контролируемым расширением Autoencoder. Множество параметров для тренировки.
  • Снова я не очень разбираюсь в машинах Boltzmann, но они широко не используются для такого рода проблем (насколько мне известно).

Как и во всех проблемах моделирования, я бы предложил начать с самой базовой модели, чтобы искать сигнал. Возможно, хорошее место для начала - Логистическая регрессия, прежде чем беспокоиться о глубоком обучении.

Если вы дошли до того, что хотите попробовать глубокое обучение по каким-либо причинам. Тогда для этого типа данных основная сеть для прямой передачи - это лучшее место для начала. С точки зрения глубокого обучения 30 тыс. Точек данных невелики, поэтому всегда лучше начинать с небольшой сети (1-3 скрытых слоя, 5-10 нейронов), а затем увеличиваться. При выполнении оптимизации параметров убедитесь, что у вас есть приличная проверка. Если вы поклонник API scikit-learn, я предлагаю, чтобы 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

Ответ 2

Глубокая учебная структура была бы рекомендована, если бы вы имели дело с необработанными данными и хотели бы найти функции, которые работают с вашей целью классификации, автоматически. Но, основываясь на именах ваших столбцов и их количестве (всего 10), кажется, что у вас уже созданы ваши функции.

По этой причине вы можете просто пойти со стандартной многослойной нейронной сетью и использовать контролируемое обучение (обратное распространение). Такая сеть будет иметь количество входов, соответствующих количеству ваших столбцов (10), а затем несколько скрытых слоев, а затем последующий выходной уровень с количеством нейронов, соответствующих количеству ваших меток. Вы можете поэкспериментировать с использованием различного количества скрытых слоев, нейронов, разных типов нейронов (сигмовидных, tanh, выпрямленных линейных и т.д.) И т.д.

В качестве альтернативы вы можете использовать необработанные данные (если это доступно), а затем использовать DBN (они, как известно, надежны и обеспечивают хорошие результаты по разным проблемам) или автокодеры.

Ответ 3

Если вы ожидаете, что результат будет восприниматься как оценка для метки (как я понял из вашего вопроса), попробуйте контролируемый многоклассовый классификатор логистической регрессии. (самый высокий балл принимает метку).

Если вы хотите использовать глубокое обучение.

Простой корневой ANN должен делать, контролировать обучение через обратное распространение. Входной слой с N нейронами и один или два скрытых слоя могут быть добавлены, не более того. Не нужно "углубляться" и добавлять больше слоев для этих данных, существует риск перегрузить данные с помощью большего количества слоев, если вы это сделаете, может быть сложно определить, что проблема и точность теста будет сильно зависеть.

Простое построение или визуализация данных, т.е. с t-sne, может быть хорошим началом, если вам нужно выяснить, какие функции важны (или какая-либо корреляция, которая может существовать).

вы можете играть с более высокой степенью этих характеристик или добавить увеличенный вес к их счету.

Для таких проблем глубокое обучение, вероятно, не очень хорошо подходит. но более простая архитектура ANN, подобная этой, должна хорошо работать в зависимости от данных.