scikit-learn добавляет дополнительные данные в SGDClassifier - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь сделать классификацию текста с scikit-learn.

У меня есть текст, который плохо классифицируется. Я думаю, что могу улучшить прогнозы, добавив данные, которые я могу вывести в виде массива целых чисел.

Например, образец 1 будет иметь [3, 1, 5, 2], а образец 2 будет иметь [2, 1, 4, 2]. Это также относится к тестовым данным.

Идея состоит в том, что классификатор мог бы использовать как текст, так и числа для классификации данных.

Я прочитал документацию по scikit learnи я не могу найти, как это сделать. Это должно быть возможно, потому что все, что классифицируется внутри, это векторы чисел. Так что добавление еще одного вектора чисел не должно быть такой большой проблемой, но я не могу понять, как. partial_fit добавляет больше сэмплов, но не добавляет больше информации о существующих сэмплах. Есть ли способ сделать то, что я пытаюсь сделать. Я пытался объединить GaussianNB с SGDClassifier, но оказалось, что я не знаю, как это сделать. (Это была плохая идея?)

Что мне делать?

1 Ответ

1 голос
/ 08 ноября 2019

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

Простой / наивный способ будет выглядеть так:

Например, если мои данные тренировки сдве выборки были X = [ [1,2,3], [8,9,0] ]

И мои новые функции для каждой выборки были new_feature_X = [ [11,22,33] , [77,88,00] ]

Мои новые тренировочные данные были бы:

X_new = [[1,2,3,11,22,33] , [8,9,0,77,88,00]]

Затем вы звоните SGD.fit(X_new, labels)

Что касается моих знаний SGD, я не думаю, что есть какой-либо другой способ объединить две функции.

Идея состоит в том, что классификатор мог бы использовать как текст, так и числа для классификации данных.

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

Я пытался объединить GaussianNB с SGDClassifier, но оказалось, что я не знаю, как это сделать. (Это была плохая идея?)

SGD означает стохастический градиент спуск. Можно ли найти градиент NaiveBayes? Что такое соответствующая функция стоимости?

Что мне делать?

  1. Ансамбль. Тренируйте два отдельных классификатора. Один использует ваши текстовые данные, а другой - для вашей новой ручной работы. А затем возьмите среднее значение их вероятностей прогнозирования. Вы можете обучить несколько классификаторов и забрать их голоса. Этот учебник отлично подходит для этого.

  2. Попробуйте MLP Classifier. Я использовал его некоторое время назад и обнаружил, что он отлично работает с текстом.

  3. Нейронные сети. Это довольно легко с Keras .

  4. Читайте исследовательскую литературу. Весьма вероятно, что академия могла бы поработать над вашим набором данных. Попробуйте прочитать некоторые из них. Исследователь Google, специалист по семантике - отличные места для поиска опубликованных результатов.

from keras.layers import Input, Dense,Concatenate
from keras.models import Model

# This returns a tensor
text_input_vec = Input(shape=(784,))
new_numeric_feature = Input(shape=(4,))

# feed your text to a dense layer
dense1 = Dense(64, activation='relu')(text_input_vec)

# feed your numeric feature to another dense layer
dense2 = Dense(64, activation='relu')(new_numeric_feature)

# concatenate/combine the output of both
concat = Concatenate(axis=-1)([dense1,dense2])

# use the above to predict the label of your text. Layer below
# assumes you have 2 classes 
predictions = Dense(2, activation='softmax')(concat)

model = Model(inputs=[text_input_vec,new_numeric_feature], outputs=predictions)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

model.summary()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...