Snorkel:我可以在数据集中使用不同的功能来生成标签函数 VS 训练分类器吗?

Snorkel: Can i have different features in data set to for generating labelling function VS training a classifier?

我有一组特征来构建标签函数(集合 A) 和另一组特征来训练 sklearn 分类器(集合 B)

生成模型将输出一组概率标签,我可以用它来训练我的分类器。

我是否需要将用于标记函数的特征(集合 A)添加到我的分类器特征中? (B组) 或者只使用生成的标签来训练我的分类器?

我参考了 snorkel spam tutorial,但我没有看到他们使用标记函数集中的特征来训练新的分类器。

cell 47 中所示,特征化完全使用 CountVectorizer 完成:

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(ngram_range=(1, 2))
X_train = vectorizer.fit_transform(df_train_filtered.text.tolist())

X_dev = vectorizer.transform(df_dev.text.tolist())
X_valid = vectorizer.transform(df_valid.text.tolist())
X_test = vectorizer.transform(df_test.text.tolist())

然后直接拟合keras模型:

# Define a vanilla logistic regression model with Keras
keras_model = get_keras_logreg(input_dim=X_train.shape[1])

keras_model.fit(
    x=X_train,
    y=probs_train_filtered,
    validation_data=(X_valid, preds_to_probs(Y_valid, 2)),
    callbacks=[get_keras_early_stopping()],
    epochs=50,
    verbose=0,
)

从您链接的通气管教程中,标签函数(将输入映射到标签 ("HAM"、"SPAM"、"Abstain") 用于提供 标签 而不是 特征

IIUC,这个想法是在你没有高质量的人工标签时生成标签。尽管这些 "auto-generated" 标签会非常嘈杂,但它可以作为标记数据集的起点。学习过程是获取这个数据集并学习一个模型,该模型对嵌入在这些标记函数中的知识进行编码。希望该模型可以更通用,并且该模型可以应用于看不见的数据。

如果这些标记函数中的一些(可以被视为固定规则)在某些条件下非常稳定(关于预测准确性),给定足够的训练数据,您的模型应该能够学到那个。然而,在生产系统中,为了克服模型不稳定的可能性,一个简单的解决方法是 override 机器预测,在已见数据上使用人工标签。如果您认为这些标记函数可以用于某些特定的输入(模式),同样的想法也可以应用。在这种情况下,标签函数将用于直接获取标签以覆盖机器预测。此过程可以作为机器学习模型运行之前的预检查来实施。

我在 snorkel github 页面上问了同样的问题,这是回复:

you do not need to add in the features (set A) that you used for LFs into the classifier features. In order to prevent the end model from simply overfitting to the labeling functions, it is better if the features for the LFs and end model (set A and set B) are as different as possible

https://github.com/snorkel-team/snorkel-tutorials/issues/193#issuecomment-576450705