首页 > 解决方案 > 如何将 Snorkel 应用于数值数据?

问题描述

我有一个未标记的训练数据集,我试图使用它来标记,Snorkel以最终获得每个数据行的分数并执行回归分类(或获取多标签分类的标签)。它是具有基因行和数字数据列的生物数据。由于Snorkel我做错了什么,所以我label_function的做法不对,而且我不确定如何让它适用于我的数据类型。

这是我尝试使用的代码:

import numpy as np
import pandas as pd

import snorkel
from snorkel.labeling import labeling_function
from snorkel.labeling.model import LabelModel
from snorkel.labeling import LFAnalysis
from snorkel.labeling import PandasLFApplier

dataset = pd.read_csv("training_data.txt", header=0, sep='\t')
data = dataset.fillna(0) #removing the few NAs just to get Snorkel working

@labeling_function()
def lf1(df_row):

    m = df_row.col1 >= 3
    
    return 1 if m else 0

@labeling_function()
def lf2(df_row):

    m = df_row.col2 >= 1
    
    return 1 if m else 0

@labeling_function()
def lf3(df_row):

    m = df_row.col3 < 3
    
    return 0.75 if m else 0

@labeling_function()
def lf4(df_row):

    m = df_row.col4 >= 1
    
    return 0.75 if m else 0



@labeling_function()
def lf5(df_row):

    m = df_row.col5 < 1
    
    return 0.75 if m else 0


@labeling_function()
def lf6(df_row):

    m = df_row.col6 == 1
    
    return 0.1 if m else 0


lfs = [lfl, lf2, lf3, lf4, lf5, lf6]

applier = PandasLFApplier(lfs=lfs)
L_train = applier.apply(df=data)

这运行没有错误,但L_train似乎只为我的前 2 个标签函数提供标签,但我知道我的数据集中有一些行实际上满足了我的 6 个标签函数要求中的任何/全部 - 我错过了什么?

例如,此代码的输出是:

L_train

#output:
array([[0, 1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0],
       [1, 1, 0, 0, 0, 0],
       ...,
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]])

LFAnalysis(L=L_train, lfs=lfs).lf_summary()

#output:
    j   Polarity    Coverage      Overlaps     Conflicts
lf1 0   [0, 1]       1.0              1.0       0.173333
lf2 1   [0, 1]       1.0              1.0       0.173333
lf3 2   [0]          1.0              1.0       0.173333
lf4 3   [0]          1.0              1.0       0.173333
lf5 4   [0]          1.0              1.0       0.173333
lf6 5   [0]          1.0              1.0       0.173333

我无法分享我的实际数据集,但它本质上只是 100 列纯数字数据,我的领域知识涉及使用几列来制作上面的标签函数。从理论上讲,我还可以添加带有字符串数据的文本列并使用它们来制作标签,但我也不确定是否可以使用Snorkel涉及数字规则和文本规则的规则来制定规则?只是试图让任何标签首先工作。

标签: pythonsnorkel

解决方案


推荐阅读