keras: не удалось преобразовать строку в float в model.fit - PullRequest
0 голосов
/ 06 мая 2020

У меня есть такой фрейм данных, состоящий из последовательностей ДНК:

Feature         Label
GCTAGATGACAGT   0
TTTTAAAACAG     1
TAGCTATACT      2    
TGGGGCAAAAAAAA  0
AATGTCG         3
AATGTCG         0
AATGTCG         1

Где есть один столбец с последовательностью ДНК и метка, которая может быть 0,1,2,3 (т.е. категория этой последовательности ДНК). Я хочу разработать сетевую сеть, которая прогнозирует вероятность классификации каждой последовательности в категории 1,2 или 3 (не 0, меня не волнует 0). Каждая последовательность может появляться во фрейме данных несколько раз, и возможно, что каждая последовательность появится в нескольких (или во всех) категориях. Таким образом, результат должен выглядеть так:

GCTAGATGACAGT   (0.9,0.1,0.2)
TTTTAAAACAG     (0.7,0.6,0.3)
TAGCTATACT      (0.3,0.3,0.2)    
TGGGGCAAAAAAAA  (0.1,0.5,0.6)

Где числа в кортеже - это вероятность того, что последовательность находится в категориях 1,2 и 3.

Я написал эту основу c код для начала. Вы можете видеть, что я закомментировал более сложные моменты, я пытаюсь заставить работать базовый c метод, а затем я постепенно расширяю его, но я включил все, чтобы люди могли увидеть общую идею, о которой я думал of.

# Split into input (X) and output (Y) variables
X = df.iloc[:,[0]].as_matrix() #as matrix due to this error: https://stackoverflow.com/questions/45479239/pandas-keyerror-not-in-index-when-training-a-keras-model
y = df.iloc[:,-1].as_matrix()
print(X[0:10])
print(y[0:10])


# Define 10-fold cross validation test harness
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
kf = kfold.get_n_splits(X)
cvscores = []
for train, test in kfold.split(X, Y):
    X_train, X_test = X[train], X[test]
    y_train, y_test = y[train], y[test]


# Pre-process the data
#    X_train = sequence.pad_sequences(X[train], maxlen=30) #based on 30 aa being max we're interested in
#    X_test = sequence.pad_sequences(X[test], maxlen=30) #based on 30 aa being max we're interested in




# Create model
    model = Sequential()
#   model.add(Embedding(3000, 32, input_length=30))
#   model.add(Bidirectional(LSTM(20, return_sequences=True), input_shape=(n_timesteps, 1)))
    model.add(Dense(1, activation='sigmoid'))



# Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])



# Monitor val accuracy and perform early stopping
#    es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=200)
#    mc = ModelCheckpoint('best_model.h5', monitor='val_accuracy', mode='max', verbose=1, save_best_only=True)



# Fit the model
    model.fit(X_train, y_train, epochs=150, batch_size=10, verbose=0)


# Evaluate the model
#    scores = model.evaluate(X[test], Y[test], verbose=0)
#    print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
#    cvscores.append(scores[1] * 100)
#print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))


#output a three sigmoid model, and plot accuracy and loss

Сначала выводятся последовательности, как и ожидалось (т.е. оператор печати):

[['GCTAGATGACAGT']
 ['TTTTAAAACAG']
 ['TAGCTATACT']
 ['TGGGGCAAAAAAAA']
 ['AATGTCG']
 ['AATGTCG']
 ['AATGTCG']
 ['TTATATAAAAG']
 ['GCTGGGAG']
 ['TTTGCGTATAGATAGATAG']]
[0 1 2 0 3 0 1 2 2 0]

И затем я получаю сообщение об ошибке:

ValueError: could not convert string to float: 'XXX' (where XXXX is one of the sequences in the data set, but not one of the top 10 in the output above), and further up in the error it points to the value error being in the line:

    model.fit(X_train, y_train, epochs=150, batch_size=10, verbose=0)

Я видел этот вопрос, но не думаю, что мой вопрос по той же root причине. Может кто-нибудь объяснить, почему я получаю это? Мне интересно, это потому, что я еще не объяснил модели / должным образом, что я имею дело с вычислением вероятности последовательности вместо категориального признака?

1 Ответ

1 голос
/ 06 мая 2020

Как я вижу в заявлении о принтах, вы скармливаете свою NN строками / текстом, и это невозможно. Вы должны закодировать их в числа. Для выполнения этой операции доступны разные подходы: вы можете одним нажатием кодировать свои символы или вы можете создать обучаемое вложение для каждого символа.

Я предлагаю вам Tokenizer от TF, который может помочь вы в процессе цифрового кодирования текстовых последовательностей

...