【问题标题】:Conversion of Multi-class dataset to Multi-Label dataset using Python使用 Python 将多类数据集转换为多标签数据集
【发布时间】:2021-08-11 15:41:49
【问题描述】:

我有 多类 数据集,其中包含 3 个类 C1、C2 和 C3 以及一些对应的值如下表所示

Class Value
C1 V11
C1 V12
C2 V21
C2 V22
C2 V23
C3 V31

我们希望它通过使用所有可能的组合将其转换为多标签数据集,如下所示

Value C1 C2 C3
V11V21 1 1 0
V11V22 1 1 0
V11V23 1 1 0
V11V31 1 0 1
V11V21V31 1 1 1
V12V21 1 1 0
.... . . .

我们正在组合不同类别的值,在 categoryColumns 中,如果该类存在,则添加 1,否则添加 0。

注意:Vij 是一个字符串,所以 V11V21 也是一个字符串 例如:V11 = 'Hello' V21 = 'Friend' 然后 V11V21 = 'HelloFriend'

注意:我已经从 csv 文件中使用 python 中的 pandas 导入了多类数据集,它的形状是 (n, 2)。因此 Pandas 中的解决方案将是一个加分项,但不是必需的,您可以使用任何 DS 提供解决方案。

注意:这不是机器学习问题,只是数据转换问题。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    地址:

    获取所有组合:

    import itertools
    combinations=[]
    for number in range(2,len(V)+1):#Combinations except 1 & 0.
        combinations.append([list(a) for a in itertools.combinations(V,number)])
    

    一个热门的编码类:

    Dict={"C1":np.array([1,0,0]),"C2":np.array([0,1,0]),"C3":np.array([0,0,1])}
    DF["Class"]=DF["Class"].apply(lambda x :Dict[x])
    

    创建一个 val_class 对的字典:

    Val_class_dict={}
    for val in DF.Value.drop_duplicates():
        x=np.sum(DF[DF["Value"]==val].Class.values,axis=0)#Summing them up if there are more than 1 value for each.
        Val_class_dict[val]=x
    

    class_vals=[]
    val_strs=[]
    for a in combinations:
        for b in a:
            zeros=np.array([0,0,0])
            Str=""
            for c in b:
                Str+=str(c)
                zeros+=Val_class_dict[c]
            class_vals.append(zeros)
            val_strs.append(Str)
    
    pd.DataFrame({"Value":val_strs,"C1":np.array(class_vals)[:,0],"C2":np.array(class_vals)[:,1],"C3":np.array(class_vals)[:,2]})
    

    对于 Ram-Memory 问题,每次创建时保存:

    import csv
    import itertools
    with open('store.csv', mode='w') as file:
        file_writer = csv.writer(file, delimiter=',')
        for number in range(2,len(V)+1):
            for a in [list(a) for a in itertools.combinations(V,number)]:
                zeros=np.array([0,0,0])
                Str=""
                for b in a:
                    Str+=str(b)
                    zeros+=Val_class_dict[b]
                file_writer.writerow((Str,zeros))
    

    【讨论】:

    • 嗨@Hakan Akgün,感谢您的回答。它可以帮助我部分解决问题,如步骤 获取所有组合: 当我使用 35 个类时,我遇到了内存不足的问题。我的班级人数可以达到 100,但只使用 35 会造成麻烦。您能否帮我找到无法解决内存问题的解决方案。我正在使用 16GB RAM 的系统。
    • 您可以通过在每次创建时写入文件来解决此问题。我正在编辑并显示它希望这能解决问题。
    • 它在启动时完美运行了几分钟但是当我传递一个大小为 1068 的数组 V 并崩溃时,itertools.combinations(V,number) 占用了太多内存并且内存不足。我们能否以有效的方式找到组合,因为我看到它的复杂性是 O(r (n choose r))
    • 嗯,这基本上是因为大小为 1068 的 V 朝向其最后一个组合需要存储 1068*1067 元素。您可以做的是将您的 itertools.combinations 写入另一个文件,并从那里每行获取所有组合。试试,如果你不能这样做,我可以编辑答案。
    猜你喜欢
    • 2015-01-24
    • 2021-11-05
    • 2017-11-08
    • 2022-01-22
    • 2015-11-28
    • 2020-09-23
    • 2016-08-26
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多