Использование классификации текста для системных вызовов

Вопрос или проблема

Я работаю над проектом, в котором мне необходимо классифицировать последовательности системных вызовов, мой набор данных представлен как последовательности целых чисел (от 1 до 340). Для классификации я вдохновился проектами по классификации текста. Я пытаюсь использовать один из них, но столкнулся с проблемой в форме моего набора данных, код выглядит следующим образом:

df = pd.read_csv("data.txt") 
#df_test = pd.read_csv("validation.txt")

#разделяем массивы на обучающие и тестовые данные (кросс-валидация)
train_text, test_text, train_y, test_y = train_test_split(df,df,test_size = 
0.2)

#train_text, train_y = (df,df)
#test_text, test_y = (df_test, df_test)
MAX_NB_WORDS = 5700

texts_train = train_text.astype(str)
texts_test = test_text.astype(str)


tokenizer = Tokenizer(nb_words=MAX_NB_WORDS, char_level=False)
tokenizer.fit_on_texts(texts_train)
sequences = tokenizer.texts_to_sequences(texts_train)
sequences_test = tokenizer.texts_to_sequences(texts_test)

word_index = tokenizer.word_index
#print('Found %s unique tokens.' % len(word_index))
type(tokenizer.word_index), len(tokenizer.word_index)
index_to_word = dict((i, w) for w, i in tokenizer.word_index.items()) 
" ".join([index_to_word[i] for i in sequences[0]])

seq_lens = [len(s) for s in sequences]
#print("average length: %0.1f" % np.mean(seq_lens))
#print("max length: %d" % max(seq_lens))

MAX_SEQUENCE_LENGTH = 100
# дополняем последовательности нулями
x_train = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)  # приводим 
последовательности к одной длине 150, добавляя нули
x_test = pad_sequences(sequences_test, maxlen=MAX_SEQUENCE_LENGTH)
#print('Shape of data train:', x_train.shape)  #это дает (1,100)
#print('Shape of data test tensor:', x_test.shape)
y_train = train_y
y_test = test_y
#if np.any(y_train):
  #y_train = to_categorical(y_train)
print('Shape of label tensor:', y_train.shape)
EMBEDDING_DIM = 50
N_CLASSES = 2
# вход: последовательность из MAX_SEQUENCE_LENGTH целых чисел
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype="float32")

embedding_layer = Embedding(MAX_NB_WORDS, EMBEDDING_DIM,
                        input_length=MAX_SEQUENCE_LENGTH,
                        trainable=True)
embedded_sequences = embedding_layer(sequence_input)

average = GlobalAveragePooling1D()(embedded_sequences)
predictions = Dense(N_CLASSES, activation='softmax')(average)

   model = Model(sequence_input, predictions)
model.compile(loss="categorical_crossentropy",
          optimizer="adam", metrics=['acc'])
model.fit(x_train, y_train, validation_split=0.1,
      nb_epoch=10, batch_size=100)
output_test = model.predict(x_test)
print("test auc:", roc_auc_score(y_test,output_test[:,1]))

Я получил ошибку: ValueError Ошибка при проверке цели, ожидалась форма dense_1 (2,), но получен массив с формой (1,)

Любые предложения, так как я не знаю, как поступить. Спасибо

Проблема, похоже, возникает в этой строке.

predictions = Dense(N_CLASSES, activation='softmax')(average) 

Здесь N_CLASSES имеет значение 2. Значит, у вас 2 класса. Но вектор y_train имеет форму ( 1, ).

  • Вам нужно преобразовать вектор y_train в вектор “один-на-один”. Вот пример.

Если y_train = [ [ 0 ] , [ 1 ] ], тогда его вектор “один-на-один” будет [ [ 1 , 0 ] , [ 0 , 1 ] ]. Вектор “один-на-один” имеет форму ( 2 , ), что необходимо в вышеприведенном фрагменте кода. Поэтому внесите это исправление.

y_train = keras.utils.to_categorical( y_train , N_CLASSES )

Ответ или решение

Классификация последовательностей системных вызовов с использованием методов обработки текста

В рамках вашего проекта по классификации последовательностей системных вызовов вы столкнулись с некоторыми проблемами, связанными с форматом данных, которые вы используете. Давайте внимательнее рассмотрим, как можно эффективно применить методы классификации текста к вашему набору данных и исправить возникшие ошибки.

1. Понимание структуры данных

Ваши данные представлены в виде последовательностей целых чисел от 1 до 340, что напоминает текстовые данные, где каждое число можно воспринимать как уникальное "слово". Ваша цель — обучить модель, которая будет способны классифицировать эти последовательности на основе предоставленных меток.

2. Разделение данных на обучающую и тестовую выборки

Сначала вы разделили данные на обучающую и тестовую выборки. Включение только одной колонки в обе выборки вызвало потенциальную проблему. Убедитесь, что вы передаете метки (y) корректно:

train_text, test_text, train_y, test_y = train_test_split(df['text_column'], df['labels'], test_size=0.2)

3. Токенизация и приведение к единой длине

Токенизация и выравнивание последовательностей являются важными шагами. Вы правильно используете Tokenizer для преобразования текстов в числовые последовательности. Однако иногда стоит убедиться, что максимальная длина последовательности (MAX_SEQUENCE_LENGTH) соразмерна минимальной длине, которую вы ожидаете.

MAX_SEQUENCE_LENGTH = max(map(len, sequences))

Затем добавьте дополнение нулями к последовательностям:

x_train = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)
x_test = pad_sequences(sequences_test, maxlen=MAX_SEQUENCE_LENGTH)

4. Преобразование меток в категориальный формат

Ошибка, которую вы получили:

ValueError: Error when checking target expected dense_1 to have shape(2,), but got array with shape(1,)

указывает на несоответствие между форматом меток и выходом модели. Чтобы исправить это, преобразуйте ваши метки в формат one-hot, который совпадает с количеством классов:

from keras.utils import to_categorical

y_train = to_categorical(train_y, num_classes=N_CLASSES)
y_test = to_categorical(test_y, num_classes=N_CLASSES)

5. Компиляция и обучение модели

После исправления формата меток, ваша модель теперь должна корректно обучаться. Убедитесь, что параметры вашего вызова fit настроены правильно. Обратите внимание на устаревшие параметры, такие как nb_epoch, которые следовало бы заменить на epochs:

model.fit(x_train, y_train, validation_split=0.1, epochs=10, batch_size=100)

6. Оценка модели

Не забудьте правильно оценить модель с помощью ваших тестовых данных. Используйте predict и корректно обрабатывайте выходные данные:

output_test = model.predict(x_test)
print("test auc:", roc_auc_score(y_test[:, 1], output_test[:, 1]))

Заключение

Классификация последовательностей системных вызовов — интересная задача, требующая тщательной настройки и правильной обработки данных. Понимание формата меток и правильное преобразование последовательностей не только облегчит обучение, но и повысит качество модели. Подходя к проекту с осознанием этих шагов, вы сможете достичь желаемых результатов в классификации.

Оцените материал
Добавить комментарий

Капча загружается...