Я читаю о NN, а также хотел бы создать свой первый NN одновременно (чтобы дополнить мое чтение).
У меня есть такой набор данных:
DNA_seq Sample1Name Sample1Name ConcOfDNAInSample DNASeqFoundInProcessCat
AGGAG cat_0 cat_1 0.1 found_in_0
AGGAG cat_1 cat_2 0.4 found_in_3
ACCCC cat_1 cat_7 0.1 found_in_2
AGAGAGA cat_2 cat_10 1.9 found_in_1
ADAS cat_332 cat_103 8.9 found_in_1
Столбцы:
- DNASeq -> строка последовательности ДНК (т.е. sequence ')
- Sample1Name -> категориальное значение, объясняющее химическое свойство раствора, в котором находится DNASeq.
- Sample2Name -> категориальное значение, объясняющее химическое свойство раствора, в котором DNASeq.
- ConcOfDNAInSample -> количественное значение концентрации ДНК в Sample2SName.
- DNASeqFoundInProcessCat -> Это метка, которую я хочу предсказать. Это категориальное значение с четырьмя категориями (found_in_0 -> found_in_3). Это выходные данные, где я провел три теста для каждого DNASeq, чтобы увидеть, манипулирую ли я исходным решением (которое является found_in_0), присутствует ли DNASeq.
Мой вопрос: Для невидимый набор последовательностей, я хочу, чтобы выходной набор меток был мультиклассовой вероятностью 'found_in_1', 'found_in_2', 'found_in_3'.
, т. е. если приведенный выше пример был выводом из моего теста установить, мой вывод в идеале должен выглядеть так:
DNA_seq Sample1Name Sample1Name ConcOfDNAInSample DNASeqFoundInProcessCat
AGGAG cat_0 cat_1 0.1 (0.9,0.5,0.1)
AGGAG cat_1 cat_2 0.4 (0.8,0.7,0.3)
ACCCC cat_1 cat_7 0.1 (0.2,0.5,0.3)
AGAGAGA cat_2 cat_10 1.9 (0.7,0.2,0.9)
ADAS cat_332 cat_103 8.9 (0.6,0.8,0.7)
Есть несколько примечаний:
Возможно, что из-за процессов, которые я выполняю, некоторые последовательности не могут быть в исходном решении (found_in_0), но тогда, поскольку кусочки ДНК могут слипаться, они МОГУТ впоследствии быть в других классах (found_in_1, found_in_2, found_in_3)
I меня интересуют только выходные данные для классов found_in_1, found_in_2 и found_in_3 (т. е. я хочу получить вероятность трех классов в конце, а не вероятность четырех классов с found_in_0).
Я могу видеть из своих данных, что мой набор данных несбалансирован, объем данных в found_in_3 значительно ниже, чем у других (мои полные данные о тренировках составляют около 80 000 строк; но только около 10000 из этих строк найдены_в_3; остальные все - found_in_0, found_in_1 или found_in_2).
То, что я пытаюсь выяснить, - это алгоритм, в частности, для одной конкретной c точки. Моя идея была:
1.Читать данные.
df = pd.read_csv('data')
2. Разделить набор данных на поезд и проверить
import sklearn
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test = train_test_split(X,y,test_size=0.2,random_state=42)
3.Понимать набор данных (то есть, где я увидел недопредставление в пункте 4 выше). У меня есть ряд функций для этого ... так скажем, у меня есть стандартизированный набор данных, который приведен в таблице выше.
4.Создать нейронную сеть.
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Conv2D
from tensorflow.keras import Model
Я знаю общая идея здесь будет эквивалентна тензорному потоку, делающему это в кератах (т.е. это для набора данных 'iris'; где я инициализирую модель, добавляю несколько слоев и функцию активации, компилирую модель, генерирую выходные данные модели и затем подгоните модель и затем прогнозируйте после этого (не показано)):
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(8,input_dim=4,activation='relu'))
model.add(Dense(8,input_dim=4,activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
model.fit(x_train,y_train, epochs=150,verbose=0)
Итак, я понимаю, что хочу повторить аналогичный набор шагов для моих данных, и я пытаюсь понять, как сделать это, что я не могу понять, это то, что я должен использовать tf.nn.sigmoid_cross_entropy_with_logits для этой проблемы (поскольку каждый вход может принадлежать перемещению, а не одной метке, то есть может присутствовать в found_in_1, found_in_2 и found_in_3, это может привести к выход вероятности на класс?)
Или я могу просто использовать функцию softmax, такую как this ?