簡體   English   中英

如何使用 keras model.predict() 使用來自交叉驗證的最佳 model Z78E62681F6398F4CE365

[英]how to use keras model.predict() using the best model from a cross-validation output?

我有一個這樣的 DNA 序列數據框:

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

其中有一列帶有 DNA 序列,而 label 可以是 0、1、2、3(即該 DNA 序列的類別)。 我想開發一個 NN 來預測每個序列分類為 1,2 或 3 類別的概率(不是 0,我不關心 0)。 每個序列可以在數據框中出現多次,並且每個序列有可能出現在多個(或所有)類別中。 所以 output 應該是這樣的:

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 中找到序列的概率。

這是我的代碼:

import numpy
from keras.datasets import imdb
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
from sklearn.model_selection import StratifiedKFold
from keras.callbacks import EarlyStopping, ModelCheckpoint
import matplotlib
from matplotlib import pyplot
import os
from random import random
from numpy import array
from numpy import cumsum
import pandas as pd
from keras.layers import TimeDistributed
from keras.layers import Bidirectional
from keras.preprocessing.text import Tokenizer
from sklearn.preprocessing import LabelEncoder
os.environ['KMP_DUPLICATE_LIB_OK']='True'
%matplotlib
from sklearn.feature_extraction.text import CountVectorizer


# define 10-fold cross validation test harness
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)

#read in the file
df = pd.read_csv('dna_sequences.txt')
X = list(df['dna_sequence'])
y = list(df['class'])


#convert the sequences to integers for learning
tokenizer = Tokenizer(num_words=5,char_level=True)
tokenizer.fit_on_texts(X)
data_encoded = tokenizer.texts_to_matrix(X,mode='count')

kf = kfold.get_n_splits(data_encoded)
cvscores = []

#for each train, test in cross validation sub-set
for train, test in kfold.split(data_encoded, y):

    X_train, X_test = data_encoded[train], data_encoded[test]
    y_train, y_test = data_encoded[train], data_encoded[test]

    #add layers to model
    model = Sequential()
    model.add(Embedding(3000, 32, input_length=5))
    model.add(Dropout(0.2))
    model.add(Bidirectional(LSTM(20, return_sequences=True), input_shape=(5, 1)))
    model.add(LSTM(100))
    model.add(Dropout(0.2))
    model.add(Dense(5, activation='sigmoid'))

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

    #check the model
    print(model.summary())

    #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, validation_data=(X_test, y_test), epochs=5, batch_size=64) #change values

    #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)

#check the accuracy
print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))



#predict for new set of seqs
pred_list = ['GTGTGCGCT','GGGGGTCGCTCCCCCC','AAATGTTGT','GTGTGTGGG','CCCCTATATA']

#output a probability of sequence being found in each class as described above, and plot accuracy and loss

它運行,並按預期打印准確度(准確度不是很好,62%,但我可以解決這個問題,這是我的第一個 NN,只是想運行一個示例)。

我的問題是專門關於預測的。 有人可以向我展示一個從安裝 model(我在上面有)到實際預測的跳躍示例。 我認為該算法涉及:

  1. 從交叉驗證中找到最好的 model(我試圖將它與監視器驗證精度部分結合起來)
  2. 預測 class 的序列列表在 pred_list 中
  3. 適合從訓練到 pred_list 的最佳 model
  4. 如問題頂部所述的返回概率。

我知道這存在於其他問題(例如這里):

prediction = model.predict(np.array(tk.texts_to_sequences(text)))
print(prediction)

....但我不知道如何將其與交叉驗證結合起來,並且以某種方式獲得我想要的 output(即在訓練中分配給 ZA2F2ED4F8EBC2CBB4C21A29DC43 或 ZA2F2ED4F8EBC2CBB4C21A29DC43 的每個序列的三個 class 概率數據集,其中每個序列可以出現在多個類中)。

編輯1:根據以下評論,我將代碼的結尾更改為:

(在交叉驗證循環中,所以應該縮進)

#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)

#predict for new set of seqs
pred_list = ['GTGTGCGCT','GGGGGTCGCTCCCCCC','AAATGTTGT','GTGTGTGGG','CCCCTATATA', 'GGGGGGGGGTTTTTTTT']
prediction = model.predict(np.array(tokenizer.texts_to_sequences(pred_list)))
predcvscores.append(prediction)

(超出交叉驗證循環)

print(predcvscores)

#check the accuracy
print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))

我得到錯誤:

Error when checking input: expected embedding_3_input to have shape (5,) but got array with shape (1,)

我想這是說我不能只讀一組像 pred_list 這樣的序列? 是不可能做到這一點,還是我沒有采取正確的方法? 另外,我不確定這種方法是否會給我,對於 pred_list 中的每個項目,一個 output 是出現在類別 1,2 或 3 中的概率,但也許我錯了,它會。

你在一個問題中問了太多且完全不相關的事情,並且其中有幾個問題。 我將嘗試解決我認為最嚴重的問題。

首先,如果您有表格的案例

Feature         Label
AATGTCG         3
AATGTCG         0
AATGTCG         1

即相同的單個特征可以屬於 class 0、1 或 3,沒有任何其他特征存在,那么這里的信息是監督分類可能不適合您手頭的問題; 為此,您應該使用附加功能。

如您所說,如果您只對第 1、2 和 3 類感興趣,並且

不是0,我不在乎0

那么您在數據准備階段應該做的第一件事就是從數據集中刪除class 0 的所有實例; 目前尚不清楚您是否在這里這樣做,即使您這樣做,也不清楚為什么您仍將 class 0 留在討論中。

其次(假設您的分類問題中確實只剩下 3 個類),您按預期顯示的 model 的 output :

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,而此處並非如此。

第三,由於您有一個多類分類問題,您的損失應該是categorical_crossentropy ,而不是binary_crossentropy ,它僅用於二進制分類問題。

第四,再次假設你只剩下 3 個類,你的 model 的最后一層應該是

model.add(Dense(3, activation='softmax') # no. of units here should be equal to the no. of classes)

而您的標簽y應該是一次性編碼的(您可以使用 Keras function to_categorical輕松做到這一點)。

第五,在循環開始時仔細查看數據定義:

X_train, X_test = data_encoded[train], data_encoded[test]
y_train, y_test = data_encoded[train], data_encoded[test]

您可以輕松地看到您將特征作為特征標簽傳遞。 我只能猜測這一定是您這邊的錯字; 標簽應該是:

y_train, y_test = y[train], y[test]

關於您的預測時間錯誤

Error when checking input: expected embedding_3_input to have shape (5,) but got array with shape (1,)

這是由於嵌入層中的參數input_length=5所致。 我在這里承認,我對 Keras 嵌入層一點也不熟悉; 您可能需要檢查文檔以確保此參數和分配的值確實符合您的想法/打算做的事情。

除此之外,關於您的具體問題:

我的問題是專門關於預測的。 有人可以向我展示一個從安裝 model(我在上面有)到實際預測的跳躍示例。

您應該在 CV 循環之外重新編譯並重新擬合 model(可能使用在 CV 期間找到的“最佳”時期數)與整個數據,然后將其用於預測。


我想現在應該很清楚了,鑒於上述問題,您報告的 62% 的准確度實際上並不意味着什么; 無論好壞,Keras 都不會“保護”你,如果你試圖做從建模角度來看沒有意義的事情(就像我上面提到的大多數事情),比如在多類問題中使用二元交叉熵,或在回歸設置中使用准確性...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM