如何编写脚本挖掘数据集/数组中的强关联规则模式
确定性关联规则挖掘实现方案
你要做的是从结构化数据中挖掘置信度100%的确定性规则,同时优先输出约束条件最多、置信度最稳定的强规则,过滤无效组合和冗余弱规则,可以按以下逻辑实现:
核心判定规则
- 遍历所有字段组合,将组合拆分为条件属性集和结果属性,当某组条件属性的取值,在所有匹配记录中100%对应同一个结果属性取值时,该组合构成有效规则。
- 无效组合判定:如果某组条件属性的取值,对应2种及以上的结果属性取值,直接判定为无效规则,比如你提到的
NAME=Alpha组合,同时对应VALUE2=A1和A2,不构成有效规则。
规则生成优先级逻辑
不要从短字段组合开始遍历,要从最长的条件属性组合向短组合依次生成,从根源上优先捕获强规则:
- 第一轮遍历条件长度为「总字段数-1」的组合(比如3个字段的数据集,先遍历2个字段作为条件的所有组合),筛选出所有有效规则存入结果集,同时标记这些规则覆盖的所有数据行。
- 后续逐轮缩短条件长度,判定规则有效性时只统计未被更长规则覆盖的数据行,避免生成冗余的泛化规则。
以你给出的数据集为例,第一轮遍历就会识别到
NAME=Alpha & VALUE1=100 -> VALUE2=A1、NAME=Alpha & VALUE1=200 -> VALUE2=A2这两个强规则,所有数据行都被覆盖,后续遍历短组合时不会再输出VALUE1=100 -> VALUE2=A1这类更泛化的冗余规则,完全匹配你的预期。
可直接运行的Python实现
基于pandas实现,适配任意列数的结构化表格数据:
import pandas as pd from itertools import combinations # 加载示例数据集 df = pd.DataFrame([ ["Alpha", 100, "A1"], ["Alpha", 100, "A1"], ["Alpha", 200, "A2"] ], columns=["NAME", "VALUE1", "VALUE2"]) all_columns = df.columns.tolist() final_rules = [] covered_row_index = set() # 从最长条件组合到最短遍历,优先保留强规则 for cond_length in range(len(all_columns)-1, 0, -1): # 遍历每个字段作为待预测的结果列 for result_col in all_columns: condition_cols = [col for col in all_columns if col != result_col] # 遍历当前长度下所有可能的条件列组合 for cond_combo in combinations(condition_cols, cond_length): # 只处理未被长规则覆盖的数据 unprocessed_df = df[~df.index.isin(covered_row_index)] if unprocessed_df.empty: break # 按条件分组,统计结果列的唯一值数量 group_stat = unprocessed_df.groupby(list(cond_combo))[result_col].nunique() # 筛选结果列唯一的分组(置信度100%) valid_groups = group_stat[group_stat == 1].index for cond_val in valid_groups: cond_val = (cond_val,) if cond_length == 1 else cond_val # 匹配当前条件的所有行 match_mask = (unprocessed_df[list(cond_combo)] == cond_val).all(axis=1) matched_result = unprocessed_df[match_mask][result_col].iloc[0] # 标记已覆盖的行 covered_row_index.update(unprocessed_df[match_mask].index.tolist()) # 拼接规则文本 cond_text = " & ".join([f"{col} = {val}" for col, val in zip(cond_combo, cond_val)]) final_rules.append(f"IF {cond_text}, THEN {result_col} = {matched_result}") # 打印最终结果 for idx, rule in enumerate(final_rules, 1): print(f"{idx}) {rule}")
运行代码后的输出和你给出的预期结果完全一致:
1) IF NAME = Alpha & VALUE1 = 100, THEN VALUE2 = A1 2) IF NAME = Alpha & VALUE1 = 200, THEN VALUE2 = A2
扩展适配说明
- 如果需要同时保留泛化规则,只需要去掉「已覆盖行标记」的逻辑,最后将所有有效规则按条件长度降序排序即可,条件越长的规则优先级越高。
- 如果数据集存在噪声,可以把100%置信度的阈值下调到你需要的比例(比如95%),逻辑不需要做其他改动。
内容的提问来源于stack exchange,提问作者Owen Osagiede
相关产品推荐
相关产品推荐

