nev*_*int 15 python machine-learning scikit-learn deep-learning tensorflow
我有以下数据
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
Run Code Online (Sandbox Code Playgroud)
大小M约为30K行,并且N小得多~10列.我的问题是,学习和测试上述数据的适当深度学习结构是什么.
在一天结束时,用户将给出具有表达的基因载体.
gene_1 989.00
gene_2 77.10
...
gene_N 100.10
Run Code Online (Sandbox Code Playgroud)
并且系统将标记每个基因适用的标签,例如伟大或soso等...
按结构我的意思是其中之一:
pim*_*314 14
关于@ sung-kim的评论,请稍微扩展一下:
与所有建模问题一样,我建议从最基本的模型开始寻找信号.在你担心深度学习之前,也许一个好的起点是Logistic回归.
无论出于何种原因,如果你已经到了想要深度学习的地步.然后,对于这种类型的数据,基本的前馈网络是最佳起点.在深度学习方面,30k数据点不是很大,所以总是最好从一个小网络(1-3个隐藏层,5-10个神经元)开始,然后变得更大.确保在执行参数优化时有一个合适的验证集.如果您是scikit-learnAPI 的粉丝,我建议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)
Run Code Online (Sandbox Code Playgroud)
哪个输出
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
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您正在处理原始数据并希望自动找到适合您的分类目标的功能,则建议使用深度学习结构.但根据您的列名称及其编号(仅10个),您似乎已经设计了您的功能.
因此,您可以使用标准的多层神经网络并使用监督学习(反向传播).这样的网络将具有与列数(10)匹配的输入数量,其后是多个隐藏层,然后是输出层,其中神经元的数量与您的标签数量相匹配.您可以尝试使用不同数量的隐藏层,神经元,不同的神经元类型(S形,tanh,矫正线性等)等.
或者,你可以使用原始数据(如果它可用),然后使用DBN(它们已知是健壮的并且可以在不同的问题上获得良好的结果)或自动编码器.
| 归档时间: |
|
| 查看次数: |
3147 次 |
| 最近记录: |