如何在2列上训练ML模型以解决分类问题?

时间:2019-08-14 05:53:02

标签: python machine-learning classification logistic-regression training-data

我在要进行情感分析的数据集中有三列(类012):

text    thing    sentiment

但是问题是我只能在textthing上训练数据,并得到预测的sentiment。有没有一种方法可以同时训练textthing上的数据,然后预测sentiment

问题案例(例如):

  |text  thing  sentiment
0 | t1   thing1    0
. |
. |
54| t1   thing2    2

此示例告诉我们,情感也应取决于thing。如果我尝试将两列串联在一起,然后再尝试,但这将是不正确的,因为我们不会在模型中将两列之间的关系给予任何考虑。

我的测试集包含两列testthing,我必须根据这两列上受过训练的模型来预测情绪。

现在我正在使用tokenizer,然后使用下面的模型:

model = Sequential()
model.add(Embedding(MAX_NB_WORDS, EMBEDDING_DIM, input_length=X.shape[1]))
model.add(SpatialDropout1D(0.2))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())

有关如何进行操作或使用哪种模型或编码操作的任何指针?

3 个答案:

答案 0 :(得分:1)

您可能希望转向Keras功能API并训练多输入模型。

根据Keras的创建者FrançoisCHOLLET在他的书 Python深度学习[Manning,2017] (第7章,第1节)中:

  

某些任务需要多模式输入:它们合并来自不同输入源的数据,并使用不同种类的神经层处理每种类型的数据。想象一下一个深度学习模型,该模型尝试使用以下输入来预测二手服装的最可能市场价格:用户提供的元数据(例如商品的品牌,年龄等),用户提供的元数据文字说明和图片。如果只有元数据可用,则可以对其进行一次热编码,然后使用密集连接的网络来预测价格。如果只有文本描述可用,则可以使用RNN或一维convnet。如果只有图片,则可以使用2D卷积网络。但是如何同时使用这三个呢?天真的方法是训练三个单独的模型,然后对它们的预测进行加权平均。但这可能不是最优的,因为模型提取的信息可能是多余的。更好的方法是使用可以同时查看所有可用输入方式的模型(具有三个输入分支的模型)共同学习更准确的数据模型。

答案 1 :(得分:1)

在这种情况下,我认为Concatenate功能是解决问题的方法,其总体思路应如下。请根据您的用例进行调整。

### whatever preprocessing you may want to do
text_input = Input(shape=(1, ))
thing_input = Input(shape=(1,))

### now bring them together
merged_inputs = Concatenate(axis = 1)([text_input, thing_input])

### sample output layer
output = Dense(3)(merged_inputs)

### pass your inputs and outputs to the model
model = Model(inputs = [text_input, thing_input], outputs = output)

答案 2 :(得分:0)

您必须将多列作为列表,然后在对原始数据进行嵌入和预处理后合并进行训练。 示例:

train = pd.read_csv('COVID19 multifeature Emotion - 50 data.csv', nrows=49)
# This dataset has two text column field and different class level

X_train_doctor_opinion = train["doctor-opinion"].str.lower()
X_train_patient_opinion = train["patient-opinion"].str.lower()

X_train = list(X_train_doctor_opinion) + list(X_train_patient_opinion))

然后预处理和嵌入