为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法按给定数据集中值的百分比窗口对数据行进行分组,然后遍历数据集?

有没有办法按给定数据集中值的百分比窗口对数据行进行分组,然后遍历数据集?

ITMISS 2021-11-09 20:42:15
我有一个来自某些关联规则挖掘的大型 csv 文件。其中两列是规则和置信度得分。规则列包含不同长度的项目列表,例如[[Dog],[Dog,Cat],[Dog,Cat,Hamster],[Dog,Cat,Hamster,Goldfish]]置信度分数列包含 0 到 1 之间的数字列表,例如[0.1, 0.5, 0.1, 0.5]我想根据规则值是否是其他规则值的子集来删除冗余行,但我只想删除具有相似置信度分数的行(在置信度窗口内,比如 5%)。在上面的例子中,剩下的行是 [Dog] 和 [Dog,Cat]。[Dog] 会保留,因为[Dog]并且[Dog,Cat,Hamster]会因为它们的置信度分数为 0.1而被组合在一起,然后[Dog,Cat,Hamster]会被删除,因为[Dog]是 的子集,[Dog,Cat,Hamster]因此规则[Dog,Cat,Hamster]是多余的。同样,[Dog,Cat]和[Dog,Cat,Hamster,Goldfish]两者都具有的置信度得分为0.5,和[Dog,Cat,Hamster,Goldfish]将被删除,因为[狗,猫]为[狗,猫,仓鼠,金鱼]的子集。我知道我需要做的第一件事是查看最小规则的置信度分数,将落在该分数置信度窗口内的所有规则组合在一起,然后删除所有属于较小规则超集的规则。然后我需要移动到下一个最小的规则并做同样的事情,直到所有规则都被减少/消除。我想知道在 Python/Pandas 中是否有一种简单的方法可以做到这一点?我对编码很陌生,所以我不知道这是否可能。
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

您可以按置信度值和规则长度对两列中的对值进行排序。然后我们将首先获得最低的 conf 分数,并且在具有相同 conf 分数的规则中,将首先出现最短的列表。我们使用“两指”方法迭代这个排序的规则/配置对。第一根手指是当前的规则/配置对。第二根手指移动,直到我们找到第一条规则,该规则要么是不相等的 conf 分数(例如,如果我们的第一根手指在 0.1 上,则为 0.5)或者如果该规则不是一个子集(例如,如果我们的第一根手指在上,则遇到 ['Hamster'] ['狗'])。当我们找到这样的规则/配置对时,我们附加我们第一根手指的规则/配置对,并将我们的第一根手指推进到我们刚刚处理的对。我们继续迭代,跳过符合我们删除标准的对,当我们发现不符合“删除”标准的对时,追加和推进。希望这是有道理的。


rules = [['Dog'],['Dog','Cat'],['Dog','Cat','Hamster','Goldfish'], ['Dog','Cat','Hamster']]

confs = [0.1, 0.5, 0.1, 0.5]


# sort by conf values and size of rules to put the shortest sub-rule in the front

ruleConfPairs = sorted(zip(rules, confs), key=lambda x: (x[1], len(x[0])))


# initialize iteration

new_rules = []

new_confs = []

current_rule = ruleConfPairs[0][0]

current_conf = ruleConfPairs[0][1]


for rule, conf in ruleConfPairs[1:]:

    if current_conf == conf and set(current_rule).issubset(rule):

        # skip (i.e. remove) pair if it has the same confidence value AND rule is a subset

        continue

    # append current rule/conf pair if either confidence score is not equal OR rule is not a subset

    new_rules.append(current_rule)

    new_confs.append(current_conf)

    # advance our pair

    current_rule = rule

    current_conf = conf


# make sure to append the last pair

new_rules.append(current_rule)

new_confs.append(current_conf)


print(new_rules)

print(new_confs)

输出:


[['Dog'], ['Dog', 'Cat']]

[0.1, 0.5]


查看完整回答
反对 回复 2021-11-09
  • 1 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信