Я думаю, вы могли бы добавить эту новую функцию в качестве другого измерения к вашим данным обучения. Вам нужно изменить данные обучения, добавив новые функции перед вызовом 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? Что такое соответствующая функция стоимости?
Что мне делать?
Ансамбль. Тренируйте два отдельных классификатора. Один использует ваши текстовые данные, а другой - для вашей новой ручной работы. А затем возьмите среднее значение их вероятностей прогнозирования. Вы можете обучить несколько классификаторов и забрать их голоса. Этот учебник отлично подходит для этого.
Попробуйте MLP Classifier. Я использовал его некоторое время назад и обнаружил, что он отлично работает с текстом.
Нейронные сети. Это довольно легко с Keras .
Читайте исследовательскую литературу. Весьма вероятно, что академия могла бы поработать над вашим набором данных. Попробуйте прочитать некоторые из них. Исследователь 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()