如何训练项目序列分割模型

how to train a model for item sequence segmentation

如果有一系列项目,我想分成多个部分。 为此,我想训练一个统计模型。

例如

Fruit:     Apple Banana Peach | Apple Banana | Apple Banana Peach | Banana
Segment:   1     1      1     | 2     2      | 3     3      3     | 4

在这个例子中,模型应该知道苹果总是开始一个新的段和香蕉,如果它前面没有苹果的话。

我想到了以下方法:

  1. 训练一个神经网络来预测一个项目是否根据它之前和之后的项目开始一个新的片段(也许是 LSTM?)这基本上是一个 2-class 分类

  2. 训练神经网络根据项目序列的一部分预测序列号。这将是一个序列-2-序列模型。

也许你们中有人遇到过类似的问题,可以分享他的经验。谢谢!

如果您只需要查看序列是否开始,则不需要复杂的方法。两个if就够了。

不过,如果你有 n 个这些序列开始,你仍然可以将它们存储在一个数组中并更新它们的编号并根据它进行检查。

在你有简单的解决方案之前,你不需要跳到 ML。

如果我遗漏了有关您问题的复杂性的某些信息,请告诉我。

也许如果您不知道序列何时开始,那么聚类会告诉您。

您可能想使用隐马尔可夫模型来预测分隔符的放置,因为 LSTM 的长期记忆对于您的任务来说是不必要的。

! pip install pomegranate

from pomegranate import HiddenMarkovModel, DiscreteDistribution
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

seq = ['Apple', 'Banana', 'Peach', 'Apple', 'Banana', 'Apple', 'Banana', 'Peach', 'Banana']
target = list('100101001')
encoded_seq = le.fit_transform(seq)

model = HiddenMarkovModel.from_samples(
    distribution=DiscreteDistribution,
    n_components=2,
    X=[encoded_seq],
    labels=[['None-start'] + target],
    state_names=['0', '1'],
    algorithm='labeled'
)

test_seq = ['Apple', 'Banana', 'Apple', 'Banana', 'Banana']

model.predict(le.transform(test_seq))
# >>> [1, 0, 1, 0, 0]

石榴HMMdocs

是的,我也会使用某种递归神经网络。我不确定您是否必须对输入进行编码,因此我不建议使用 seq2seq 网络。你可以只做一个 GRU(更快的 LSTM),然后是一个密集层,它可以根据之前的输入预测找到苹果的概率。
你甚至可以只使用 seq2seq 的解码器作为你的整个模型。

注意不要因为特征不多而把模型弄得太复杂。但是当你让你的例子起作用时,你也许可以根据用户也购买的东西来预测用户会购买什么,所以如果用户购买苹果然后预测梨和香蕉但是如果用户购买芒果则推荐更多的东西异国情调

研究愉快!