- Вопрос или проблема
- Ответ или решение
- Классификация последовательностей системных вызовов с использованием методов обработки текста
- 1. Понимание структуры данных
- 2. Разделение данных на обучающую и тестовую выборки
- 3. Токенизация и приведение к единой длине
- 4. Преобразование меток в категориальный формат
- 5. Компиляция и обучение модели
- 6. Оценка модели
- Заключение
Вопрос или проблема
Я работаю над проектом, в котором мне необходимо классифицировать последовательности системных вызовов, мой набор данных представлен как последовательности целых чисел (от 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]))
Заключение
Классификация последовательностей системных вызовов — интересная задача, требующая тщательной настройки и правильной обработки данных. Понимание формата меток и правильное преобразование последовательностей не только облегчит обучение, но и повысит качество модели. Подходя к проекту с осознанием этих шагов, вы сможете достичь желаемых результатов в классификации.