Кривая ROC для модели LSTM - PullRequest
       8

Кривая ROC для модели LSTM

0 голосов
/ 07 января 2019

Мой набор данных выглядит следующим образом: каждая точка данных состоит из 7 объектов (A-G) различной длины.

 Group1  Group2............ Group 38
   A        B                   F
   E        C                   A
   B        E                   G
   C        D                   G
   C        F                   F
   D        G                   G
   .        .                   .
   .        .                   .   

Я применил LSTM, чтобы получить точность прогнозирования следующей буквы на основе предыдущих букв. Для применения в модели я закодировал их в один горячий вектор и вычислил тензор 38 * 7 * sequece_length (я импортировал его из другого файла как действия)

import keras
from keras.layers import Activation, LSTM,Input, Dense,Concatenate,Dropout
from data_loader import load_data, load_data_coded
from keras.models import Model, optimizers
from keras import backend as K
from keras.preprocessing.sequence import pad_sequences
import sys
import numpy as np
import math 
from sklearn.metrics import confusion_matrix, roc_curve,auc 

#data import
action_count,actions,cluster= load_data_coded(Static_data)

#padding 0 for uneven sequence lengths
Transposed=[]
for i in range(len(actions)):
    Transposed.append(actions[i].transpose())
padded=[pad_sequences(i,maxlen=620,padding='post') for i in Transposed]
f_actions=[]
for i in range(len(actions)):
    f_actions.append(padded[i].transpose())


#Model Building
main_input= Input(shape=(None,action_count),name='main_input')
lstm_out= LSTM(units=64,activation='tanh')(main_input)
lstm_out=Dropout(0.2)(lstm_out)
lstm_out=Dense(action_count)(lstm_out)
main_output=Activation('softmax')(lstm_out)
model=Model(inputs=[main_input],outputs=main_output)
print(model.summary())

#model_define
lr=[.01]
epochs=12

sgd=optimizers.SGD(lr=lr,momentum=0.9,nesterov=True)
model.compile(optimizer=sgd,loss='categorical_crossentropy')


#Training _Testing
seq_count=len(actions)
LOOCV=seq_count
Fold=4
fold_size=int(math.ceil(float(seq_count)/Fold))


train_accs=[]
test_accs=[]
for i in range(Fold):
    print('\nFold {}'.format(i+1))
    start = i * fold_size
    end = start + fold_size if i + 1 < Fold else seq_count

    x_train = [x for j, x in enumerate(f_actions) if j < start or j >= end]
    x_test = f_actions[start:end]

    max_length = np.amax([len(x) for x in x_train])
    indices = np.arange(1, max_length)

    def calc_acc(series,skip=0):
        loss = 0
        count = 0

        max_len = np.amax([len(x) for x in series])
        for k in range(1, max_len):
            feat = np.array([x[0:k] for x in series if len(x) > k])
            lab = np.array([x[k] for x in series if len(x) > k])
            pred = np.argmax(model.predict([feat]), axis=1)
            actual = np.argmax(lab, axis=1)
            count += len(pred)
            loss += sum([x != y for x, y in zip(pred, actual)])

        if count == 0:
            return 1.0
        else:
            return 1. - loss / float(count)

    train_acc = calc_acc(x_train)
    test_acc = calc_acc(x_test)
    print('train_acc={}, test_acc={}'.format(train_acc, test_acc))

    got_nan = False

    tr_acc=[]
    te_acc=[]
    for epoch in range(epochs):
        np.random.shuffle(indices)
        for index, k in enumerate(indices):
            feat = np.array([x[0:k] for x in x_train if len(x) > k])
            lab = np.array([x[k] for x in x_train if len(x) > k])
            h = model.fit(x=[feat], y=lab, verbose=False)

            if math.isnan(h.history['loss'][0]):
                print('\nWARNING: NaN occurred! Treating as an accuracy of 0.')
                got_nan = True
                break

            print('\repoch {} / {}, batch {} / {}'.format(epoch+1, epochs, index+1, len(indices)), end='')
            sys.stdout.flush()

        if got_nan:
            got_nan = False
            train_acc = 0
            test_acc = 0
            break

        train_acc = calc_acc(x_train)
        test_acc = calc_acc(x_test)
        tr_acc.append(train_acc)
        te_acc.append(test_acc)
        print('\ntrain_acc={}, test_acc={}'.format(train_acc, test_acc))

    train_accs.append(train_acc)
    test_accs.append(test_acc)
print('\nAverage: train_acc={}, test_acc={}'.format(np.average(train_accs), 
np.average(test_accs)))    

Я хочу рассчитать AUC для кривой ROC для этой модели. Поскольку это не бинарная классификация, как я могу получить кривую ROC для этой модели? Я видел некоторые источники для реализации в моем коде. Но я не могу понять, как я могу использовать для моей модели. https://scikit -learn.org / стабильный / auto_examples / model_selection / plot_roc.html # мультиклассовые-настройки Любая идея или предложение будет принята с благодарностью. Если вам нужна более подробная информация, пожалуйста, спросите меня, я предоставлю более подробную информацию.

...