是否有一种方法可以通过在给定数据集中的值的百分比窗口进行分组数据行,然后通过数据集进行迭代



我有一个来自某些关联规则挖掘的大型CSV文件。其中两个列是规则和置信度得分。

规则列包含不同长度的项目列表,例如

[[Dog],[Dog,Cat],[Dog,Cat,Hamster],[Dog,Cat,Hamster,Goldfish]]

置信分数列包含0到1之间的数字列表,例如

[0.1, 0.5, 0.1, 0.5]

我想根据规则值是否是其他规则值的子集删除冗余行,但我只想删除具有相似置信度分数的行(在信心窗口中,例如5%)。

在上面的示例中,将保留的行是[狗]和[狗,猫]。

[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]将被删除,因为[狗,猫]是[狗,猫,仓鼠,仓鼠,金鱼]的子集。

我知道我需要做的第一件事是查看最小规则的置信度评分,将所有规则归结在一起,这些规则属于该分数的置信窗口,然后删除所有是超级的规则较小的规则。然后,我需要进入下一个最小规则并执行相同的操作,直到所有规则都降低/stem。

我想知道有一种简单的方法可以在python/pandas中做到这一点吗?

我是编码的新手,所以我根本不知道这是否可以。

谢谢

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

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]

最新更新