K-Fold в нейронной сети для классификации текста - PullRequest
0 голосов
/ 17 июня 2019

В настоящее время я пытаюсь выполнить некоторую классификацию текста, используя нейронную сеть с некоторыми собственными входными данными.

Из-за моего очень ограниченного набора данных, содержащего около 85 положительных и 85 отрицательных классифицированных текстов по ~ 1500 слов на файл,Мне сказали использовать перекрестную проверку для моей нейронной сети, чтобы обойти переоснащение.

Я начал строить нейронную сеть с помощью YT-видео и руководств, и теперь моя проблема заключается в том, как сделать перекрестную проверку.проверочное тестирование.

Мой текущий код выглядит следующим образом:

data = pd.read_excel('dataset3.xlsx' )
max_words = 1000
tokenize = text.Tokenizer(num_words=max_words, lower=True, char_level=False)

train_size = int(len(data) * .8)
train_posts = data['Content'][:train_size]
train_tags = data['Value'][:train_size]
test_posts = data['Content'][train_size:]
test_tags = data['Value'][train_size:]

tokenize.fit_on_texts(train_posts)
x_train = tokenize.texts_to_matrix(train_posts)
x_test = tokenize.texts_to_matrix(test_posts)

encoder = LabelEncoder()
encoder.fit(train_tags)
y_train = encoder.transform(train_tags)
y_test = encoder.transform(test_tags)
num_classes = np.max(y_train) + 1
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)

batch_size = 1
epochs = 20
model = Sequential()
model.add(Dense(750, input_shape=(max_words,)))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes))
model.add(Activation('sigmoid'))

model.summary()

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

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs= epochs,
                    verbose=1,
                    validation_split=0.2)

Я играл с

KFold(n_splits=k, shuffle=True, random_state=1).split(x_train, y_train))

, но я понятия не имею, как использовать его в нейронной сети.Сама сеть, надеюсь, вы можете помочь мне с моей проблемой.

Спасибо в отношении

Джейсон

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Хотите ли вы сделать K-Fold при проверке или тестировании?

K-Fold довольно прост (вы можете сделать это самостоятельно с помощью Random).Он разбивает ваш входной список на k подмножеств, возвращает вам 2 массива, первый (больший) - это индекс элемента в (k-1) подмножествах, а второй (меньший) - это индекс k-го подмножества.Затем вы решаете, как его использовать.Так что K-Flod помогает вам выбрать лучшую комбинацию между поездом и тестированием (или проверкой).

Код будет выглядеть примерно так.

kfold = KFold(n_splits=k, shuffle=True, random_state=n) # Choose yours k and n
for arr1, arr2 in kfold.split(X, y):
  x_train, y_train = X[arr1], y[arr1] #
  x_k, y_k = X[arr2], y[arr2]  # 'x_k' should be 'x_test' or 'x_valid' depending on your purpose
  # train your model

Так что если вы хотите сделать K-Fold при проверке, следующий код будет

  model = YourModel()
  model.fit(X_train, y_train, validation_data=(X_k, y_k), epochs=...)

или K-Сгиб в тесте

  model = YourModel()
  model.fit(X_train, y_train, epochs=...) # train without validation
  # model.fit(X_train, y_train, validation_split= ... ) # train with validation
  model.evaluate(X_k)

Вы заметите, что при использовании K-Fold вы тренируете модель k раз.

0 голосов
/ 17 июня 2019

Вы можете использовать scikit KFold.split следующим образом:

accuracy = []
kf = KFold(n_splits=k, shuffle=True, random_state=1)
for trainIndices, testIndices in kf.split(x_train, y_train):
    #Start your model
    model = Sequential()
    ...
    history = model.fit(x[trainIndices], y[trainIndices],
                    batch_size=batch_size,
                    epochs= epochs,
                    verbose=1,
                    validation_split=0.2)

    prediction = model.predict(x[testIndices])
    accuracy.append(accuracy_score(y[trainIndices], prediction))

# Print the mean accuracy
print(sum(accuracy)/len(accuracy))

Как это работает

Смотрите здесь , если вам нужно большеинформация о самой технике.

О реализации scikit-learn, kf.split дает k пары индексов для поезда и индексы для тестов. Выходные значения означает, что эта функция может повторяться как список.Кроме того, помните, что эта функция дает вам индексы, поэтому, чтобы обучить модель, вы должны получить такие значения: x[trainIndices]

Для каждой из этих k моделей вы рассчитаетеТочность [*] этой обученной модели по тестовому разделу.После этого вы можете рассчитать среднюю точность, чтобы определить общую точность модели.


[*] Для этого я использовал показатель точности из scikit learn, новместо этого это можно сделать вручную.

...